AspNetCore/Http Instrumentation to leverage native Activity Status. (#3555)
This commit is contained in:
parent
d6e4d98d3f
commit
dd8809900a
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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`
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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"",
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
Loading…
Reference in New Issue