AspNetCore/Http Instrumentation to leverage native Activity Status. (#3555)

This commit is contained in:
Yun-Ting Lin 2022-08-10 12:51:17 -07:00 committed by GitHub
parent d6e4d98d3f
commit dd8809900a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 72 additions and 60 deletions

View File

@ -30,15 +30,15 @@ namespace OpenTelemetry.Trace
/// <param name="kind">The span kind.</param>
/// <param name="httpStatusCode">Http status code.</param>
/// <returns>Resolved span <see cref="Status"/> for the Http status code.</returns>
public static Status ResolveSpanStatusForHttpStatusCode(ActivityKind kind, int httpStatusCode)
public static ActivityStatusCode ResolveSpanStatusForHttpStatusCode(ActivityKind kind, int httpStatusCode)
{
var upperBound = kind == ActivityKind.Client ? 399 : 499;
if (httpStatusCode >= 100 && httpStatusCode <= upperBound)
{
return Status.Unset;
return ActivityStatusCode.Unset;
}
return Status.Error;
return ActivityStatusCode.Error;
}
}
}

View File

@ -2,6 +2,11 @@
## Unreleased
* Updated to use Activity native support from `System.Diagnostics.DiagnosticSource`
to set activity status.
([#3118](https://github.com/open-telemetry/opentelemetry-dotnet/issues/3118))
([#3555](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3555))
## 1.0.0-rc9.5
Released 2022-Aug-02

View File

@ -207,12 +207,12 @@ namespace OpenTelemetry.Instrumentation.AspNetCore.Implementation
{
AddGrpcAttributes(activity, grpcMethod, context);
}
else if (activity.GetStatus().StatusCode == StatusCode.Unset)
else if (activity.Status == ActivityStatusCode.Unset)
{
activity.SetStatus(SpanHelper.ResolveSpanStatusForHttpStatusCode(activity.Kind, response.StatusCode));
}
#else
if (activity.GetStatus().StatusCode == StatusCode.Unset)
if (activity.Status == ActivityStatusCode.Unset)
{
activity.SetStatus(SpanHelper.ResolveSpanStatusForHttpStatusCode(activity.Kind, response.StatusCode));
}
@ -298,7 +298,7 @@ namespace OpenTelemetry.Instrumentation.AspNetCore.Implementation
activity.RecordException(exc);
}
activity.SetStatus(Status.Error.WithDescription(exc.Message));
activity.SetStatus(ActivityStatusCode.Error, exc.Message);
try
{

View File

@ -2,6 +2,11 @@
## Unreleased
* Updated to use Activity native support from `System.Diagnostics.DiagnosticSource`
to set activity status.
([#3118](https://github.com/open-telemetry/opentelemetry-dotnet/issues/3118))
([#3555](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3555))
* Changed activity source name from `OpenTelemetry.HttpWebRequest`
to `OpenTelemetry.Instrumentation.Http.HttpWebRequest` for `HttpWebRequest`s
and from `OpenTelemetry.Instrumentation.Http`

View File

@ -165,22 +165,22 @@ namespace OpenTelemetry.Instrumentation.Http.Implementation
// requestTaskStatus is not null
_ = this.stopRequestStatusFetcher.TryFetch(payload, out var requestTaskStatus);
StatusCode currentStatusCode = activity.GetStatus().StatusCode;
ActivityStatusCode currentStatusCode = activity.Status;
if (requestTaskStatus != TaskStatus.RanToCompletion)
{
if (requestTaskStatus == TaskStatus.Canceled)
{
if (currentStatusCode == StatusCode.Unset)
if (currentStatusCode == ActivityStatusCode.Unset)
{
activity.SetStatus(Status.Error);
activity.SetStatus(ActivityStatusCode.Error);
}
}
else if (requestTaskStatus != TaskStatus.Faulted)
{
if (currentStatusCode == StatusCode.Unset)
if (currentStatusCode == ActivityStatusCode.Unset)
{
// Faults are handled in OnException and should already have a span.Status of Error w/ Description.
activity.SetStatus(Status.Error);
activity.SetStatus(ActivityStatusCode.Error);
}
}
}
@ -189,7 +189,7 @@ namespace OpenTelemetry.Instrumentation.Http.Implementation
{
activity.SetTag(SemanticConventions.AttributeHttpStatusCode, (int)response.StatusCode);
if (currentStatusCode == StatusCode.Unset)
if (currentStatusCode == ActivityStatusCode.Unset)
{
activity.SetStatus(SpanHelper.ResolveSpanStatusForHttpStatusCode(activity.Kind, (int)response.StatusCode));
}
@ -232,7 +232,7 @@ namespace OpenTelemetry.Instrumentation.Http.Implementation
if (exc is HttpRequestException)
{
activity.SetStatus(Status.Error.WithDescription(exc.Message));
activity.SetStatus(ActivityStatusCode.Error, exc.Message);
}
try

View File

@ -141,7 +141,9 @@ namespace OpenTelemetry.Instrumentation.Http.Implementation
return;
}
Status status;
ActivityStatusCode status;
string exceptionMessage = null;
if (exception is WebException wexc)
{
if (wexc.Response is HttpWebResponse response)
@ -156,7 +158,7 @@ namespace OpenTelemetry.Instrumentation.Http.Implementation
{
case WebExceptionStatus.Timeout:
case WebExceptionStatus.RequestCanceled:
status = Status.Error;
status = ActivityStatusCode.Error;
break;
case WebExceptionStatus.SendFailure:
case WebExceptionStatus.ConnectFailure:
@ -164,20 +166,23 @@ namespace OpenTelemetry.Instrumentation.Http.Implementation
case WebExceptionStatus.TrustFailure:
case WebExceptionStatus.ServerProtocolViolation:
case WebExceptionStatus.MessageLengthLimitExceeded:
status = Status.Error.WithDescription(exception.Message);
status = ActivityStatusCode.Error;
exceptionMessage = exception.Message;
break;
default:
status = Status.Error.WithDescription(exception.Message);
status = ActivityStatusCode.Error;
exceptionMessage = exception.Message;
break;
}
}
}
else
{
status = Status.Error.WithDescription(exception.Message);
status = ActivityStatusCode.Error;
exceptionMessage = exception.Message;
}
activity.SetStatus(status);
activity.SetStatus(status, exceptionMessage);
if (Options.RecordException)
{
activity.RecordException(exception);

View File

@ -86,10 +86,7 @@ namespace OpenTelemetry.Instrumentation.AspNetCore.Tests
var activity = exportedItems[0];
Assert.Equal(200, activity.GetTagValue(SemanticConventions.AttributeHttpStatusCode));
var status = activity.GetStatus();
Assert.Equal(status, Status.Unset);
Assert.Equal(ActivityStatusCode.Unset, activity.Status);
ValidateAspNetCoreActivity(activity, "/api/values");
}

View File

@ -75,6 +75,8 @@ namespace OpenTelemetry.Instrumentation.AspNetCore.Tests
Assert.Equal("GET", activity.GetTagValue(SemanticConventions.AttributeHttpMethod));
Assert.Equal("1.1", activity.GetTagValue(SemanticConventions.AttributeHttpFlavor));
Assert.Equal(200, activity.GetTagValue(SemanticConventions.AttributeHttpStatusCode));
Assert.True(activity.Status == ActivityStatusCode.Unset);
Assert.True(activity.StatusDescription is null);
}
public async void Dispose()

View File

@ -115,22 +115,22 @@ namespace OpenTelemetry.Instrumentation.AspNetCore.Tests
if (statusCode == 503)
{
Assert.Equal(Status.Error.StatusCode, activity.GetStatus().StatusCode);
Assert.Equal(ActivityStatusCode.Error, activity.Status);
}
else
{
Assert.Equal(Status.Unset, activity.GetStatus());
Assert.Equal(ActivityStatusCode.Unset, activity.Status);
}
// Instrumentation is not expected to set status description
// as the reason can be inferred from SemanticConventions.AttributeHttpStatusCode
if (!urlPath.EndsWith("exception"))
{
Assert.True(string.IsNullOrEmpty(activity.GetStatus().Description));
Assert.True(string.IsNullOrEmpty(activity.StatusDescription));
}
else
{
Assert.Equal("exception description", activity.GetStatus().Description);
Assert.Equal("exception description", activity.StatusDescription);
}
if (recordException)

View File

@ -110,13 +110,11 @@ namespace OpenTelemetry.Instrumentation.Http.Tests
Assert.Equal(tc.SpanName, activity.DisplayName);
// Assert.Equal(tc.SpanStatus, d[span.Status.CanonicalCode]);
Assert.Equal(
tc.SpanStatus,
activity.GetTagValue(SpanAttributeConstants.StatusCodeKey) as string);
Assert.Equal(tc.SpanStatus, activity.Status.ToString());
if (tc.SpanStatusHasDescription.HasValue)
{
var desc = activity.GetTagValue(SpanAttributeConstants.StatusDescriptionKey) as string;
var desc = activity.StatusDescription;
Assert.Equal(tc.SpanStatusHasDescription.Value, !string.IsNullOrEmpty(desc));
}
@ -194,7 +192,7 @@ namespace OpenTelemetry.Instrumentation.Http.Tests
""responseCode"": 399,
""responseExpected"": true,
""spanName"": ""HTTP GET"",
""spanStatus"": ""UNSET"",
""spanStatus"": ""Unset"",
""spanKind"": ""Client"",
""spanAttributes"": {
""http.scheme"": ""http"",

View File

@ -544,8 +544,8 @@ namespace OpenTelemetry.Instrumentation.Http.Tests
Assert.True(eventRecords.Records.TryDequeue(out KeyValuePair<string, Activity> exceptionEvent));
Assert.Equal("Stop", exceptionEvent.Key);
Assert.NotNull(activity.GetTagValue(SpanAttributeConstants.StatusCodeKey));
Assert.NotNull(activity.GetTagValue(SpanAttributeConstants.StatusDescriptionKey));
Assert.True(activity.Status != ActivityStatusCode.Unset);
Assert.NotNull(activity.StatusDescription);
}
/// <summary>
@ -583,8 +583,8 @@ namespace OpenTelemetry.Instrumentation.Http.Tests
Assert.True(eventRecords.Records.TryDequeue(out KeyValuePair<string, Activity> exceptionEvent));
Assert.Equal("Stop", exceptionEvent.Key);
Assert.NotNull(exceptionEvent.Value.GetTagValue(SpanAttributeConstants.StatusCodeKey));
Assert.Null(exceptionEvent.Value.GetTagValue(SpanAttributeConstants.StatusDescriptionKey));
Assert.True(exceptionEvent.Value.Status != ActivityStatusCode.Unset);
Assert.True(exceptionEvent.Value.StatusDescription == null);
}
/// <summary>
@ -622,8 +622,8 @@ namespace OpenTelemetry.Instrumentation.Http.Tests
Assert.True(eventRecords.Records.TryDequeue(out KeyValuePair<string, Activity> exceptionEvent));
Assert.Equal("Stop", exceptionEvent.Key);
Assert.NotNull(exceptionEvent.Value.GetTagValue(SpanAttributeConstants.StatusCodeKey));
Assert.NotNull(exceptionEvent.Value.GetTagValue(SpanAttributeConstants.StatusDescriptionKey));
Assert.True(exceptionEvent.Value.Status != ActivityStatusCode.Unset);
Assert.NotNull(exceptionEvent.Value.StatusDescription);
}
/// <summary>
@ -664,8 +664,8 @@ namespace OpenTelemetry.Instrumentation.Http.Tests
Assert.True(eventRecords.Records.TryDequeue(out KeyValuePair<string, Activity> exceptionEvent));
Assert.Equal("Stop", exceptionEvent.Key);
Assert.NotNull(exceptionEvent.Value.GetTagValue(SpanAttributeConstants.StatusCodeKey));
Assert.NotNull(exceptionEvent.Value.GetTagValue(SpanAttributeConstants.StatusDescriptionKey));
Assert.True(exceptionEvent.Value.Status != ActivityStatusCode.Unset);
Assert.NotNull(exceptionEvent.Value.StatusDescription);
}
[Fact]

View File

@ -4,7 +4,7 @@
"method": "GET",
"url": "http://{host}:{port}/",
"spanName": "HTTP GET",
"spanStatus": "UNSET",
"spanStatus": "Unset",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -20,7 +20,7 @@
"method": "POST",
"url": "http://{host}:{port}/",
"spanName": "HTTP POST",
"spanStatus": "UNSET",
"spanStatus": "Unset",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -37,7 +37,7 @@
"url": "http://{host}:{port}/path/to/resource/",
"responseCode": 200,
"spanName": "HTTP GET",
"spanStatus": "UNSET",
"spanStatus": "Unset",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -54,7 +54,7 @@
"url": "http://{host}:{port}/path/to/resource#fragment",
"responseCode": 200,
"spanName": "HTTP GET",
"spanStatus": "UNSET",
"spanStatus": "Unset",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -71,7 +71,7 @@
"url": "http://username:password@{host}:{port}/path/to/resource#fragment",
"responseCode": 200,
"spanName": "HTTP GET",
"spanStatus": "UNSET",
"spanStatus": "Unset",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -87,7 +87,7 @@
"method": "GET",
"url": "https://sdlfaldfjalkdfjlkajdflkajlsdjf.sdlkjafsdjfalfadslkf.com/",
"spanName": "HTTP GET",
"spanStatus": "ERROR",
"spanStatus": "Error",
"spanStatusHasDescription": true,
"responseExpected": false,
"recordException": false,
@ -104,7 +104,7 @@
"method": "GET",
"url": "https://sdlfaldfjalkdfjlkajdflkajlsdjf.sdlkjafsdjfalfadslkf.com/",
"spanName": "HTTP GET",
"spanStatus": "ERROR",
"spanStatus": "Error",
"spanStatusHasDescription": true,
"responseExpected": false,
"recordException": true,
@ -122,7 +122,7 @@
"url": "http://{host}:{port}/",
"responseCode": 200,
"spanName": "HTTP GET",
"spanStatus": "UNSET",
"spanStatus": "Unset",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -139,7 +139,7 @@
"url": "http://{host}:{port}/",
"responseCode": 200,
"spanName": "HTTP GET",
"spanStatus": "UNSET",
"spanStatus": "Unset",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -156,7 +156,7 @@
"url": "http://{host}:{port}/",
"responseCode": 399,
"spanName": "HTTP GET",
"spanStatus": "UNSET",
"spanStatus": "Unset",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -173,7 +173,7 @@
"url": "http://{host}:{port}/",
"responseCode": 400,
"spanName": "HTTP GET",
"spanStatus": "ERROR",
"spanStatus": "Error",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -190,7 +190,7 @@
"url": "http://{host}:{port}/",
"responseCode": 401,
"spanName": "HTTP GET",
"spanStatus": "ERROR",
"spanStatus": "Error",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -207,7 +207,7 @@
"url": "http://{host}:{port}/",
"responseCode": 403,
"spanName": "HTTP GET",
"spanStatus": "ERROR",
"spanStatus": "Error",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -224,7 +224,7 @@
"url": "http://{host}:{port}/",
"responseCode": 404,
"spanName": "HTTP GET",
"spanStatus": "ERROR",
"spanStatus": "Error",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -241,7 +241,7 @@
"url": "http://{host}:{port}/",
"responseCode": 429,
"spanName": "HTTP GET",
"spanStatus": "ERROR",
"spanStatus": "Error",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -258,7 +258,7 @@
"url": "http://{host}:{port}/",
"responseCode": 501,
"spanName": "HTTP GET",
"spanStatus": "ERROR",
"spanStatus": "Error",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -275,7 +275,7 @@
"url": "http://{host}:{port}/",
"responseCode": 503,
"spanName": "HTTP GET",
"spanStatus": "ERROR",
"spanStatus": "Error",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -292,7 +292,7 @@
"url": "http://{host}:{port}/",
"responseCode": 504,
"spanName": "HTTP GET",
"spanStatus": "ERROR",
"spanStatus": "Error",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -309,7 +309,7 @@
"url": "http://{host}:{port}/",
"responseCode": 600,
"spanName": "HTTP GET",
"spanStatus": "ERROR",
"spanStatus": "Error",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",
@ -326,7 +326,7 @@
"url": "http://{host}:{port}/",
"responseCode": 200,
"spanName": "HTTP GET",
"spanStatus": "UNSET",
"spanStatus": "Unset",
"responseExpected": true,
"spanAttributes": {
"http.scheme": "http",