Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion tracer/src/Datadog.Trace/Activity/OtlpHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ private static void AgentConvertSpan<TInner>(TInner activity, Span span)
// Fixup "version" tag
// Fallback to static instance if no tracer associated with the trace
var tracer = span.Context.TraceContext?.Tracer ?? Tracer.Instance;
if (tracer.Settings.ServiceVersion is null
if (tracer.PerTraceSettings.Settings.ServiceVersion is null
&& span.GetTag("service.version") is { Length: > 1 } otelServiceVersion)
{
span.SetTag(Tags.Version, otelServiceVersion);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ internal void TryReport(IResult result, bool blocked, int? status = null)

if (status is not null)
{
_span.SetHttpStatusCode(status.Value, isServer: true, Tracer.Instance.Settings);
_span.SetHttpStatusCode(status.Value, isServer: true, Tracer.Instance.CurrentTraceSettings.Settings);
}
}

Expand Down
22 changes: 12 additions & 10 deletions tracer/src/Datadog.Trace/AspNet/TracingHttpModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,14 +103,14 @@ private static string BuildResourceName(Tracer tracer, HttpRequest httpRequest)

internal static void AddHeaderTagsFromHttpResponse(HttpContext httpContext, Scope scope)
{
if (!Tracer.Instance.Settings.HeaderTags.IsNullOrEmpty() &&
if (!Tracer.Instance.CurrentTraceSettings.Settings.HeaderTags.IsNullOrEmpty() &&
httpContext != null &&
HttpRuntime.UsingIntegratedPipeline &&
_canReadHttpResponseHeaders)
{
try
{
scope.Span.SetHeaderTags(httpContext.Response.Headers.Wrap(), Tracer.Instance.Settings.HeaderTags, defaultTagPrefix: SpanContextPropagator.HttpResponseHeadersTagPrefix);
scope.Span.SetHeaderTags(httpContext.Response.Headers.Wrap(), Tracer.Instance.CurrentTraceSettings.Settings.HeaderTags, defaultTagPrefix: SpanContextPropagator.HttpResponseHeadersTagPrefix);
}
catch (PlatformNotSupportedException ex)
{
Expand Down Expand Up @@ -198,7 +198,7 @@ private void OnBeginRequest(object sender, EventArgs eventArgs)
? BuildResourceName(tracer, httpRequest)
: null;
scope.Span.DecorateWebServerSpan(resourceName: resourceName, httpMethod, host, url, userAgent, tags);
tracer.TracerManager.SpanContextPropagator.AddHeadersToSpanAsTags(scope.Span, headers, tracer.Settings.HeaderTags, defaultTagPrefix: SpanContextPropagator.HttpRequestHeadersTagPrefix);
tracer.TracerManager.SpanContextPropagator.AddHeadersToSpanAsTags(scope.Span, headers, tracer.CurrentTraceSettings.Settings.HeaderTags, defaultTagPrefix: SpanContextPropagator.HttpRequestHeadersTagPrefix);

tracer.TracerManager.SpanContextPropagator.AddBaggageToSpanAsTags(scope.Span, extractedContext.Baggage, tracer.Settings.BaggageTagKeys);

Expand Down Expand Up @@ -276,7 +276,8 @@ private void OnEndRequest(object sender, EventArgs eventArgs)
try
{
var tracer = Tracer.Instance;
if (!tracer.Settings.IsIntegrationEnabled(IntegrationId))
var settings = tracer.CurrentTraceSettings.Settings;
if (!settings.IsIntegrationEnabled(IntegrationId))
{
// integration disabled
return;
Expand Down Expand Up @@ -386,21 +387,21 @@ private void OnEndRequest(object sender, EventArgs eventArgs)
// add "http.status_code" tag to the root span
if (!rootSpan.HasHttpStatusCode())
{
rootSpan.SetHttpStatusCode(status, isServer: true, Tracer.Instance.Settings);
rootSpan.SetHttpStatusCode(status, isServer: true, settings);
AddHeaderTagsFromHttpResponse(app.Context, rootScope);
}

// also add "http.status_code" tag to the current span if it's not the root
if (currentSpan != rootSpan && !currentSpan.HasHttpStatusCode())
{
currentSpan.SetHttpStatusCode(status, isServer: true, Tracer.Instance.Settings);
currentSpan.SetHttpStatusCode(status, isServer: true, settings);
AddHeaderTagsFromHttpResponse(app.Context, scope);
}

// also add "http.status_code" tag to the inferred proxy span
if (proxyScope?.Span is { } proxySpan && proxySpan != rootSpan && !proxySpan.HasHttpStatusCode())
{
proxySpan.SetHttpStatusCode(status, isServer: true, Tracer.Instance.Settings);
proxySpan.SetHttpStatusCode(status, isServer: true, settings);
AddHeaderTagsFromHttpResponse(app.Context, proxyScope);
}

Expand Down Expand Up @@ -435,7 +436,8 @@ private void OnError(object sender, EventArgs eventArgs)
{
var tracer = Tracer.Instance;

if (!tracer.Settings.IsIntegrationEnabled(IntegrationId))
var settings = tracer.CurrentTraceSettings.Settings;
if (!settings.IsIntegrationEnabled(IntegrationId))
{
// integration disabled
return;
Expand Down Expand Up @@ -465,8 +467,8 @@ private void OnError(object sender, EventArgs eventArgs)
{
// in classic mode, the exception won't cause the correct status code to be set
// even though a 500 response will be sent ultimately, so set it manually
scope.Span.SetHttpStatusCode(500, isServer: true, tracer.Settings);
proxyScope?.Span.SetHttpStatusCode(500, isServer: true, tracer.Settings);
scope.Span.SetHttpStatusCode(500, isServer: true, settings);
proxyScope?.Span.SetHttpStatusCode(500, isServer: true, settings);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ protected override ITelemetryController CreateTelemetryController(TracerSettings
return TelemetryFactory.Instance.CreateCiVisibilityTelemetryController(settings, discoveryService, isAgentAvailable: !_settings.Agentless);
}

protected override IGitMetadataTagsProvider GetGitMetadataTagsProvider(TracerSettings settings, IScopeManager scopeManager, ITelemetryController telemetry)
protected override IGitMetadataTagsProvider GetGitMetadataTagsProvider(TracerSettings settings, MutableSettings initialMutableSettings, IScopeManager scopeManager, ITelemetryController telemetry)
{
return new CIGitMetadataTagsProvider(telemetry);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ internal static TResponse OnAsyncMethodEnd<TTarget, TResponse>(TTarget instance,
if (response.Instance is not null)
{
tags.RequestId = response.ResponseMetadata?.RequestId;
state.Scope.Span.SetHttpStatusCode((int)response.HttpStatusCode, false, Tracer.Instance.Settings);
state.Scope.Span.SetHttpStatusCode((int)response.HttpStatusCode, false, Tracer.Instance.CurrentTraceSettings.Settings);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ internal static CallTargetReturn<TResponseContext> OnMethodEnd<TTarget, TRespons
if (responseContext.Instance is not null && responseContext.Response is { } response)
{
tags.RequestId = response.ResponseMetadata?.RequestId;
state.Scope.Span.SetHttpStatusCode((int)response.HttpStatusCode, false, Tracer.Instance.Settings);
state.Scope.Span.SetHttpStatusCode((int)response.HttpStatusCode, false, Tracer.Instance.CurrentTraceSettings.Settings);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ internal static TResponse OnAsyncMethodEnd<TTarget, TResponse>(TTarget instance,
else
{
HttpContextHelper.AddHeaderTagsFromHttpResponse(HttpContext.Current, scope);
scope.Span.SetHttpStatusCode(responseMessage.DuckCast<HttpResponseMessageStruct>().StatusCode, isServer: true, Tracer.Instance.Settings);
scope.Span.SetHttpStatusCode(responseMessage.DuckCast<HttpResponseMessageStruct>().StatusCode, isServer: true, Tracer.Instance.CurrentTraceSettings.Settings);
scope.Dispose();
}

Expand All @@ -136,7 +136,7 @@ internal static TResponse OnAsyncMethodEnd<TTarget, TResponse>(TTarget instance,
private static void OnRequestCompletedAfterException(HttpContext httpContext, Scope scope, DateTimeOffset finishTime)
{
HttpContextHelper.AddHeaderTagsFromHttpResponse(httpContext, scope);
scope.Span.SetHttpStatusCode(httpContext.Response.StatusCode, isServer: true, Tracer.Instance.Settings);
scope.Span.SetHttpStatusCode(httpContext.Response.StatusCode, isServer: true, Tracer.Instance.CurrentTraceSettings.Settings);
scope.Span.Finish(finishTime);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ internal static Scope CreateScope(ControllerContextStruct controllerContext)

if (headers is not null)
{
tracer.TracerManager.SpanContextPropagator.AddHeadersToSpanAsTags(span, headers.Value, tracer.Settings.HeaderTags, SpanContextPropagator.HttpRequestHeadersTagPrefix);
tracer.TracerManager.SpanContextPropagator.AddHeadersToSpanAsTags(span, headers.Value, tracer.CurrentTraceSettings.Settings.HeaderTags, SpanContextPropagator.HttpRequestHeadersTagPrefix);
}

tracer.TracerManager.SpanContextPropagator.AddBaggageToSpanAsTags(span, extractedContext.Baggage, tracer.Settings.BaggageTagKeys);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ internal static Scope CreateScope(IHttpControllerContext controllerContext, out

if (headersCollection is not null)
{
tracer.TracerManager.SpanContextPropagator.AddHeadersToSpanAsTags(scope.Span, headersCollection.Value, tracer.Settings.HeaderTags, SpanContextPropagator.HttpRequestHeadersTagPrefix, request.Headers.UserAgent.ToString());
tracer.TracerManager.SpanContextPropagator.AddHeadersToSpanAsTags(scope.Span, headersCollection.Value, tracer.CurrentTraceSettings.Settings.HeaderTags, SpanContextPropagator.HttpRequestHeadersTagPrefix, request.Headers.UserAgent.ToString());
}

tracer.TracerManager.SpanContextPropagator.AddBaggageToSpanAsTags(scope.Span, extractedContext.Baggage, tracer.Settings.BaggageTagKeys);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,12 +94,12 @@ internal static CallTargetReturn<TResult> OnMethodEnd<TTarget, TResult>(TTarget
else
{
HttpContextHelper.AddHeaderTagsFromHttpResponse(httpContext, scope);
scope.Span.SetHttpStatusCode(httpContext.Response.StatusCode, isServer: true, Tracer.Instance.Settings);
scope.Span.SetHttpStatusCode(httpContext.Response.StatusCode, isServer: true, Tracer.Instance.CurrentTraceSettings.Settings);

if (proxyScope?.Span != null)
{
HttpContextHelper.AddHeaderTagsFromHttpResponse(httpContext, proxyScope);
proxyScope.Span.SetHttpStatusCode(httpContext.Response.StatusCode, isServer: true, Tracer.Instance.Settings);
proxyScope.Span.SetHttpStatusCode(httpContext.Response.StatusCode, isServer: true, Tracer.Instance.CurrentTraceSettings.Settings);
}

scope.Dispose();
Expand Down Expand Up @@ -129,12 +129,12 @@ private static void OnRequestCompletedAfterException(HttpContext httpContext, Sc
if (proxyScope?.Span != null)
{
HttpContextHelper.AddHeaderTagsFromHttpResponse(httpContext, proxyScope);
proxyScope.Span.SetHttpStatusCode(statusCode, isServer: true, Tracer.Instance.Settings);
proxyScope.Span.SetHttpStatusCode(statusCode, isServer: true, Tracer.Instance.CurrentTraceSettings.Settings);
proxyScope.Span.Finish(finishTime);
}

HttpContextHelper.AddHeaderTagsFromHttpResponse(httpContext, scope);
scope.Span.SetHttpStatusCode(statusCode, isServer: true, Tracer.Instance.Settings);
scope.Span.SetHttpStatusCode(statusCode, isServer: true, Tracer.Instance.CurrentTraceSettings.Settings);
scope.Span.Finish(finishTime);
}
catch (Exception ex)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,25 @@ internal static class HttpContextHelper

internal static void AddHeaderTagsFromHttpResponse(System.Web.HttpContext httpContext, Scope scope)
{
if (httpContext != null && HttpRuntime.UsingIntegratedPipeline && _canReadHttpResponseHeaders && !Tracer.Instance.Settings.HeaderTags.IsNullOrEmpty())
if (httpContext != null && HttpRuntime.UsingIntegratedPipeline && _canReadHttpResponseHeaders)
{
try
var headerTags = Tracer.Instance.CurrentTraceSettings.Settings.HeaderTags;
if (!headerTags.IsNullOrEmpty())
{
scope.Span.SetHeaderTags(httpContext.Response.Headers.Wrap(), Tracer.Instance.Settings.HeaderTags, defaultTagPrefix: SpanContextPropagator.HttpResponseHeadersTagPrefix);
}
catch (PlatformNotSupportedException ex)
{
// Despite the HttpRuntime.UsingIntegratedPipeline check, we can still fail to access response headers, for example when using Sitefinity: "This operation requires IIS integrated pipeline mode"
Log.Error(ex, "Unable to access response headers when creating header tags. Disabling for the rest of the application lifetime.");
_canReadHttpResponseHeaders = false;
}
catch (Exception ex)
{
Log.Error(ex, "Error extracting HTTP headers to create header tags.");
try
{
scope.Span.SetHeaderTags(httpContext.Response.Headers.Wrap(), headerTags, defaultTagPrefix: SpanContextPropagator.HttpResponseHeadersTagPrefix);
}
catch (PlatformNotSupportedException ex)
{
// Despite the HttpRuntime.UsingIntegratedPipeline check, we can still fail to access response headers, for example when using Sitefinity: "This operation requires IIS integrated pipeline mode"
Log.Error(ex, "Unable to access response headers when creating header tags. Disabling for the rest of the application lifetime.");
_canReadHttpResponseHeaders = false;
}
catch (Exception ex)
{
Log.Error(ex, "Error extracting HTTP headers to create header tags.");
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ internal enum GrpcStatusCode;
internal static CallTargetState OnMethodBegin<TTarget>(HttpResponse response, int httpStatusCode, GrpcStatusCode grpcStatusCode, string message)
{
var tracer = Tracer.Instance;
var settings = tracer.CurrentTraceSettings.Settings;
if (GrpcCoreApiVersionHelper.IsSupported
&& tracer.Settings.IsIntegrationEnabled(IntegrationId.Grpc)
&& settings.IsIntegrationEnabled(IntegrationId.Grpc)
&& tracer.ActiveScope?.Span is Span { Tags: GrpcServerTags } span)
{
// This code path is only called when there's a fundamental failure that isn't even processed
Expand All @@ -58,7 +59,7 @@ internal static CallTargetState OnMethodBegin<TTarget>(HttpResponse response, in
// There won't be any response metadata, as interceptors haven't executed, but we can grab
// the request metadata directly from the HttpRequest
var request = response.HttpContext.Request;
span.SetHeaderTags(new HeadersCollectionAdapter(request.Headers), tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.RequestMetadataTagPrefix);
span.SetHeaderTags(new HeadersCollectionAdapter(request.Headers), settings.GrpcTags, defaultTagPrefix: GrpcCommon.RequestMetadataTagPrefix);
}

return CallTargetState.GetDefault();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ public class HttpContextServerCallContextLogCallEndIntegration
internal static CallTargetState OnMethodBegin<TTarget>(TTarget instance)
{
var tracer = Tracer.Instance;
var settings = tracer.CurrentTraceSettings.Settings;
if (GrpcCoreApiVersionHelper.IsSupported
&& tracer.Settings.IsIntegrationEnabled(IntegrationId.Grpc)
&& settings.IsIntegrationEnabled(IntegrationId.Grpc)
&& tracer.ActiveScope?.Span is Span { Tags: GrpcServerTags } span)
{
var callContext = instance.DuckCast<HttpContextServerCallContextStruct>();
Expand All @@ -49,12 +50,12 @@ internal static CallTargetState OnMethodBegin<TTarget>(TTarget instance)

if (callContext.RequestHeaders is { Count: > 0 } requestMetadata)
{
span.SetHeaderTags(new MetadataHeadersCollection(requestMetadata), tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.RequestMetadataTagPrefix);
span.SetHeaderTags(new MetadataHeadersCollection(requestMetadata), settings.GrpcTags, defaultTagPrefix: GrpcCommon.RequestMetadataTagPrefix);
}

if (callContext.ResponseTrailers is { Count: > 0 } responseMetadata)
{
span.SetHeaderTags(new MetadataHeadersCollection(responseMetadata), tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix);
span.SetHeaderTags(new MetadataHeadersCollection(responseMetadata), settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix);
}
}

Expand Down
Loading
Loading