Skip to content

Commit d5a630f

Browse files
authored
[Instrumentation.Owin] Update to semantic convention v1.27.0 (open-telemetry#2028)
1 parent 5a4a747 commit d5a630f

File tree

5 files changed

+53
-39
lines changed

5 files changed

+53
-39
lines changed

src/OpenTelemetry.Instrumentation.Owin/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
## Unreleased
44

5+
* Updated activity tags to use new
6+
[semantic conventions](https://github.com/open-telemetry/semantic-conventions/tree/v1.27.0/docs/http/http-spans.md)
7+
attribute schema.
8+
([#2028](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/2028))
9+
510
* Updated OpenTelemetry core component version(s) to `1.9.0`.
611
([#1888](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/pull/1888))
712

src/OpenTelemetry.Instrumentation.Owin/Implementation/DiagnosticsMiddleware.cs

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ internal sealed class DiagnosticsMiddleware : OwinMiddleware
2020
private static readonly Func<IOwinRequest, string, IEnumerable<string>> OwinRequestHeaderValuesGetter
2121
= (request, name) => request.Headers.GetValues(name);
2222

23+
private static readonly RequestDataHelper RequestDataHelper = new(configureByHttpKnownMethodsEnvironmentalVariable: false);
24+
2325
/// <summary>
2426
/// Initializes a new instance of the <see cref="DiagnosticsMiddleware"/> class.
2527
/// </summary>
@@ -84,39 +86,26 @@ private static void BeginRequest(IOwinContext owinContext)
8486
{
8587
var request = owinContext.Request;
8688

87-
/*
88-
* Note: Display name is intentionally set to a low cardinality
89-
* value because OWIN does not expose any kind of
90-
* route/template. See:
91-
* https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md#name
92-
*/
93-
activity.DisplayName = request.Method switch
94-
{
95-
"GET" => "HTTP GET",
96-
"POST" => "HTTP POST",
97-
"PUT" => "HTTP PUT",
98-
"DELETE" => "HTTP DELETE",
99-
_ => $"HTTP {request.Method}",
100-
};
89+
// Note: Display name is intentionally set to a low cardinality
90+
// value because OWIN does not expose any kind of
91+
// route/template. See:
92+
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md#name
93+
RequestDataHelper.SetActivityDisplayName(activity, request.Method);
10194

10295
if (activity.IsAllDataRequested)
10396
{
104-
if (request.Uri.Port == 80 || request.Uri.Port == 443)
105-
{
106-
activity.SetTag(SemanticConventions.AttributeHttpHost, request.Uri.Host);
107-
}
108-
else
109-
{
110-
activity.SetTag(SemanticConventions.AttributeHttpHost, request.Uri.Host + ":" + request.Uri.Port);
111-
}
97+
RequestDataHelper.SetHttpMethodTag(activity, request.Method);
98+
activity.SetTag(SemanticConventions.AttributeServerAddress, request.Uri.Host);
99+
activity.SetTag(SemanticConventions.AttributeServerPort, request.Uri.Port);
100+
activity.SetTag(SemanticConventions.AttributeNetworkProtocolVersion, request.Protocol);
112101

113-
activity.SetTag(SemanticConventions.AttributeHttpMethod, request.Method);
114-
activity.SetTag(SemanticConventions.AttributeHttpTarget, request.Uri.AbsolutePath);
115-
activity.SetTag(SemanticConventions.AttributeHttpUrl, GetUriTagValueFromRequestUri(request.Uri, OwinInstrumentationActivitySource.Options.DisableUrlQueryRedaction));
102+
activity.SetTag(SemanticConventions.AttributeUrlPath, request.Uri.AbsolutePath);
103+
activity.SetTag(SemanticConventions.AttributeUrlQuery, request.Query);
104+
activity.SetTag(SemanticConventions.AttributeUrlScheme, owinContext.Request.Scheme);
116105

117106
if (request.Headers.TryGetValue("User-Agent", out string[] userAgent) && userAgent.Length > 0)
118107
{
119-
activity.SetTag(SemanticConventions.AttributeHttpUserAgent, userAgent[0]);
108+
activity.SetTag(SemanticConventions.AttributeUserAgentOriginal, userAgent[0]);
120109
}
121110

122111
try
@@ -163,7 +152,7 @@ private static void RequestEnd(IOwinContext owinContext, Exception? exception, l
163152
{
164153
activity.SetStatus(Status.Error);
165154

166-
if (OwinInstrumentationActivitySource.Options != null && OwinInstrumentationActivitySource.Options.RecordException)
155+
if (OwinInstrumentationActivitySource.Options?.RecordException == true)
167156
{
168157
activity.RecordException(exception);
169158
}
@@ -173,7 +162,7 @@ private static void RequestEnd(IOwinContext owinContext, Exception? exception, l
173162
activity.SetStatus(SpanHelper.ResolveActivityStatusForHttpStatusCode(activity.Kind, response.StatusCode));
174163
}
175164

176-
activity.SetTag(SemanticConventions.AttributeHttpStatusCode, response.StatusCode);
165+
activity.SetTag(SemanticConventions.AttributeHttpResponseStatusCode, response.StatusCode);
177166

178167
try
179168
{

src/OpenTelemetry.Instrumentation.Owin/OpenTelemetry.Instrumentation.Owin.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<Compile Include="$(RepoRoot)\src\Shared\Guard.cs" Link="Includes\Guard.cs" />
2121
<Compile Include="$(RepoRoot)\src\Shared\Options\*.cs" Link="Includes\Options\%(Filename).cs" />
2222
<Compile Include="$(RepoRoot)\src\Shared\RedactionHelper.cs" Link="Includes\RedactionHelper.cs" />
23+
<Compile Include="$(RepoRoot)\src\Shared\RequestDataHelper.cs" Link="Includes\RequestDataHelper.cs" />
2324
<Compile Include="$(RepoRoot)\src\Shared\SemanticConventions.cs" Link="Includes\SemanticConventions.cs"/>
2425
<Compile Include="$(RepoRoot)\src\Shared\SpanHelper.cs" Link="Includes\SpanHelper.cs" />
2526
</ItemGroup>

src/OpenTelemetry.Instrumentation.Owin/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,25 @@ OpenTelemetry instrumentation which listens to the OWIN diagnostic events.
5959
.Build();
6060
```
6161

62+
Following list of attributes are added by default on activity. See
63+
[http-spans](https://github.com/open-telemetry/semantic-conventions/tree/v1.27.0/docs/http/http-spans.md)
64+
for more details about each individual attribute:
65+
66+
* `http.request.method`
67+
* `http.request.method_original`
68+
* `http.response.status_code`
69+
* `network.protocol.version`
70+
* `user_agent.original`
71+
* `server.address`
72+
* `server.port`
73+
* `url.path`
74+
* `url.query` - By default, the values in the query component are replaced with
75+
the text `Redacted`. For example, `?key1=value1&key2=value2` becomes
76+
`?key1=Redacted&key2=Redacted`. You can disable this redaction by setting the
77+
environment variable
78+
`OTEL_DOTNET_EXPERIMENTAL_OWIN_DISABLE_URL_QUERY_REDACTION` to `true`.
79+
* `url.scheme`
80+
6281
#### Configure OpenTelemetry MeterProvider
6382

6483
Call the `AddOwinInstrumentation` `MeterProviderBuilder` extension to register

test/OpenTelemetry.Instrumentation.Owin.Tests/DiagnosticsMiddlewareTests.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -195,12 +195,12 @@ Owin has finished to inspect the activity status. */
195195
Activity activity = stoppedActivities[0];
196196
Assert.Equal(OwinInstrumentationActivitySource.IncomingRequestActivityName, activity.OperationName);
197197

198-
Assert.Equal(requestUri.Host + ":" + requestUri.Port, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpHost).Value);
199-
Assert.Equal("GET", activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpMethod).Value);
200-
Assert.Equal(requestUri.AbsolutePath, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpTarget).Value);
201-
Assert.Equal(requestUri.ToString(), activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpUrl).Value);
198+
Assert.Equal(requestUri.Host, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeServerAddress).Value);
199+
Assert.Equal(requestUri.Port, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeServerPort).Value);
200+
Assert.Equal("GET", activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpRequestMethod).Value);
201+
Assert.Equal(requestUri.AbsolutePath, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeUrlPath).Value);
202+
Assert.Equal(generateRemoteException ? 500 : 200, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpResponseStatusCode).Value);
202203

203-
Assert.Equal(generateRemoteException ? 500 : 200, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpStatusCode).Value);
204204
if (generateRemoteException)
205205
{
206206
Assert.Equal(Status.Error, activity.GetStatus());
@@ -248,13 +248,13 @@ Owin has finished to inspect the activity status. */
248248
{
249249
switch (tag.Key)
250250
{
251-
case SemanticConventions.AttributeHttpMethod:
251+
case SemanticConventions.AttributeHttpRequestMethod:
252252
Assert.Equal("GET", tag.Value);
253253
break;
254254
case SemanticConventions.AttributeHttpScheme:
255255
Assert.Equal(requestUri.Scheme, tag.Value);
256256
break;
257-
case SemanticConventions.AttributeHttpStatusCode:
257+
case SemanticConventions.AttributeHttpResponseStatusCode:
258258
Assert.Equal(generateRemoteException ? 500 : 200, tag.Value);
259259
break;
260260
}
@@ -343,10 +343,10 @@ Owin has finished to inspect the activity status. */
343343
Activity activity = stoppedActivities[0];
344344
Assert.Equal(OwinInstrumentationActivitySource.IncomingRequestActivityName, activity.OperationName);
345345

346-
Assert.Equal(requestUri.Host + ":" + requestUri.Port, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpHost).Value);
347-
Assert.Equal("GET", activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpMethod).Value);
348-
Assert.Equal(requestUri.AbsolutePath, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpTarget).Value);
349-
Assert.Equal(expectedRequestUri.ToString(), activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpUrl).Value);
346+
Assert.Equal(requestUri.Host, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeServerAddress).Value);
347+
Assert.Equal(requestUri.Port, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeServerPort).Value);
348+
Assert.Equal("GET", activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeHttpRequestMethod).Value);
349+
Assert.Equal(requestUri.AbsolutePath, activity.TagObjects.FirstOrDefault(t => t.Key == SemanticConventions.AttributeUrlPath).Value);
350350
}
351351
finally
352352
{

0 commit comments

Comments
 (0)