diff --git a/tracer/src/Datadog.Trace/Activity/OtlpHelpers.cs b/tracer/src/Datadog.Trace/Activity/OtlpHelpers.cs index 7a722fe3a59c..0ab68b7317e5 100644 --- a/tracer/src/Datadog.Trace/Activity/OtlpHelpers.cs +++ b/tracer/src/Datadog.Trace/Activity/OtlpHelpers.cs @@ -62,7 +62,7 @@ private static void AgentConvertSpan(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); diff --git a/tracer/src/Datadog.Trace/AppSec/Coordinator/SecurityReporter.cs b/tracer/src/Datadog.Trace/AppSec/Coordinator/SecurityReporter.cs index 9706c9aad2ff..b3bdd382449e 100644 --- a/tracer/src/Datadog.Trace/AppSec/Coordinator/SecurityReporter.cs +++ b/tracer/src/Datadog.Trace/AppSec/Coordinator/SecurityReporter.cs @@ -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); } } diff --git a/tracer/src/Datadog.Trace/AspNet/TracingHttpModule.cs b/tracer/src/Datadog.Trace/AspNet/TracingHttpModule.cs index 533dcd1f399c..bb88920b5da9 100644 --- a/tracer/src/Datadog.Trace/AspNet/TracingHttpModule.cs +++ b/tracer/src/Datadog.Trace/AspNet/TracingHttpModule.cs @@ -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) { @@ -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); @@ -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; @@ -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); } @@ -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; @@ -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); } } } diff --git a/tracer/src/Datadog.Trace/Ci/TestOptimizationTracerManagerFactory.cs b/tracer/src/Datadog.Trace/Ci/TestOptimizationTracerManagerFactory.cs index 957f53fda9b6..061dfb337828 100644 --- a/tracer/src/Datadog.Trace/Ci/TestOptimizationTracerManagerFactory.cs +++ b/tracer/src/Datadog.Trace/Ci/TestOptimizationTracerManagerFactory.cs @@ -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); } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AWS/SDK/RuntimePipelineInvokeAsyncIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AWS/SDK/RuntimePipelineInvokeAsyncIntegration.cs index cf37642728bf..a163209668d1 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AWS/SDK/RuntimePipelineInvokeAsyncIntegration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AWS/SDK/RuntimePipelineInvokeAsyncIntegration.cs @@ -94,7 +94,7 @@ internal static TResponse OnAsyncMethodEnd(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); } } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AWS/SDK/RuntimePipelineInvokeSyncIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AWS/SDK/RuntimePipelineInvokeSyncIntegration.cs index b94dc54011c1..5cab734d57e3 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AWS/SDK/RuntimePipelineInvokeSyncIntegration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AWS/SDK/RuntimePipelineInvokeSyncIntegration.cs @@ -94,7 +94,7 @@ internal static CallTargetReturn OnMethodEnd(TTarget instance, else { HttpContextHelper.AddHeaderTagsFromHttpResponse(HttpContext.Current, scope); - scope.Span.SetHttpStatusCode(responseMessage.DuckCast().StatusCode, isServer: true, Tracer.Instance.Settings); + scope.Span.SetHttpStatusCode(responseMessage.DuckCast().StatusCode, isServer: true, Tracer.Instance.CurrentTraceSettings.Settings); scope.Dispose(); } @@ -136,7 +136,7 @@ internal static TResponse OnAsyncMethodEnd(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); } } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AspNetMvcIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AspNetMvcIntegration.cs index 69868fea9e90..2884f63d41e7 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AspNetMvcIntegration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AspNetMvcIntegration.cs @@ -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); diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AspNetWebApi2Integration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AspNetWebApi2Integration.cs index a4c0ce0009b1..faf6d0f8ef04 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AspNetWebApi2Integration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AspNetWebApi2Integration.cs @@ -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); diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AsyncControllerActionInvoker_EndInvokeAction_Integration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AsyncControllerActionInvoker_EndInvokeAction_Integration.cs index ce0613f6999a..699b9371efd7 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AsyncControllerActionInvoker_EndInvokeAction_Integration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/AsyncControllerActionInvoker_EndInvokeAction_Integration.cs @@ -94,12 +94,12 @@ internal static CallTargetReturn OnMethodEnd(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(); @@ -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) diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/HttpContextHelper.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/HttpContextHelper.cs index b255a6abba1a..713b0f9ece26 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/HttpContextHelper.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/AspNet/HttpContextHelper.cs @@ -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."); + } } } } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcAspNetCoreServer/GrpcProtocolHelpersBuildHttpErrorResponseIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcAspNetCoreServer/GrpcProtocolHelpersBuildHttpErrorResponseIntegration.cs index 50a7e02f72ca..d1e7e8fe44e2 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcAspNetCoreServer/GrpcProtocolHelpersBuildHttpErrorResponseIntegration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcAspNetCoreServer/GrpcProtocolHelpersBuildHttpErrorResponseIntegration.cs @@ -47,8 +47,9 @@ internal enum GrpcStatusCode; internal static CallTargetState OnMethodBegin(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 @@ -58,7 +59,7 @@ internal static CallTargetState OnMethodBegin(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(); diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcAspNetCoreServer/HttpContextServerCallContextLogCallEndIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcAspNetCoreServer/HttpContextServerCallContextLogCallEndIntegration.cs index 6ee6314d759d..6a09d0ae84c1 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcAspNetCoreServer/HttpContextServerCallContextLogCallEndIntegration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcAspNetCoreServer/HttpContextServerCallContextLogCallEndIntegration.cs @@ -39,8 +39,9 @@ public class HttpContextServerCallContextLogCallEndIntegration internal static CallTargetState OnMethodBegin(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(); @@ -49,12 +50,12 @@ internal static CallTargetState OnMethodBegin(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); } } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcNetClient/GrpcDotNetClientCommon.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcNetClient/GrpcDotNetClientCommon.cs index 9dc27704cd45..8e8252216870 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcNetClient/GrpcDotNetClientCommon.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcDotNet/GrpcNetClient/GrpcDotNetClientCommon.cs @@ -25,7 +25,8 @@ internal static class GrpcDotNetClientCommon public static Scope? CreateClientSpan(Tracer tracer, TGrpcCall instance, TRequest requestMessage) where TRequest : IHttpRequestMessage { - if (!tracer.Settings.IsIntegrationEnabled(IntegrationId.Grpc) || instance is null) + var settings = tracer.CurrentTraceSettings.Settings; + if (!settings.IsIntegrationEnabled(IntegrationId.Grpc) || instance is null) { return null; } @@ -62,7 +63,7 @@ internal static class GrpcDotNetClientCommon if (grpcCall.Options.Headers is { Count: > 0 }) { var metadata = new MetadataHeadersCollection(grpcCall.Options.Headers); - span.SetHeaderTags(metadata, tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.RequestMetadataTagPrefix); + span.SetHeaderTags(metadata, settings.GrpcTags, defaultTagPrefix: GrpcCommon.RequestMetadataTagPrefix); } tracer.TracerManager.Telemetry.IntegrationGeneratedSpan(IntegrationId.Grpc); @@ -77,7 +78,8 @@ internal static class GrpcDotNetClientCommon public static void RecordResponseMetadataAndStatus(Tracer tracer, TGrpcCall instance, int grpcStatusCode, string errorMessage, Exception? ex) { - if (!tracer.Settings.IsIntegrationEnabled(IntegrationId.Grpc) + var settings = tracer.CurrentTraceSettings.Settings; + if (!settings.IsIntegrationEnabled(IntegrationId.Grpc) || instance is null || tracer.ActiveScope?.Span is not Span { Tags: GrpcClientTags } span) { @@ -90,20 +92,20 @@ public static void RecordResponseMetadataAndStatus(Tracer tracer, TGr if (grpcCall.HttpResponse is { Headers: { } responseHeaders }) { var metadata = new HttpResponseHeadersCollection(responseHeaders); - span.SetHeaderTags(metadata, tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); + span.SetHeaderTags(metadata, settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); } // Note that this will be null if they haven't read the response body yet, but we can't force that on users if (grpcCall.TryGetTrailers(out var trailers) && trailers is { Count: > 0 }) { var metadata = new MetadataHeadersCollection(trailers); - span.SetHeaderTags(metadata, tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); + span.SetHeaderTags(metadata, settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); } else if (grpcCall.HttpResponse is { } httpResponse && httpResponse.DuckCast().TrailingHeaders is { } trailingHeaders) { var metadata = new HttpResponseHeadersCollection(trailingHeaders); - span.SetHeaderTags(metadata, tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); + span.SetHeaderTags(metadata, settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); } GrpcCommon.RecordFinalClientSpanStatus(Tracer.Instance, grpcStatusCode, errorMessage, ex); diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/AsyncCallHandleFinishedInstrumentation.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/AsyncCallHandleFinishedInstrumentation.cs index cabc3a93fb63..83c51e4da9ef 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/AsyncCallHandleFinishedInstrumentation.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/AsyncCallHandleFinishedInstrumentation.cs @@ -34,7 +34,8 @@ public static class AsyncCallHandleFinishedInstrumentation internal static CallTargetState OnMethodBegin(TTarget instance, bool success, in TStatus clientSideStatus) { var tracer = Tracer.Instance; - if (GrpcCoreApiVersionHelper.IsSupported && tracer.Settings.IsIntegrationEnabled(IntegrationId.Grpc)) + var settings = tracer.CurrentTraceSettings.Settings; + if (GrpcCoreApiVersionHelper.IsSupported && settings.IsIntegrationEnabled(IntegrationId.Grpc)) { var asyncCall = instance.DuckCast(); @@ -46,14 +47,14 @@ internal static CallTargetState OnMethodBegin(TTarget instance { if (receivedStatus.Trailers is { Count: > 0 }) { - span.SetHeaderTags(new MetadataHeadersCollection(receivedStatus.Trailers), tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); + span.SetHeaderTags(new MetadataHeadersCollection(receivedStatus.Trailers), settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); } else if (asyncCall.ResponseHeadersAsync is { IsCompleted: true } task) { var metadata = task.DuckCast().Result; if (metadata?.Count > 0) { - span.SetHeaderTags(new MetadataHeadersCollection(metadata), tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); + span.SetHeaderTags(new MetadataHeadersCollection(metadata), settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); } } } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/AsyncCallHandleUnaryResponseInstrumentation.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/AsyncCallHandleUnaryResponseInstrumentation.cs index c22270145b8d..6d6e06c32a78 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/AsyncCallHandleUnaryResponseInstrumentation.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/AsyncCallHandleUnaryResponseInstrumentation.cs @@ -42,7 +42,8 @@ internal static CallTargetState OnMethodBegin.CreateFrom(clientSideStatus); @@ -53,14 +54,14 @@ internal static CallTargetState OnMethodBegin 0 }) { - span.SetHeaderTags(new MetadataHeadersCollection(receivedStatus.Trailers), tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); + span.SetHeaderTags(new MetadataHeadersCollection(receivedStatus.Trailers), settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); } else if (responseHeaders is not null) { var responseMetadata = responseHeaders.DuckCast(); if (responseMetadata.Count > 0) { - span.SetHeaderTags(new MetadataHeadersCollection(responseMetadata), tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); + span.SetHeaderTags(new MetadataHeadersCollection(responseMetadata), settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); } } } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/GrpcLegacyClientCommon.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/GrpcLegacyClientCommon.cs index f42d9c7153f6..5fcb1e452560 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/GrpcLegacyClientCommon.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Client/GrpcLegacyClientCommon.cs @@ -76,7 +76,7 @@ internal static class GrpcLegacyClientCommon span.Type = SpanTypes.Grpc; span.ResourceName = methodFullName; - span.SetHeaderTags(requestMetadataWrapper, tracer.Settings.GrpcTags, GrpcCommon.RequestMetadataTagPrefix); + span.SetHeaderTags(requestMetadataWrapper, tracer.CurrentTraceSettings.Settings.GrpcTags, GrpcCommon.RequestMetadataTagPrefix); scope = tracer.ActivateSpan(span); if (setSamplingPriority && existingSpanContext?.SamplingPriority is { } samplingPriority) @@ -98,7 +98,7 @@ internal static class GrpcLegacyClientCommon public static void InjectHeaders(Tracer tracer, TMethod method, ref TCallOptions callOptionsInstance) where TMethod : IMethod { - if (!tracer.Settings.IsIntegrationEnabled(IntegrationId.Grpc) || callOptionsInstance is null) + if (!tracer.CurrentTraceSettings.Settings.IsIntegrationEnabled(IntegrationId.Grpc) || callOptionsInstance is null) { return; } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/AsyncCallServerSendInitialMetadataAsyncInstrumentation.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/AsyncCallServerSendInitialMetadataAsyncInstrumentation.cs index 036425d01e15..5973ddc798e7 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/AsyncCallServerSendInitialMetadataAsyncInstrumentation.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/AsyncCallServerSendInitialMetadataAsyncInstrumentation.cs @@ -7,6 +7,7 @@ using System.ComponentModel; using Datadog.Trace.ClrProfiler.CallTarget; +using Datadog.Trace.Configuration; using Datadog.Trace.DuckTyping; using Datadog.Trace.ExtensionMethods; using Datadog.Trace.Tagging; @@ -37,7 +38,7 @@ internal static CallTargetState OnMethodBegin(TTarget instan var metadata = headers.DuckCast(); if (metadata.Count > 0) { - span.SetHeaderTags(new MetadataHeadersCollection(metadata), tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); + span.SetHeaderTags(new MetadataHeadersCollection(metadata), tracer.CurrentTraceSettings.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); } } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/AsyncCallServerSendStatusFromServerAsyncInstrumentation.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/AsyncCallServerSendStatusFromServerAsyncInstrumentation.cs index fa5eb3d27d0e..c9f34522117d 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/AsyncCallServerSendStatusFromServerAsyncInstrumentation.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/AsyncCallServerSendStatusFromServerAsyncInstrumentation.cs @@ -43,7 +43,7 @@ internal static CallTargetState OnMethodBegin(); if (metadata.Count > 0) { - span.SetHeaderTags(new MetadataHeadersCollection(metadata), tracer.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); + span.SetHeaderTags(new MetadataHeadersCollection(metadata), tracer.CurrentTraceSettings.Settings.GrpcTags, defaultTagPrefix: GrpcCommon.ResponseMetadataTagPrefix); } } } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/GrpcLegacyServerCommon.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/GrpcLegacyServerCommon.cs index 9aa3318b879c..69c04492fc27 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/GrpcLegacyServerCommon.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Grpc/GrpcLegacy/Server/GrpcLegacyServerCommon.cs @@ -49,7 +49,7 @@ internal class GrpcLegacyServerCommon if (metadata?.Count > 0) { - span.SetHeaderTags(new MetadataHeadersCollection(metadata), tracer.Settings.GrpcTags, GrpcCommon.RequestMetadataTagPrefix); + span.SetHeaderTags(new MetadataHeadersCollection(metadata), tracer.CurrentTraceSettings.Settings.GrpcTags, GrpcCommon.RequestMetadataTagPrefix); } tracer.TracerManager.Telemetry.IntegrationGeneratedSpan(IntegrationId.Grpc); diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/HttpClient/HttpMessageHandlerCommon.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/HttpClient/HttpMessageHandlerCommon.cs index 68b4a9a47983..fc640d609b69 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/HttpClient/HttpMessageHandlerCommon.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/HttpClient/HttpMessageHandlerCommon.cs @@ -25,7 +25,7 @@ public static CallTargetState OnMethodBegin(TTarget instance, var tracer = Tracer.Instance; var headers = requestMessage.Headers; - if (IsTracingEnabled(headers, implementationIntegrationId)) + if (IsTracingEnabled(tracer, headers, implementationIntegrationId)) { var scope = ScopeFactory.CreateOutboundHttpScope( tracer, @@ -64,7 +64,7 @@ public static TResponse OnMethodEnd(TTarget instance, TRespo { if (responseMessage.Instance is not null) { - scope.Span.SetHttpStatusCode(responseMessage.StatusCode, false, Tracer.Instance.Settings); + scope.Span.SetHttpStatusCode(responseMessage.StatusCode, false, Tracer.Instance.CurrentTraceSettings.Settings); } if (exception != null) @@ -80,9 +80,9 @@ public static TResponse OnMethodEnd(TTarget instance, TRespo return responseMessage; } - private static bool IsTracingEnabled(IRequestHeaders headers, IntegrationId? implementationIntegrationId) + private static bool IsTracingEnabled(Tracer tracer, IRequestHeaders headers, IntegrationId? implementationIntegrationId) { - if (implementationIntegrationId != null && !Tracer.Instance.Settings.IsIntegrationEnabled(implementationIntegrationId.Value)) + if (implementationIntegrationId != null && !tracer.CurrentTraceSettings.Settings.IsIntegrationEnabled(implementationIntegrationId.Value)) { return false; } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_EndGetResponseV9_Integration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_EndGetResponseV9_Integration.cs index 13f48b095da3..fb8d6f8ef0b0 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_EndGetResponseV9_Integration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_EndGetResponseV9_Integration.cs @@ -94,7 +94,7 @@ public class HttpWebRequest_EndGetResponseV9_Integration if (returnValue is HttpWebResponse response) { - scope.Span.SetHttpStatusCode((int)response.StatusCode, isServer: false, Tracer.Instance.Settings); + scope.Span.SetHttpStatusCode((int)response.StatusCode, isServer: false, Tracer.Instance.CurrentTraceSettings.Settings); scope.Dispose(); } else if (exception is WebException { Status: WebExceptionStatus.ProtocolError, Response: HttpWebResponse exceptionResponse }) @@ -103,7 +103,7 @@ public class HttpWebRequest_EndGetResponseV9_Integration // SetHttpStatusCode will mark the span with an error if the StatusCode is within the configured range scope.Span.SetExceptionTags(exception); - scope.Span.SetHttpStatusCode((int)exceptionResponse.StatusCode, isServer: false, Tracer.Instance.Settings); + scope.Span.SetHttpStatusCode((int)exceptionResponse.StatusCode, isServer: false, Tracer.Instance.CurrentTraceSettings.Settings); scope.Dispose(); } else diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_EndGetResponse_Integration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_EndGetResponse_Integration.cs index 2e0902f94e02..a58116a80e76 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_EndGetResponse_Integration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_EndGetResponse_Integration.cs @@ -108,7 +108,7 @@ internal static CallTargetReturn OnMethodEnd(TTarget if (returnValue is HttpWebResponse response) { - scope.Span.SetHttpStatusCode((int)response.StatusCode, isServer: false, Tracer.Instance.Settings); + scope.Span.SetHttpStatusCode((int)response.StatusCode, isServer: false, Tracer.Instance.CurrentTraceSettings.Settings); scope.Dispose(); } else if (exception is WebException { Status: WebExceptionStatus.ProtocolError, Response: HttpWebResponse exceptionResponse }) @@ -117,7 +117,7 @@ internal static CallTargetReturn OnMethodEnd(TTarget // SetHttpStatusCode will mark the span with an error if the StatusCode is within the configured range scope.Span.SetExceptionTags(exception); - scope.Span.SetHttpStatusCode((int)exceptionResponse.StatusCode, isServer: false, Tracer.Instance.Settings); + scope.Span.SetHttpStatusCode((int)exceptionResponse.StatusCode, isServer: false, Tracer.Instance.CurrentTraceSettings.Settings); scope.Dispose(); } else diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_GetResponse_Integration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_GetResponse_Integration.cs index cd53b0bc7090..5d92804d511b 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_GetResponse_Integration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/HttpWebRequest_GetResponse_Integration.cs @@ -63,7 +63,7 @@ internal static CallTargetReturn OnMethodEnd(TTarget { if (returnValue is HttpWebResponse response) { - state.Scope.Span.SetHttpStatusCode((int)response.StatusCode, false, Tracer.Instance.Settings); + state.Scope.Span.SetHttpStatusCode((int)response.StatusCode, false, Tracer.Instance.CurrentTraceSettings.Settings); state.Scope.Dispose(); } else if (exception is WebException { Status: WebExceptionStatus.ProtocolError, Response: HttpWebResponse exceptionResponse }) @@ -72,7 +72,7 @@ internal static CallTargetReturn OnMethodEnd(TTarget // SetHttpStatusCode will mark the span with an error if the StatusCode is within the configured range state.Scope.Span.SetExceptionTags(exception); - state.Scope.Span.SetHttpStatusCode((int)exceptionResponse.StatusCode, false, Tracer.Instance.Settings); + state.Scope.Span.SetHttpStatusCode((int)exceptionResponse.StatusCode, false, Tracer.Instance.CurrentTraceSettings.Settings); state.Scope.Dispose(); } else diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/WebRequest_GetResponseAsync_Integration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/WebRequest_GetResponseAsync_Integration.cs index 33f44bf5af58..3570a92539f9 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/WebRequest_GetResponseAsync_Integration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Http/WebRequest/WebRequest_GetResponseAsync_Integration.cs @@ -66,7 +66,7 @@ internal static TReturn OnAsyncMethodEnd(TTarget instance, TRe Tracer tracer = Tracer.Instance; if (returnValue is HttpWebResponse response) { - state.Scope.Span.SetHttpStatusCode((int)response.StatusCode, false, tracer.Settings); + state.Scope.Span.SetHttpStatusCode((int)response.StatusCode, false, tracer.CurrentTraceSettings.Settings); state.Scope.Dispose(); } else if (exception is WebException { Status: WebExceptionStatus.ProtocolError, Response: HttpWebResponse exceptionResponse }) @@ -75,7 +75,7 @@ internal static TReturn OnAsyncMethodEnd(TTarget instance, TRe // SetHttpStatusCode will mark the span with an error if the StatusCode is within the configured range state.Scope.Span.SetExceptionTags(exception); - state.Scope.Span.SetHttpStatusCode((int)exceptionResponse.StatusCode, false, tracer.Settings); + state.Scope.Span.SetHttpStatusCode((int)exceptionResponse.StatusCode, false, tracer.CurrentTraceSettings.Settings); state.Scope.Dispose(); } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Kafka/KafkaConsumerConsumeIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Kafka/KafkaConsumerConsumeIntegration.cs index 603458b81f85..e4baed0dd844 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Kafka/KafkaConsumerConsumeIntegration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Kafka/KafkaConsumerConsumeIntegration.cs @@ -74,7 +74,7 @@ internal static CallTargetReturn OnMethodEnd(TTar consumeResult.Offset, consumeResult.Message); - if (!Tracer.Instance.Settings.KafkaCreateConsumerScopeEnabled) + if (!Tracer.Instance.CurrentTraceSettings.Settings.KafkaCreateConsumerScopeEnabled) { // Close and dispose the scope immediately scope.DisposeWithException(exception); diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Kafka/KafkaHelper.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Kafka/KafkaHelper.cs index 1fc873f87540..a58055af0736 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Kafka/KafkaHelper.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Kafka/KafkaHelper.cs @@ -257,7 +257,7 @@ private static long GetMessageSize(T message) pathwayContext); message?.Headers?.Remove(DataStreamsPropagationHeaders.TemporaryBase64PathwayContext); // remove eventual junk - if (!tracer.Settings.KafkaCreateConsumerScopeEnabled && message?.Headers is not null && span.Context.PathwayContext != null) + if (!tracer.CurrentTraceSettings.Settings.KafkaCreateConsumerScopeEnabled && message?.Headers is not null && span.Context.PathwayContext != null) { // write the _new_ pathway (the "consume" checkpoint that we just set above) to the headers as a way to pass its value to an eventual // call to SpanContextExtractor.Extract by a user who'd like to re-pair pathways after a batch consume. @@ -279,8 +279,9 @@ internal static void CloseConsumerScope(Tracer tracer) { try { - if (!tracer.Settings.IsIntegrationEnabled(KafkaConstants.IntegrationId) - || !tracer.Settings.KafkaCreateConsumerScopeEnabled) + var settings = tracer.CurrentTraceSettings.Settings; + if (!settings.IsIntegrationEnabled(KafkaConstants.IntegrationId) + || !settings.KafkaCreateConsumerScopeEnabled) { // integration disabled, skip this trace return; diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/ILogger/LogsInjection/DatadogLoggingScope.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/ILogger/LogsInjection/DatadogLoggingScope.cs index d93b825d4121..794714154d37 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/ILogger/LogsInjection/DatadogLoggingScope.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/ILogger/LogsInjection/DatadogLoggingScope.cs @@ -29,9 +29,11 @@ public DatadogLoggingScope() internal DatadogLoggingScope(Tracer tracer) { _tracer = tracer; - _service = tracer.DefaultServiceName ?? string.Empty; - _env = tracer.Settings.Environment ?? string.Empty; - _version = tracer.Settings.ServiceVersion ?? string.Empty; + // TODO: Subscribe to changes in settings + var mutableSettings = tracer.CurrentTraceSettings.Settings; + _service = mutableSettings.DefaultServiceName; + _env = mutableSettings.Environment ?? string.Empty; + _version = mutableSettings.ServiceVersion ?? string.Empty; _use128Bits = _tracer.Settings.TraceId128BitLoggingEnabled; _cachedFormat = string.Format( diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/ILogger/LogsInjection/LoggerIntegrationCommon.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/ILogger/LogsInjection/LoggerIntegrationCommon.cs index 33a78d311608..cf56d5f8ae4a 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/ILogger/LogsInjection/LoggerIntegrationCommon.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/ILogger/LogsInjection/LoggerIntegrationCommon.cs @@ -13,12 +13,14 @@ internal static class LoggerIntegrationCommon public const string IntegrationName = nameof(Configuration.IntegrationId.ILogger); private const IntegrationId IntegrationId = Configuration.IntegrationId.ILogger; + // TODO: Subscribe to changes in settings private static readonly DatadogLoggingScope DatadogScope = new(); public static void AddScope(Tracer tracer, TAction callback, TState state) { - if (tracer.Settings.LogsInjectionEnabled - && tracer.Settings.IsIntegrationEnabled(IntegrationId) + var settings = tracer.CurrentTraceSettings.Settings; + if (settings.LogsInjectionEnabled + && settings.IsIntegrationEnabled(IntegrationId) && callback is Action foreachCallback) { foreachCallback.Invoke(DatadogScope, state); diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/Log4Net/LogsInjection/AppenderAttachedImplIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/Log4Net/LogsInjection/AppenderAttachedImplIntegration.cs index d0b390b13e2a..43fea86eca66 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/Log4Net/LogsInjection/AppenderAttachedImplIntegration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/Log4Net/LogsInjection/AppenderAttachedImplIntegration.cs @@ -39,12 +39,13 @@ internal static CallTargetState OnMethodBegin(TTarget in { var tracer = Tracer.Instance; - if (tracer.Settings.LogsInjectionEnabled && + var mutableSettings = tracer.CurrentTraceSettings.Settings; + if (mutableSettings.LogsInjectionEnabled && !loggingEvent.Properties.Contains(CorrelationIdentifier.ServiceKey)) { - loggingEvent.Properties[CorrelationIdentifier.ServiceKey] = tracer.DefaultServiceName ?? string.Empty; - loggingEvent.Properties[CorrelationIdentifier.VersionKey] = tracer.Settings.ServiceVersion ?? string.Empty; - loggingEvent.Properties[CorrelationIdentifier.EnvKey] = tracer.Settings.Environment ?? string.Empty; + loggingEvent.Properties[CorrelationIdentifier.ServiceKey] = mutableSettings.DefaultServiceName; + loggingEvent.Properties[CorrelationIdentifier.VersionKey] = mutableSettings.ServiceVersion ?? string.Empty; + loggingEvent.Properties[CorrelationIdentifier.EnvKey] = mutableSettings.Environment ?? string.Empty; if (tracer.DistributedSpanContext is { } context && LogContext.TryGetValues(context, out var traceId, out var spanId, tracer.Settings.TraceId128BitLoggingEnabled)) diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryActivateLoggingConfigurationInstrumentation.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryActivateLoggingConfigurationInstrumentation.cs index df5dd466bd58..56b08233c2d0 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryActivateLoggingConfigurationInstrumentation.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryActivateLoggingConfigurationInstrumentation.cs @@ -40,7 +40,7 @@ internal static CallTargetState OnMethodBegin(TTarget instance return CallTargetState.GetDefault(); } - if (tracerManager.Settings.LogsInjectionEnabled) + if (tracerManager.PerTraceSettings.Settings.LogsInjectionEnabled) { LogsInjectionHelper.ConfigureLogsInjectionForLoggerConfiguration(configuration); } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryBuildLoggerConfiguration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryBuildLoggerConfiguration.cs index 4bc7330ff75f..c3e413178ecc 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryBuildLoggerConfiguration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryBuildLoggerConfiguration.cs @@ -36,7 +36,8 @@ internal static CallTargetState OnMethodBegin(TTarget { var tracerManager = TracerManager.Instance; - if (!tracerManager.Settings.LogsInjectionEnabled && + var logsInjectionEnabled = tracerManager.PerTraceSettings.Settings.LogsInjectionEnabled; + if (!logsInjectionEnabled && !tracerManager.DirectLogSubmission.Settings.IsIntegrationEnabled(IntegrationId.NLog)) { return CallTargetState.GetDefault(); @@ -55,7 +56,7 @@ internal static CallTargetState OnMethodBegin(TTarget // we don't want to do logs injection with our custom configuration that we create as there won't be any targets var alreadyAddedOurTarget = false; - if (tracerManager.Settings.LogsInjectionEnabled) + if (logsInjectionEnabled) { LogsInjectionHelper.ConfigureLogsInjectionForLoggingRules(loggingRules, out alreadyAddedOurTarget); } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryGetConfigurationForLoggerInstrumentation.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryGetConfigurationForLoggerInstrumentation.cs index b3798ee4bf17..018a554ba361 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryGetConfigurationForLoggerInstrumentation.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LogFactoryGetConfigurationForLoggerInstrumentation.cs @@ -56,7 +56,8 @@ public static CallTargetState OnMethodBegin(TTar { var tracerManager = TracerManager.Instance; - if (!tracerManager.Settings.LogsInjectionEnabled && + var logsInjectionEnabled = tracerManager.PerTraceSettings.Settings.LogsInjectionEnabled; + if (!logsInjectionEnabled && !tracerManager.DirectLogSubmission.Settings.IsIntegrationEnabled(IntegrationId.NLog)) { return CallTargetState.GetDefault(); @@ -84,7 +85,7 @@ public static CallTargetState OnMethodBegin(TTar } // we don't want to do logs injection with our custom configuration that we create as there won't be any targets - if (tracerManager.Settings.LogsInjectionEnabled && configuration is not null) + if (logsInjectionEnabled && configuration is not null) { LogsInjectionHelper.ConfigureLogsInjectionForLoggerConfiguration(configuration); } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LoggingConfigurationFileLoaderLoadInstrumentation.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LoggingConfigurationFileLoaderLoadInstrumentation.cs index e69d4a57f98e..292b6c73822c 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LoggingConfigurationFileLoaderLoadInstrumentation.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/DirectSubmission/LoggingConfigurationFileLoaderLoadInstrumentation.cs @@ -51,7 +51,7 @@ public class LoggingConfigurationFileLoaderLoadInstrumentation // If we aren't doing logs injection or direct log submission, we can return null, it doesn't matter var tracer = Tracer.Instance; - if (!tracer.Settings.LogsInjectionEnabled && + if (!tracer.CurrentTraceSettings.Settings.LogsInjectionEnabled && !tracer.TracerManager.DirectLogSubmission.Settings.IsIntegrationEnabled(IntegrationId.NLog)) { return new CallTargetReturn(returnValue); diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/DiagnosticContextHelper.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/DiagnosticContextHelper.cs index af0f0f1962e4..3c316e82b4a9 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/DiagnosticContextHelper.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/DiagnosticContextHelper.cs @@ -118,6 +118,7 @@ private static KeyValuePair[] CreateEntriesList(Tracer tracer, o { hasTraceIds = false; + var mutableSettings = tracer.CurrentTraceSettings.Settings; if (tracer.DistributedSpanContext is { } context && LogContext.TryGetValues(context, out var traceId, out var spanId, tracer.Settings.TraceId128BitLoggingEnabled)) { @@ -125,9 +126,9 @@ private static KeyValuePair[] CreateEntriesList(Tracer tracer, o return [ - new KeyValuePair(CorrelationIdentifier.ServiceKey, tracer.DefaultServiceName ?? string.Empty), - new KeyValuePair(CorrelationIdentifier.VersionKey, tracer.Settings.ServiceVersion ?? string.Empty), - new KeyValuePair(CorrelationIdentifier.EnvKey, tracer.Settings.Environment ?? string.Empty), + new KeyValuePair(CorrelationIdentifier.ServiceKey, mutableSettings.DefaultServiceName), + new KeyValuePair(CorrelationIdentifier.VersionKey, mutableSettings.ServiceVersion ?? string.Empty), + new KeyValuePair(CorrelationIdentifier.EnvKey, mutableSettings.Environment ?? string.Empty), new KeyValuePair(CorrelationIdentifier.TraceIdKey, traceId), new KeyValuePair(CorrelationIdentifier.SpanIdKey, spanId) ]; @@ -135,9 +136,9 @@ private static KeyValuePair[] CreateEntriesList(Tracer tracer, o return [ - new KeyValuePair(CorrelationIdentifier.ServiceKey, tracer.DefaultServiceName ?? string.Empty), - new KeyValuePair(CorrelationIdentifier.VersionKey, tracer.Settings.ServiceVersion ?? string.Empty), - new KeyValuePair(CorrelationIdentifier.EnvKey, tracer.Settings.Environment ?? string.Empty) + new KeyValuePair(CorrelationIdentifier.ServiceKey, mutableSettings.DefaultServiceName), + new KeyValuePair(CorrelationIdentifier.VersionKey, mutableSettings.ServiceVersion ?? string.Empty), + new KeyValuePair(CorrelationIdentifier.EnvKey, mutableSettings.Environment ?? string.Empty) ]; } diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/LoggerImplWriteIntegrationV4.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/LoggerImplWriteIntegrationV4.cs index fc6e4208d6b4..fc01a7b12ed4 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/LoggerImplWriteIntegrationV4.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/LoggerImplWriteIntegrationV4.cs @@ -42,7 +42,7 @@ internal static CallTargetState OnMethodBegin.Mdlc is { } mdlc) { diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/LoggerImplWriteIntegrationV5.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/LoggerImplWriteIntegrationV5.cs index 1be92e516139..e286a4485425 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/LoggerImplWriteIntegrationV5.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/NLog/LogsInjection/LoggerImplWriteIntegrationV5.cs @@ -42,7 +42,7 @@ internal static CallTargetState OnMethodBegin.ScopeContext is { } scopeContext) { diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/Serilog/LogsInjection/LoggerDispatchInstrumentation.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/Serilog/LogsInjection/LoggerDispatchInstrumentation.cs index fcc8cbc52542..857b71a808d5 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/Serilog/LogsInjection/LoggerDispatchInstrumentation.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Logging/Serilog/LogsInjection/LoggerDispatchInstrumentation.cs @@ -48,12 +48,13 @@ internal static CallTargetState OnMethodBegin(TTarget instan { var tracer = Tracer.Instance; - if (tracer.Settings.LogsInjectionEnabled) + var mutableSettings = tracer.CurrentTraceSettings.Settings; + if (mutableSettings.LogsInjectionEnabled) { var dict = loggingEvent.DuckCast().Properties; - AddPropertyIfAbsent(dict, CorrelationIdentifier.SerilogServiceKey, tracer.DefaultServiceName); - AddPropertyIfAbsent(dict, CorrelationIdentifier.SerilogVersionKey, tracer.Settings.ServiceVersion); - AddPropertyIfAbsent(dict, CorrelationIdentifier.SerilogEnvKey, tracer.Settings.Environment); + AddPropertyIfAbsent(dict, CorrelationIdentifier.SerilogServiceKey, mutableSettings.DefaultServiceName); + AddPropertyIfAbsent(dict, CorrelationIdentifier.SerilogVersionKey, mutableSettings.ServiceVersion); + AddPropertyIfAbsent(dict, CorrelationIdentifier.SerilogEnvKey, mutableSettings.Environment); if (tracer.DistributedSpanContext is { } context && LogContext.TryGetValues(context, out var traceId, out var spanId, tracer.Settings.TraceId128BitLoggingEnabled)) diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Remoting/Client/HttpReceiveAndProcessIntegration.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Remoting/Client/HttpReceiveAndProcessIntegration.cs index ebcea4674ec2..1dee35576366 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Remoting/Client/HttpReceiveAndProcessIntegration.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Remoting/Client/HttpReceiveAndProcessIntegration.cs @@ -66,7 +66,7 @@ internal static CallTargetReturn OnMethodEnd(TTarget instance, Exceptio { if (state.Scope is not null && state.State is HttpWebResponse response) { - state.Scope.Span.SetHttpStatusCode((int)response.StatusCode, false, Tracer.Instance.Settings); + state.Scope.Span.SetHttpStatusCode((int)response.StatusCode, false, Tracer.Instance.CurrentTraceSettings.Settings); } return CallTargetReturn.GetDefault(); diff --git a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Wcf/WcfCommon.cs b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Wcf/WcfCommon.cs index e4ea79f0015f..54f815b1850c 100644 --- a/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Wcf/WcfCommon.cs +++ b/tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Wcf/WcfCommon.cs @@ -173,7 +173,7 @@ internal class WcfCommon if (headers is not null) { var headerTagsProcessor = new SpanContextPropagator.SpanTagHeaderTagProcessor(span); - tracer.TracerManager.SpanContextPropagator.ExtractHeaderTags(ref headerTagsProcessor, headers.Value, tracer.Settings.HeaderTags!, SpanContextPropagator.HttpRequestHeadersTagPrefix); + tracer.TracerManager.SpanContextPropagator.ExtractHeaderTags(ref headerTagsProcessor, headers.Value, tracer.CurrentTraceSettings.Settings.HeaderTags!, SpanContextPropagator.HttpRequestHeadersTagPrefix); } tags.SetAnalyticsSampleRate(IntegrationId, tracer.Settings, enabledWithGlobalSetting: true); diff --git a/tracer/src/Datadog.Trace/Configuration/GitMetadataTagsProvider.cs b/tracer/src/Datadog.Trace/Configuration/GitMetadataTagsProvider.cs index 2f503fc93a2c..cbd16f2b0cf4 100644 --- a/tracer/src/Datadog.Trace/Configuration/GitMetadataTagsProvider.cs +++ b/tracer/src/Datadog.Trace/Configuration/GitMetadataTagsProvider.cs @@ -21,13 +21,18 @@ internal class GitMetadataTagsProvider : IGitMetadataTagsProvider { private readonly ITelemetryController _telemetry; private readonly TracerSettings _immutableTracerSettings; + private readonly string? _gitCommitSha; + private readonly string? _gitRepositoryUrl; private readonly IScopeManager _scopeManager; private GitMetadata? _cachedGitTags = null; private int _tryCount = 0; - public GitMetadataTagsProvider(TracerSettings immutableTracerSettings, IScopeManager scopeManager, ITelemetryController telemetry) + public GitMetadataTagsProvider(TracerSettings immutableTracerSettings, MutableSettings settings, IScopeManager scopeManager, ITelemetryController telemetry) { _immutableTracerSettings = immutableTracerSettings; + // These never change, even though they are exposed on MutableSettings, so we can safely grab them once here + _gitCommitSha = settings.GitCommitSha; + _gitRepositoryUrl = settings.GitRepositoryUrl; _scopeManager = scopeManager; _telemetry = telemetry; } @@ -65,14 +70,14 @@ public bool TryExtractGitMetadata([NotNullWhen(true)] out GitMetadata? gitMetada // Get the tag from configuration. These may originate from the DD_GIT_REPOSITORY_URL and DD_GIT_COMMIT_SHA environment variables, // but if those were not available, they may have been extracted from the DD_TAGS environment variable. - if (!string.IsNullOrWhiteSpace(_immutableTracerSettings.GitCommitSha)) + if (!StringUtil.IsNullOrWhiteSpace(_gitCommitSha)) { - gitCommitSha = _immutableTracerSettings.GitCommitSha!; + gitCommitSha = _gitCommitSha; } - if (!string.IsNullOrWhiteSpace(_immutableTracerSettings.GitRepositoryUrl)) + if (!StringUtil.IsNullOrWhiteSpace(_gitRepositoryUrl)) { - gitRespositoryUrl = _immutableTracerSettings.GitRepositoryUrl!; + gitRespositoryUrl = _gitRepositoryUrl; } if (gitCommitSha is not null && gitRespositoryUrl is not null) diff --git a/tracer/src/Datadog.Trace/Configuration/PerTraceSettings.cs b/tracer/src/Datadog.Trace/Configuration/PerTraceSettings.cs index a78eb474edd9..927f803b555e 100644 --- a/tracer/src/Datadog.Trace/Configuration/PerTraceSettings.cs +++ b/tracer/src/Datadog.Trace/Configuration/PerTraceSettings.cs @@ -16,11 +16,10 @@ internal class PerTraceSettings { private readonly ConcurrentDictionary _serviceNameCache = new(); - public PerTraceSettings(ITraceSampler? traceSampler, ISpanSampler? spanSampler, IReadOnlyDictionary serviceNames, NamingSchema schema, MutableSettings mutableSettings) + public PerTraceSettings(ITraceSampler? traceSampler, ISpanSampler? spanSampler, NamingSchema schema, MutableSettings mutableSettings) { TraceSampler = traceSampler; SpanSampler = spanSampler; - ServiceNames = serviceNames; Schema = schema; HasResourceBasedSamplingRule = (traceSampler?.HasResourceBasedSamplingRule ?? false) || (spanSampler?.HasResourceBasedSamplingRule ?? false); Settings = mutableSettings; @@ -30,7 +29,7 @@ public PerTraceSettings(ITraceSampler? traceSampler, ISpanSampler? spanSampler, public ISpanSampler? SpanSampler { get; } - public IReadOnlyDictionary ServiceNames { get; } + public IReadOnlyDictionary ServiceNames => Settings.ServiceNameMappings; public NamingSchema Schema { get; } diff --git a/tracer/src/Datadog.Trace/CorrelationIdentifier.cs b/tracer/src/Datadog.Trace/CorrelationIdentifier.cs index fc117bc4fe38..79398de3e46d 100644 --- a/tracer/src/Datadog.Trace/CorrelationIdentifier.cs +++ b/tracer/src/Datadog.Trace/CorrelationIdentifier.cs @@ -47,7 +47,7 @@ public static string Version get { TelemetryFactory.Metrics.Record(PublicApiUsage.Correlation_Identifier_Version_Get); - return Tracer.Instance.Settings.ServiceVersion ?? string.Empty; + return Tracer.Instance.CurrentTraceSettings.Settings.ServiceVersion ?? string.Empty; } } @@ -59,7 +59,7 @@ public static string Env get { TelemetryFactory.Metrics.Record(PublicApiUsage.Correlation_Identifier_Env_Get); - return Tracer.Instance.Settings.Environment ?? string.Empty; + return Tracer.Instance.CurrentTraceSettings.Settings.Environment ?? string.Empty; } } diff --git a/tracer/src/Datadog.Trace/ExtensionMethods/SpanExtensions.cs b/tracer/src/Datadog.Trace/ExtensionMethods/SpanExtensions.cs index ee3d94bf8786..fd6b189586d9 100644 --- a/tracer/src/Datadog.Trace/ExtensionMethods/SpanExtensions.cs +++ b/tracer/src/Datadog.Trace/ExtensionMethods/SpanExtensions.cs @@ -93,7 +93,7 @@ internal static bool HasHttpStatusCode(this Span span) } } - internal static void SetHttpStatusCode(this Span span, int statusCode, bool isServer, TracerSettings tracerSettings) + internal static void SetHttpStatusCode(this Span span, int statusCode, bool isServer, MutableSettings tracerSettings) { if (statusCode < 100 || statusCode >= 600) { diff --git a/tracer/src/Datadog.Trace/PlatformHelpers/AspNetCoreHttpRequestHandler.cs b/tracer/src/Datadog.Trace/PlatformHelpers/AspNetCoreHttpRequestHandler.cs index fefeca9afea5..c89c200f5e2a 100644 --- a/tracer/src/Datadog.Trace/PlatformHelpers/AspNetCoreHttpRequestHandler.cs +++ b/tracer/src/Datadog.Trace/PlatformHelpers/AspNetCoreHttpRequestHandler.cs @@ -75,7 +75,7 @@ private PropagationContext ExtractPropagatedContext(Tracer tracer, HttpRequest r private void AddHeaderTagsToSpan(ISpan span, HttpRequest request, Tracer tracer) { - var headerTagsInternal = tracer.Settings.HeaderTags; + var headerTagsInternal = tracer.CurrentTraceSettings.Settings.HeaderTags; if (!headerTagsInternal.IsNullOrEmpty()) { @@ -174,6 +174,7 @@ public void StopAspNetCorePipelineScope(Tracer tracer, Security security, Scope var span = rootScope.Span; var isMissingHttpStatusCode = !span.HasHttpStatusCode(); + var settings = tracer.CurrentTraceSettings.Settings; if (string.IsNullOrEmpty(span.ResourceName) || isMissingHttpStatusCode) { if (string.IsNullOrEmpty(span.ResourceName)) @@ -183,16 +184,16 @@ public void StopAspNetCorePipelineScope(Tracer tracer, Security security, Scope if (isMissingHttpStatusCode) { - span.SetHttpStatusCode(httpContext.Response.StatusCode, isServer: true, tracer.Settings); + span.SetHttpStatusCode(httpContext.Response.StatusCode, isServer: true, settings); } } - span.SetHeaderTags(new HeadersCollectionAdapter(httpContext.Response.Headers), tracer.Settings.HeaderTags, defaultTagPrefix: SpanContextPropagator.HttpResponseHeadersTagPrefix); + span.SetHeaderTags(new HeadersCollectionAdapter(httpContext.Response.Headers), settings.HeaderTags, defaultTagPrefix: SpanContextPropagator.HttpResponseHeadersTagPrefix); if (proxyScope?.Span != null) { - proxyScope.Span.SetHttpStatusCode(httpContext.Response.StatusCode, isServer: true, tracer.Settings); - proxyScope.Span.SetHeaderTags(new HeadersCollectionAdapter(httpContext.Response.Headers), tracer.Settings.HeaderTags, defaultTagPrefix: SpanContextPropagator.HttpResponseHeadersTagPrefix); + proxyScope.Span.SetHttpStatusCode(httpContext.Response.StatusCode, isServer: true, settings); + proxyScope.Span.SetHeaderTags(new HeadersCollectionAdapter(httpContext.Response.Headers), settings.HeaderTags, defaultTagPrefix: SpanContextPropagator.HttpResponseHeadersTagPrefix); } if (security.AppsecEnabled) @@ -224,13 +225,13 @@ public void HandleAspNetCoreException(Tracer tracer, Security security, Span roo } // Generic unhandled exceptions are converted to 500 errors by Kestrel - rootSpan.SetHttpStatusCode(statusCode: statusCode, isServer: true, tracer.Settings); + rootSpan.SetHttpStatusCode(statusCode: statusCode, isServer: true, tracer.CurrentTraceSettings.Settings); var requestFeature = httpContext.Features.Get(); var proxyScope = requestFeature?.ProxyScope; if (proxyScope?.Span != null) { - proxyScope.Span.SetHttpStatusCode(statusCode, isServer: true, tracer.Settings); + proxyScope.Span.SetHttpStatusCode(statusCode, isServer: true, tracer.CurrentTraceSettings.Settings); } if (BlockException.GetBlockException(exception) is null) diff --git a/tracer/src/Datadog.Trace/TraceContext.cs b/tracer/src/Datadog.Trace/TraceContext.cs index f327c1c55ce9..788b602b95b7 100644 --- a/tracer/src/Datadog.Trace/TraceContext.cs +++ b/tracer/src/Datadog.Trace/TraceContext.cs @@ -52,12 +52,10 @@ public TraceContext(IDatadogTracer tracer, TraceTagCollection? tags = null) // TODO: Environment and ServiceVersion are stored on the TraceContext // even though they likely won't change for the lifetime of the process. We should consider moving them // elsewhere to reduce the memory usage. - if (tracer.Settings is { } settings) - { - // these could be set from DD_ENV/DD_VERSION or from DD_TAGS - Environment = settings.Environment; - ServiceVersion = settings.ServiceVersion; - } + var settings = CurrentTraceSettings.Settings; + // these could be set from DD_ENV/DD_VERSION or from DD_TAGS + Environment = settings.Environment; + ServiceVersion = settings.ServiceVersion; Tracer = tracer; Tags = tags ?? new TraceTagCollection(); diff --git a/tracer/src/Datadog.Trace/Tracer.cs b/tracer/src/Datadog.Trace/Tracer.cs index 53a4b2742431..96aa01feba98 100644 --- a/tracer/src/Datadog.Trace/Tracer.cs +++ b/tracer/src/Datadog.Trace/Tracer.cs @@ -275,7 +275,7 @@ ISpan IDatadogOpenTracingTracer.StartSpan(string operationName, ISpanContext par /// The collection to write. void IDatadogTracer.Write(ArraySegment trace) { - if (Settings.TraceEnabled || Settings.AzureAppServiceMetadata?.CustomTracingEnabled is true) + if (CurrentTraceSettings.Settings.TraceEnabled || Settings.AzureAppServiceMetadata?.CustomTracingEnabled is true) { TracerManager.WriteTrace(trace); } diff --git a/tracer/src/Datadog.Trace/TracerManager.cs b/tracer/src/Datadog.Trace/TracerManager.cs index f35438d1524e..319bac0d53f6 100644 --- a/tracer/src/Datadog.Trace/TracerManager.cs +++ b/tracer/src/Datadog.Trace/TracerManager.cs @@ -100,8 +100,8 @@ public TracerManager( TracerFlareManager = tracerFlareManager; SpanEventsManager = new SpanEventsManager(discoveryService); - var schema = new NamingSchema(settings.MetadataSchemaVersion, settings.PeerServiceTagsEnabled, settings.RemoveClientServiceNamesEnabled, settings.MutableSettings.DefaultServiceName, settings.ServiceNameMappings, settings.PeerServiceNameMappings); - PerTraceSettings = new(traceSampler, spanSampler, settings.ServiceNameMappings, schema, settings.MutableSettings); + var schema = new NamingSchema(settings.MetadataSchemaVersion, settings.PeerServiceTagsEnabled, settings.RemoveClientServiceNamesEnabled, settings.MutableSettings.DefaultServiceName, settings.MutableSettings.ServiceNameMappings, settings.PeerServiceNameMappings); + PerTraceSettings = new(traceSampler, spanSampler, schema, settings.MutableSettings); SpanContextPropagator = SpanContextPropagatorFactory.GetSpanContextPropagator(settings.PropagationStyleInject, settings.PropagationStyleExtract, settings.PropagationExtractFirstOnly, settings.PropagationBehaviorExtract); } @@ -309,11 +309,12 @@ private static async Task WriteDiagnosticLog(TracerManager instance) string agentError = null; var instanceSettings = instance.Settings; + var mutableSettings = instance.PerTraceSettings.Settings; // In AAS, the trace agent is deployed alongside the tracer and managed by the tracer // Disable this check as it may hit the trace agent before it is ready to receive requests and give false negatives // Also disable if tracing is not enabled (as likely to be in an environment where agent is not available) - if (instanceSettings.TraceEnabled && !instanceSettings.IsRunningInAzureAppService) + if (mutableSettings.TraceEnabled && !instanceSettings.IsRunningInAzureAppService) { try { @@ -377,13 +378,13 @@ void WriteDictionary(IReadOnlyDictionary dictionary) writer.WriteValue(FrameworkDescription.Instance.ProductVersion); writer.WritePropertyName("env"); - writer.WriteValue(instanceSettings.Environment); + writer.WriteValue(mutableSettings.Environment); writer.WritePropertyName("enabled"); - writer.WriteValue(instanceSettings.TraceEnabled); + writer.WriteValue(mutableSettings.TraceEnabled); writer.WritePropertyName("service"); - writer.WriteValue(instance.PerTraceSettings.Settings.DefaultServiceName); + writer.WriteValue(mutableSettings.DefaultServiceName); writer.WritePropertyName("agent_url"); writer.WriteValue(instanceSettings.Exporter.TraceAgentUriBase); @@ -395,24 +396,24 @@ void WriteDictionary(IReadOnlyDictionary dictionary) writer.WriteValue(GlobalSettings.Instance.DebugEnabledInternal); writer.WritePropertyName("health_checks_enabled"); - writer.WriteValue(instanceSettings.TracerMetricsEnabled); + writer.WriteValue(mutableSettings.TracerMetricsEnabled); #pragma warning disable 618 // App analytics is deprecated, but still used writer.WritePropertyName("analytics_enabled"); - writer.WriteValue(instanceSettings.AnalyticsEnabled); + writer.WriteValue(mutableSettings.AnalyticsEnabled); #pragma warning restore 618 writer.WritePropertyName("sample_rate"); - writer.WriteValue(instanceSettings.GlobalSamplingRate); + writer.WriteValue(mutableSettings.GlobalSamplingRate); writer.WritePropertyName("sampling_rules"); - writer.WriteValue(instanceSettings.CustomSamplingRules); + writer.WriteValue(mutableSettings.CustomSamplingRules); writer.WritePropertyName("tags"); - WriteDictionary(instanceSettings.GlobalTags); + WriteDictionary(mutableSettings.GlobalTags); writer.WritePropertyName("log_injection_enabled"); - writer.WriteValue(instanceSettings.LogsInjectionEnabled); + writer.WriteValue(mutableSettings.LogsInjectionEnabled); writer.WritePropertyName("runtime_metrics_enabled"); writer.WriteValue(instanceSettings.RuntimeMetricsEnabled); @@ -424,7 +425,7 @@ void WriteDictionary(IReadOnlyDictionary dictionary) // lists them whether they were explicitly disabled with // DD_DISABLED_INTEGRATIONS, DD_TRACE_{0}_ENABLED, DD_{0}_ENABLED, // or manually in code. - foreach (var integration in instanceSettings.Integrations.Settings) + foreach (var integration in mutableSettings.Integrations.Settings) { if (integration.Enabled == false) { @@ -550,10 +551,10 @@ void WriteDictionary(IReadOnlyDictionary dictionary) writer.WriteValue(instanceSettings.IsRemoteConfigurationAvailable); writer.WritePropertyName("header_tags"); - WriteDictionary(instanceSettings.HeaderTags); + WriteDictionary(mutableSettings.HeaderTags); writer.WritePropertyName("service_mapping"); - WriteDictionary(instanceSettings.ServiceNameMappings); + WriteDictionary(mutableSettings.ServiceNameMappings); writer.WritePropertyName("trace_propagation_style_extract_first_only"); writer.WriteValue(instanceSettings.PropagationExtractFirstOnly); @@ -666,7 +667,7 @@ private static TracerManager CreateInitializedTracer(TracerSettings settings, Tr OneTimeSetup(newManager.Settings); } - if (newManager.Settings.StartupDiagnosticLogEnabled) + if (newManager.PerTraceSettings.Settings.StartupDiagnosticLogEnabled) { _ = Task.Run(() => WriteDiagnosticLog(newManager)); } @@ -748,7 +749,7 @@ private static void HeartbeatCallback(object state) // use the count of Tracer instances as the heartbeat value // to estimate the number of "live" Tracers than can potentially // send traces to the Agent - if (_instance?.Settings.TracerMetricsEnabled == true) + if (_instance?.PerTraceSettings.Settings.TracerMetricsEnabled == true) { _instance?.Statsd?.Gauge(TracerMetricNames.Health.Heartbeat, Tracer.LiveTracerCount); } diff --git a/tracer/src/Datadog.Trace/TracerManagerFactory.cs b/tracer/src/Datadog.Trace/TracerManagerFactory.cs index 6a0bffb187ce..ceb48d33268a 100644 --- a/tracer/src/Datadog.Trace/TracerManagerFactory.cs +++ b/tracer/src/Datadog.Trace/TracerManagerFactory.cs @@ -74,7 +74,8 @@ internal TracerManager CreateTracerManager(TracerSettings settings, TracerManage { if (Profiler.Instance.Status.IsProfilerReady) { - NativeInterop.SetApplicationInfoForAppDomain(RuntimeId.Get(), tracer.PerTraceSettings.Settings.DefaultServiceName, tracer.Settings.Environment, tracer.Settings.ServiceVersion); + var mutableSettings = tracer.PerTraceSettings.Settings; + NativeInterop.SetApplicationInfoForAppDomain(RuntimeId.Get(), mutableSettings.DefaultServiceName, mutableSettings.Environment, mutableSettings.ServiceVersion); } } catch (Exception ex) @@ -149,7 +150,7 @@ internal TracerManager CreateTracerManager( telemetry ??= CreateTelemetryController(settings, discoveryService); - var gitMetadataTagsProvider = GetGitMetadataTagsProvider(settings, scopeManager, telemetry); + var gitMetadataTagsProvider = GetGitMetadataTagsProvider(settings, settings.InitialMutableSettings, scopeManager, telemetry); logSubmissionManager = DirectLogSubmissionManager.Create( logSubmissionManager, settings, @@ -239,9 +240,9 @@ protected virtual ITelemetryController CreateTelemetryController(TracerSettings return TelemetryFactory.Instance.CreateTelemetryController(settings, discoveryService); } - protected virtual IGitMetadataTagsProvider GetGitMetadataTagsProvider(TracerSettings settings, IScopeManager scopeManager, ITelemetryController telemetry) + protected virtual IGitMetadataTagsProvider GetGitMetadataTagsProvider(TracerSettings settings, MutableSettings initialMutableSettings, IScopeManager scopeManager, ITelemetryController telemetry) { - return new GitMetadataTagsProvider(settings, scopeManager, telemetry); + return new GitMetadataTagsProvider(settings, initialMutableSettings, scopeManager, telemetry); } protected virtual bool ShouldEnableRemoteConfiguration(TracerSettings settings) diff --git a/tracer/test/Datadog.Trace.IntegrationTests/StatsTests.cs b/tracer/test/Datadog.Trace.IntegrationTests/StatsTests.cs index 62adb9165a8e..79f023874acc 100644 --- a/tracer/test/Datadog.Trace.IntegrationTests/StatsTests.cs +++ b/tracer/test/Datadog.Trace.IntegrationTests/StatsTests.cs @@ -532,7 +532,7 @@ Scope CreateCommonSpan(Tracer tracer, bool finishSpansOnClose, TracerSettings tr var scope = tracer.StartActiveInternal("operationName", finishOnClose: finishSpansOnClose); var span = scope.Span; span.ResourceName = "resourceName"; - span.SetHttpStatusCode(200, isServer: true, tracerSettings); + span.SetHttpStatusCode(200, isServer: true, tracerSettings.InitialMutableSettings); span.Type = "span1"; return scope; diff --git a/tracer/test/Datadog.Trace.Security.Unit.Tests/ApiSec/ApiSecurityTests.cs b/tracer/test/Datadog.Trace.Security.Unit.Tests/ApiSec/ApiSecurityTests.cs index a2d76df58522..e20b02d94e74 100644 --- a/tracer/test/Datadog.Trace.Security.Unit.Tests/ApiSec/ApiSecurityTests.cs +++ b/tracer/test/Datadog.Trace.Security.Unit.Tests/ApiSec/ApiSecurityTests.cs @@ -10,10 +10,13 @@ using System.Linq; using System.Reflection; using System.Threading; +using System.Threading.Tasks; using Datadog.Trace.AppSec; +using Datadog.Trace.Configuration; using Datadog.Trace.Configuration.Telemetry; using Datadog.Trace.Security.Unit.Tests.Iast; using Datadog.Trace.Tagging; +using Datadog.Trace.TestHelpers.TestTracer; using FluentAssertions; using Moq; using Xunit; @@ -31,19 +34,19 @@ public class ApiSecurityTests [InlineData(true, true, true, SamplingPriorityValues.AutoKeep, false, null)] [InlineData(true, false, true, SamplingPriorityValues.AutoReject, true, "route2")] [InlineData(true, false, false, SamplingPriorityValues.AutoKeep, false, "route3")] - public void ApiSecurityTest(bool enable, bool apmTracingEnabled, bool lastCall, int samplingPriority, bool expectedResult, string route) + public async Task ApiSecurityTest(bool enable, bool apmTracingEnabled, bool lastCall, int samplingPriority, bool expectedResult, string route) { - var apiSec = new ApiSecurity( - new SecuritySettings( - new CustomSettingsForTests( - new Dictionary - { - { Configuration.ConfigurationKeys.AppSec.ApiSecurityEnabled, enable }, - { Configuration.ConfigurationKeys.ApmTracingEnabled, apmTracingEnabled }, - }), - new NullConfigurationTelemetry())); + var config = new Dictionary + { + { Configuration.ConfigurationKeys.AppSec.ApiSecurityEnabled, enable }, + { Configuration.ConfigurationKeys.ApmTracingEnabled, apmTracingEnabled }, + }; + + await using var tracer = TracerHelper.Create(TracerSettings.Create(config)); + + var apiSec = new ApiSecurity(new SecuritySettings(new CustomSettingsForTests(config), new NullConfigurationTelemetry())); var dic = new Dictionary(); - var tc = new TraceContext(Mock.Of(), new TraceTagCollection()); + var tc = new TraceContext(tracer, new TraceTagCollection()); tc.SetSamplingPriority(samplingPriority); var span = new Span(new SpanContext(SpanContext.None, tc, "Test"), DateTimeOffset.Now); span.SetTag(Tags.HttpRoute, route); @@ -66,10 +69,12 @@ public void ApiSecurityTest(bool enable, bool apmTracingEnabled, bool lastCall, } [Fact] - public void ApiSecurityTestMaxRoutes() + public async Task ApiSecurityTestMaxRoutes() { var maxRouteSize = 50; - var apiSec = new ApiSecurity(new SecuritySettings(new CustomSettingsForTests(new Dictionary { { Configuration.ConfigurationKeys.AppSec.ApiSecurityEnabled, true } }), new NullConfigurationTelemetry()), maxRouteSize); + var config = new Dictionary { { Configuration.ConfigurationKeys.AppSec.ApiSecurityEnabled, true } }; + await using var tracer = TracerHelper.Create(TracerSettings.Create(config)); + var apiSec = new ApiSecurity(new SecuritySettings(new CustomSettingsForTests(config), new NullConfigurationTelemetry()), maxRouteSize); var queue = new Queue(maxRouteSize); for (var i = 0; i < maxRouteSize + 1; i++) { @@ -85,7 +90,7 @@ public void ApiSecurityTestMaxRoutes() var resHash = ApiSecurity.CombineHashes(route, method, statusCode); queue.Enqueue(resHash); var dic = new Dictionary(); - var tc = new TraceContext(Mock.Of(), new TraceTagCollection()); + var tc = new TraceContext(tracer, new TraceTagCollection()); tc.SetSamplingPriority(SamplingPriorityValues.AutoKeep); var span = new Span(new SpanContext(SpanContext.None, tc, "Test"), dt); @@ -104,15 +109,13 @@ public void ApiSecurityTestMaxRoutes() } [Fact] - public void ApiSecurityTestMultiThread() + public async Task ApiSecurityTestMultiThread() { - var apiSec = new ApiSecurity( - new SecuritySettings( - new CustomSettingsForTests( - new Dictionary { { Configuration.ConfigurationKeys.AppSec.ApiSecurityEnabled, true }, { Configuration.ConfigurationKeys.AppSec.ApiSecuritySampleDelay, 120 } }), - new NullConfigurationTelemetry())); + var config = new Dictionary { { Configuration.ConfigurationKeys.AppSec.ApiSecurityEnabled, true }, { Configuration.ConfigurationKeys.AppSec.ApiSecuritySampleDelay, 120 } }; + await using var tracer = TracerHelper.Create(TracerSettings.Create(config)); + var apiSec = new ApiSecurity(new SecuritySettings(new CustomSettingsForTests(config), new NullConfigurationTelemetry())); var dic = new Dictionary { { "controller", "test" }, { "action", "test" } }; - var tc = new TraceContext(Mock.Of(), new TraceTagCollection()); + var tc = new TraceContext(tracer, new TraceTagCollection()); tc.SetSamplingPriority(SamplingPriorityValues.AutoKeep); var dt = DateTime.UtcNow; diff --git a/tracer/test/Datadog.Trace.Security.Unit.Tests/EmptyDatadogTracer.cs b/tracer/test/Datadog.Trace.Security.Unit.Tests/EmptyDatadogTracer.cs index 32525f449eb3..c43533eeb3a8 100644 --- a/tracer/test/Datadog.Trace.Security.Unit.Tests/EmptyDatadogTracer.cs +++ b/tracer/test/Datadog.Trace.Security.Unit.Tests/EmptyDatadogTracer.cs @@ -5,6 +5,10 @@ using System; using Datadog.Trace.Configuration; +using Datadog.Trace.Configuration.Schema; +using Datadog.Trace.Sampling; +using Moq; + // // Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License. // This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc. @@ -12,15 +16,23 @@ namespace Datadog.Trace.Security.Unit.Tests { - public class EmptyDatadogTracer : IDatadogTracer + internal class EmptyDatadogTracer : IDatadogTracer { - public string DefaultServiceName => "My Service Name"; + public EmptyDatadogTracer() + { + DefaultServiceName = "My Service Name"; + Settings = new TracerSettings(NullConfigurationSource.Instance); + var namingSchema = new NamingSchema(SchemaVersion.V0, false, false, DefaultServiceName, null, null); + PerTraceSettings = new PerTraceSettings(null, null, namingSchema, MutableSettings.CreateWithoutDefaultSources(Settings)); + } + + public string DefaultServiceName { get; } - public TracerSettings Settings => new(new NullConfigurationSource()); + public TracerSettings Settings { get; } IGitMetadataTagsProvider IDatadogTracer.GitMetadataTagsProvider => new NullGitMetadataProvider(); - PerTraceSettings IDatadogTracer.PerTraceSettings => null; + public PerTraceSettings PerTraceSettings { get; } void IDatadogTracer.Write(ArraySegment span) { diff --git a/tracer/test/Datadog.Trace.Security.Unit.Tests/SecurityCoordinatorTests.cs b/tracer/test/Datadog.Trace.Security.Unit.Tests/SecurityCoordinatorTests.cs index 621915a3ab3d..6847d20ccfaf 100644 --- a/tracer/test/Datadog.Trace.Security.Unit.Tests/SecurityCoordinatorTests.cs +++ b/tracer/test/Datadog.Trace.Security.Unit.Tests/SecurityCoordinatorTests.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using System.Web; using Datadog.Trace.AppSec; using Datadog.Trace.AppSec.Coordinator; @@ -13,6 +14,7 @@ using Datadog.Trace.AppSec.Waf.NativeBindings; using Datadog.Trace.Configuration; using Datadog.Trace.Security.Unit.Tests.Utils; +using Datadog.Trace.TestHelpers.TestTracer; using FluentAssertions; #if NETCOREAPP using Microsoft.AspNetCore.Http; @@ -104,7 +106,8 @@ public void GivenHttpTransportInstanceWithUninitializedContext_WhenRunWaf_ThenRe var context = contextMoq.Object; CoreHttpContextStore.Instance.Set(context); - var securityCoordinator = TryGet(AppSec.Security.Instance, rootTestScope.Span); + using var security = new AppSec.Security(); + var securityCoordinator = TryGet(security, rootTestScope.Span); securityCoordinator.HasValue.Should().BeTrue(); var nativeResult = new DdwafObjectStruct { Type = DDWAF_OBJ_TYPE.DDWAF_OBJ_MAP }; @@ -131,7 +134,8 @@ public void GivenHttpTransportInstanceWithUninitializedContext_WhenAccessingStat contextMoq.Setup(x => x.Response.StatusCode).Throws(new NullReferenceException("Test exception")); contextMoq.Setup(x => x.Features).Returns(mockedFeatures.Object); - var securityCoordinator = SecurityCoordinator.Get(AppSec.Security.Instance, rootTestScope.Span, new HttpTransport(contextMoq.Object)); + using var security = new AppSec.Security(); + var securityCoordinator = SecurityCoordinator.Get(security, rootTestScope.Span, new HttpTransport(contextMoq.Object)); var result = securityCoordinator.RunWaf(new(), runWithEphemeral: true, isRasp: true); result.Should().BeNull(); } @@ -174,7 +178,8 @@ public void GivenSecurityCoordinatorInstanceWithResponseHeadersWritten_WheBlock_ headersWrittenProperty.SetValue(response, true); HttpContext.Current = new HttpContext(new HttpRequest("file", "http://localhost/benchmarks", "data=param"), response); - var securityCoordinator = SecurityCoordinator.TryGet(AppSec.Security.Instance, span); + using var security = new AppSec.Security(); + var securityCoordinator = SecurityCoordinator.TryGet(security, span); securityCoordinator.Should().NotBeNull(); var resultMock = new Mock(); resultMock.SetupGet(x => x.ShouldBlock).Returns(true); diff --git a/tracer/test/Datadog.Trace.Tests/Agent/AgentWriterTests.cs b/tracer/test/Datadog.Trace.Tests/Agent/AgentWriterTests.cs index 648309534b62..789f3ed60118 100644 --- a/tracer/test/Datadog.Trace.Tests/Agent/AgentWriterTests.cs +++ b/tracer/test/Datadog.Trace.Tests/Agent/AgentWriterTests.cs @@ -426,6 +426,7 @@ public async Task AddsTraceKeepRateMetricToRootSpan() var tracer = new Mock(); tracer.Setup(x => x.DefaultServiceName).Returns("Default"); + tracer.Setup(x => x.PerTraceSettings).Returns(new PerTraceSettings(null, null, null!, MutableSettings.CreateWithoutDefaultSources(new(NullConfigurationSource.Instance)))); var traceContext = new TraceContext(tracer.Object); var rootSpanContext = new SpanContext(null, traceContext, null); var rootSpan = new Span(rootSpanContext, DateTimeOffset.UtcNow); diff --git a/tracer/test/Datadog.Trace.Tests/Agent/MessagePack/SpanMessagePackFormatterTests.cs b/tracer/test/Datadog.Trace.Tests/Agent/MessagePack/SpanMessagePackFormatterTests.cs index 847807e6716d..d1240bc04027 100644 --- a/tracer/test/Datadog.Trace.Tests/Agent/MessagePack/SpanMessagePackFormatterTests.cs +++ b/tracer/test/Datadog.Trace.Tests/Agent/MessagePack/SpanMessagePackFormatterTests.cs @@ -19,6 +19,7 @@ using Datadog.Trace.Telemetry; using Datadog.Trace.TestHelpers; using Datadog.Trace.TestHelpers.TestTracer; +using Datadog.Trace.Tests.Util; using Datadog.Trace.Util; using FluentAssertions; using Moq; @@ -28,11 +29,13 @@ namespace Datadog.Trace.Tests.Agent.MessagePack; public class SpanMessagePackFormatterTests { + private readonly StubDatadogTracer _stubTracer = new(); + [Fact] public void SerializeSpans() { var formatter = SpanFormatterResolver.Instance.GetFormatter(); - var traceContext = new TraceContext(Mock.Of()); + var traceContext = new TraceContext(_stubTracer); var parentContext = new SpanContext(new TraceId(0, 1), 2, (int)SamplingPriority.UserKeep, "ServiceName1", "origin1"); var spans = new[] @@ -133,7 +136,7 @@ public void SpanLink_Tag_Serialization() var spans = new[] { new Span(parentContext, DateTimeOffset.UtcNow), - new Span(new SpanContext(parentContext, new TraceContext(Mock.Of()), "ServiceName1"), DateTimeOffset.UtcNow), + new Span(new SpanContext(parentContext, new TraceContext(_stubTracer), "ServiceName1"), DateTimeOffset.UtcNow), new Span(new SpanContext(new TraceId(0, 5), 6, (int)SamplingPriority.UserKeep, "ServiceName3", "origin3"), DateTimeOffset.UtcNow), }; var attributesToAdd = new List> diff --git a/tracer/test/Datadog.Trace.Tests/Agent/MessagePack/TraceChunkModelTests.cs b/tracer/test/Datadog.Trace.Tests/Agent/MessagePack/TraceChunkModelTests.cs index c9095e671cb7..dad9cb92f350 100644 --- a/tracer/test/Datadog.Trace.Tests/Agent/MessagePack/TraceChunkModelTests.cs +++ b/tracer/test/Datadog.Trace.Tests/Agent/MessagePack/TraceChunkModelTests.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using Datadog.Trace.Agent.MessagePack; +using Datadog.Trace.Tests.Util; using FluentAssertions; using Moq; using Xunit; @@ -492,7 +493,7 @@ private static TraceChunkModel CreateTraceChunk(IEnumerable spans, Span ro private Span CreateSpan(ulong traceId, ulong spanId, ulong parentId) { var parentContent = new SpanContext(traceId, parentId); - var traceContext = new TraceContext(Mock.Of()); + var traceContext = new TraceContext(new StubDatadogTracer()); var spanContext = new SpanContext(parentContent, traceContext, serviceName: null, spanId: spanId); return new Span(spanContext, DateTimeOffset.UtcNow); } diff --git a/tracer/test/Datadog.Trace.Tests/Agent/StatsAggregatorTests.cs b/tracer/test/Datadog.Trace.Tests/Agent/StatsAggregatorTests.cs index d864adcad645..d47d92337f03 100644 --- a/tracer/test/Datadog.Trace.Tests/Agent/StatsAggregatorTests.cs +++ b/tracer/test/Datadog.Trace.Tests/Agent/StatsAggregatorTests.cs @@ -13,6 +13,7 @@ using Datadog.Trace.Agent.DiscoveryService; using Datadog.Trace.Configuration; using Datadog.Trace.ExtensionMethods; +using Datadog.Trace.Tests.Util; using FluentAssertions; using Moq; using Xunit; @@ -201,15 +202,15 @@ public async Task CollectsMeasuredSpans_TS004() parentSpan.SetDuration(TimeSpan.FromMilliseconds(100)); // childSpan shouldn't be recorded, because it's not top-level and doesn't have the Measured tag - var childSpan = new Span(new SpanContext(parentSpan.Context, new TraceContext(Mock.Of()), "service"), start); + var childSpan = new Span(new SpanContext(parentSpan.Context, new TraceContext(new StubDatadogTracer()), "service"), start); childSpan.SetDuration(TimeSpan.FromMilliseconds(100)); - var measuredChildSpan1 = new Span(new SpanContext(parentSpan.Context, new TraceContext(Mock.Of()), "service"), start); + var measuredChildSpan1 = new Span(new SpanContext(parentSpan.Context, new TraceContext(new StubDatadogTracer()), "service"), start); measuredChildSpan1.OperationName = "child.op1"; measuredChildSpan1.SetTag(Tags.Measured, "1"); measuredChildSpan1.SetDuration(TimeSpan.FromMilliseconds(100)); - var measuredChildSpan2 = new Span(new SpanContext(parentSpan.Context, new TraceContext(Mock.Of()), "service"), start); + var measuredChildSpan2 = new Span(new SpanContext(parentSpan.Context, new TraceContext(new StubDatadogTracer()), "service"), start); measuredChildSpan2.OperationName = "child.op2"; measuredChildSpan2.SetTag(Tags.Measured, "1"); measuredChildSpan2.SetDuration(TimeSpan.FromMilliseconds(100)); @@ -271,7 +272,7 @@ public async Task CollectsTopLevelSpans_TS005() snapshotSpan.SetDuration(TimeSpan.FromMilliseconds(300)); // Create a new child span that is a service entry span, which means it will have stats computed for it - var httpClientServiceSpan = new Span(new SpanContext(parentSpan.Context, new TraceContext(Mock.Of()), "service-http-client"), start); + var httpClientServiceSpan = new Span(new SpanContext(parentSpan.Context, new TraceContext(new StubDatadogTracer()), "service-http-client"), start); httpClientServiceSpan.SetDuration(TimeSpan.FromMilliseconds(400)); aggregator.Add(simpleSpan, parentSpan, snapshotSpan, httpClientServiceSpan); diff --git a/tracer/test/Datadog.Trace.Tests/Propagators/B3MultipleHeadersPropagatorTests.cs b/tracer/test/Datadog.Trace.Tests/Propagators/B3MultipleHeadersPropagatorTests.cs index 4e19e745c720..a707e112011f 100644 --- a/tracer/test/Datadog.Trace.Tests/Propagators/B3MultipleHeadersPropagatorTests.cs +++ b/tracer/test/Datadog.Trace.Tests/Propagators/B3MultipleHeadersPropagatorTests.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using Datadog.Trace.Headers; using Datadog.Trace.Propagators; +using Datadog.Trace.Tests.Util; using FluentAssertions; using Moq; using Xunit; @@ -49,7 +50,7 @@ public void Inject_IHeadersCollection() headers.VerifyNoOtherCalls(); // Extract default (no sampler) sampling from trace context - var spanContext2 = new SpanContext(parent: null, new TraceContext(Mock.Of()), serviceName: null, traceId, spanId); + var spanContext2 = new SpanContext(parent: null, new TraceContext(new StubDatadogTracer()), serviceName: null, traceId, spanId); var newHeaders = new Mock(); B3Propagator.Inject(new PropagationContext(spanContext2, TestBaggage), newHeaders.Object); @@ -90,7 +91,7 @@ public void Inject_CarrierAndDelegate() headers.VerifyNoOtherCalls(); // Extract default (no sampler) sampling from trace context - var spanContext2 = new SpanContext(parent: null, new TraceContext(Mock.Of()), serviceName: null, traceId, spanId); + var spanContext2 = new SpanContext(parent: null, new TraceContext(new StubDatadogTracer()), serviceName: null, traceId, spanId); var newHeaders = new Mock(); B3Propagator.Inject(new PropagationContext(spanContext2, TestBaggage), newHeaders.Object, (carrier, name, value) => carrier.Set(name, value)); diff --git a/tracer/test/Datadog.Trace.Tests/Propagators/B3SingleHeaderPropagatorTests.cs b/tracer/test/Datadog.Trace.Tests/Propagators/B3SingleHeaderPropagatorTests.cs index de40ab6fafe4..b240cfd64559 100644 --- a/tracer/test/Datadog.Trace.Tests/Propagators/B3SingleHeaderPropagatorTests.cs +++ b/tracer/test/Datadog.Trace.Tests/Propagators/B3SingleHeaderPropagatorTests.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using Datadog.Trace.Headers; using Datadog.Trace.Propagators; +using Datadog.Trace.Tests.Util; using FluentAssertions; using Moq; using Xunit; @@ -46,7 +47,7 @@ public void Inject_IHeadersCollection() headers.VerifyNoOtherCalls(); // Extract default (no sampler) sampling from trace context - var spanContext2 = new SpanContext(parent: null, new TraceContext(Mock.Of()), serviceName: null, traceId, spanId); + var spanContext2 = new SpanContext(parent: null, new TraceContext(new StubDatadogTracer()), serviceName: null, traceId, spanId); var newHeaders = new Mock(); B3Propagator.Inject(new PropagationContext(spanContext2, TestBaggage), newHeaders.Object); newHeaders.Verify(h => h.Set("b3", "0123456789abcdef1122334455667788-000000003ade68b1-1"), Times.Once()); @@ -77,7 +78,7 @@ public void Inject_CarrierAndDelegate() headers.VerifyNoOtherCalls(); // Extract default (no sampler) sampling from trace context - var spanContext2 = new SpanContext(parent: null, new TraceContext(Mock.Of()), serviceName: null, traceId, spanId); + var spanContext2 = new SpanContext(parent: null, new TraceContext(new StubDatadogTracer()), serviceName: null, traceId, spanId); var newHeaders = new Mock(); B3Propagator.Inject(new PropagationContext(spanContext2, TestBaggage), newHeaders.Object, (carrier, name, value) => carrier.Set(name, value)); newHeaders.Verify(h => h.Set("b3", "000000000000000000000000075bcd15-000000003ade68b1-1"), Times.Once()); diff --git a/tracer/test/Datadog.Trace.Tests/Propagators/MultiSpanContextPropagatorTests.cs b/tracer/test/Datadog.Trace.Tests/Propagators/MultiSpanContextPropagatorTests.cs index 184dcff30415..f6ad39df2e02 100644 --- a/tracer/test/Datadog.Trace.Tests/Propagators/MultiSpanContextPropagatorTests.cs +++ b/tracer/test/Datadog.Trace.Tests/Propagators/MultiSpanContextPropagatorTests.cs @@ -10,6 +10,7 @@ using Datadog.Trace.Headers; using Datadog.Trace.Propagators; using Datadog.Trace.Tagging; +using Datadog.Trace.Tests.Util; using Datadog.Trace.Util; using FluentAssertions; using Moq; @@ -163,7 +164,7 @@ static MultiSpanContextPropagatorTests() [Fact] public void Inject_All_IHeadersCollection() { - var traceContext = new TraceContext(Mock.Of()); + var traceContext = new TraceContext(new StubDatadogTracer()); traceContext.SetSamplingPriority(SamplingPriorityValues.UserKeep); traceContext.Origin = "rum"; traceContext.Tags.SetTags(PropagatedTagsCollection); @@ -202,7 +203,7 @@ public void Inject_All_IHeadersCollection() [Fact] public void Inject_All_IHeadersCollection_128Bit_TraceId() { - var traceContext = new TraceContext(Mock.Of()); + var traceContext = new TraceContext(new StubDatadogTracer()); traceContext.SetSamplingPriority(SamplingPriorityValues.UserKeep); traceContext.Origin = "rum"; traceContext.Tags.SetTags(PropagatedTagsCollection); @@ -246,7 +247,7 @@ public void Inject_All_IHeadersCollection_128Bit_TraceId() [Fact] public void Inject_All_CarrierAndDelegate() { - var traceContext = new TraceContext(Mock.Of()); + var traceContext = new TraceContext(new StubDatadogTracer()); traceContext.SetSamplingPriority(SamplingPriorityValues.UserKeep); traceContext.Origin = "rum"; traceContext.Tags.SetTags(PropagatedTagsCollection); @@ -288,7 +289,7 @@ public void Inject_All_CarrierAndDelegate() [Fact] public void Inject_All_CarrierAndDelegate_128Bit_TraceId() { - var traceContext = new TraceContext(Mock.Of()); + var traceContext = new TraceContext(new StubDatadogTracer()); traceContext.SetSamplingPriority(SamplingPriorityValues.UserKeep); traceContext.Origin = "rum"; traceContext.Tags.SetTags(PropagatedTagsCollection); diff --git a/tracer/test/Datadog.Trace.Tests/Propagators/W3CTraceContextPropagatorTests.cs b/tracer/test/Datadog.Trace.Tests/Propagators/W3CTraceContextPropagatorTests.cs index c89c8bf417a5..3e668b8a8146 100644 --- a/tracer/test/Datadog.Trace.Tests/Propagators/W3CTraceContextPropagatorTests.cs +++ b/tracer/test/Datadog.Trace.Tests/Propagators/W3CTraceContextPropagatorTests.cs @@ -10,6 +10,7 @@ using Datadog.Trace.Headers; using Datadog.Trace.Propagators; using Datadog.Trace.Tagging; +using Datadog.Trace.Tests.Util; using FluentAssertions; using Moq; using Xunit; @@ -177,7 +178,7 @@ public void CreateTraceStateHeader(int? samplingPriority, string origin, string { var propagatedTags = TagPropagation.ParseHeader(tags); - var traceContext = new TraceContext(Mock.Of(), propagatedTags) + var traceContext = new TraceContext(new StubDatadogTracer(), propagatedTags) { Origin = origin, AdditionalW3CTraceState = additionalState @@ -194,7 +195,7 @@ public void CreateTraceStateHeader(int? samplingPriority, string origin, string [Fact] public void CreateTraceStateHeader_WithPublicPropagatedTags() { - var traceContext = new TraceContext(Mock.Of()); + var traceContext = new TraceContext(new StubDatadogTracer()); var spanContext = new SpanContext(parent: SpanContext.None, traceContext, serviceName: null, traceId: (TraceId)1, spanId: 2); var span = new Span(spanContext, DateTimeOffset.Now); @@ -217,7 +218,7 @@ public void CreateTraceStateHeader_WithPublicPropagatedTags() [Fact] public void CreateTraceStateHeader_With128Bit_TraceId() { - var traceContext = new TraceContext(Mock.Of()); + var traceContext = new TraceContext(new StubDatadogTracer()); traceContext.SetSamplingPriority(SamplingPriorityValues.UserKeep); var traceId = new TraceId(0x1234567890abcdef, 0x1122334455667788); @@ -233,7 +234,7 @@ public void CreateTraceStateHeader_With128Bit_TraceId() [Fact] public void Inject_IHeadersCollection() { - var traceContext = new TraceContext(Mock.Of(), tags: null) + var traceContext = new TraceContext(new StubDatadogTracer(), tags: null) { Origin = "origin", AdditionalW3CTraceState = "key1=value1" @@ -257,7 +258,7 @@ public void Inject_IHeadersCollection_128Bit_TraceId() var traceId = new TraceId(0x1234567890abcdef, 0x1122334455667788); var spanId = 1UL; - var traceContext = new TraceContext(Mock.Of(), tags: null) + var traceContext = new TraceContext(new StubDatadogTracer(), tags: null) { Origin = "origin", AdditionalW3CTraceState = "key1=value1" @@ -278,7 +279,7 @@ public void Inject_IHeadersCollection_128Bit_TraceId() [Fact] public void Inject_CarrierAndDelegate() { - var traceContext = new TraceContext(Mock.Of(), tags: null) + var traceContext = new TraceContext(new StubDatadogTracer(), tags: null) { Origin = "origin", AdditionalW3CTraceState = "key1=value1" diff --git a/tracer/test/Datadog.Trace.Tests/SpanContextTests.cs b/tracer/test/Datadog.Trace.Tests/SpanContextTests.cs index 62be25ec0732..f5fcfb30af12 100644 --- a/tracer/test/Datadog.Trace.Tests/SpanContextTests.cs +++ b/tracer/test/Datadog.Trace.Tests/SpanContextTests.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using Datadog.Trace.Tagging; +using Datadog.Trace.Tests.Util; using FluentAssertions; using Moq; using Xunit; @@ -147,7 +148,7 @@ private static IReadOnlyDictionary CreateSpanContext() propagatedTags.SetTag("_dd.p.key1", "value1"); propagatedTags.SetTag("_dd.p.key2", "value2"); - var traceContext = new TraceContext(Mock.Of(), propagatedTags); + var traceContext = new TraceContext(new StubDatadogTracer(), propagatedTags); traceContext.SetSamplingPriority(samplingPriority); traceContext.Origin = origin; traceContext.AdditionalW3CTraceState = additionalW3CTraceState; diff --git a/tracer/test/Datadog.Trace.Tests/SpanTests.cs b/tracer/test/Datadog.Trace.Tests/SpanTests.cs index 363631a65922..35cda5cd6903 100644 --- a/tracer/test/Datadog.Trace.Tests/SpanTests.cs +++ b/tracer/test/Datadog.Trace.Tests/SpanTests.cs @@ -13,6 +13,7 @@ using Datadog.Trace.Configuration; using Datadog.Trace.Configuration.Telemetry; using Datadog.Trace.Sampling; +using Datadog.Trace.Tests.Util; using FluentAssertions; using Moq; using Xunit; @@ -362,7 +363,7 @@ public void SpanIds_RootOfScopeSpanMixedHierarchy() public void GetTag_TraceId(ulong upper, ulong lower, string expected) { var traceId = new TraceId(upper, lower); - var trace = new TraceContext(Mock.Of()); + var trace = new TraceContext(new StubDatadogTracer()); var propagatedContext = new SpanContext(traceId, spanId: 1, samplingPriority: null, serviceName: null, origin: null); var childContext = new SpanContext(propagatedContext, trace, serviceName: null); var span = new Span(childContext, start: null); diff --git a/tracer/test/Datadog.Trace.Tests/TraceContextTests.cs b/tracer/test/Datadog.Trace.Tests/TraceContextTests.cs index d4c99a6519d4..650ab28d25a3 100644 --- a/tracer/test/Datadog.Trace.Tests/TraceContextTests.cs +++ b/tracer/test/Datadog.Trace.Tests/TraceContextTests.cs @@ -8,6 +8,7 @@ using Datadog.Trace.Configuration; using Datadog.Trace.Sampling; using Datadog.Trace.TestHelpers; +using Datadog.Trace.Tests.Util; using Datadog.Trace.Util; using FluentAssertions; using Moq; @@ -17,12 +18,12 @@ namespace Datadog.Trace.Tests { public class TraceContextTests { - private readonly Mock _tracerMock = new(); + private readonly StubDatadogTracer _tracerMock = new(); [Fact] public void UtcNow_GivesLegitTime() { - var traceContext = new TraceContext(_tracerMock.Object); + var traceContext = new TraceContext(_tracerMock); var now = traceContext.Clock.UtcNow; var expectedNow = DateTimeOffset.UtcNow; @@ -37,7 +38,7 @@ public void UtcNow_GivesLegitTime() [Fact] public void UtcNow_IsMonotonic() { - var traceContext = new TraceContext(_tracerMock.Object); + var traceContext = new TraceContext(_tracerMock); var t1 = traceContext.Clock.UtcNow; DateTimeOffset t2; @@ -62,6 +63,7 @@ public void FlushPartialTraces(bool partialFlush) { ConfigurationKeys.PartialFlushEnabled, partialFlush }, { ConfigurationKeys.PartialFlushMinSpans, 5 }, })); + tracer.Setup(x => x.PerTraceSettings).Returns(_tracerMock.PerTraceSettings); var traceContext = new TraceContext(tracer.Object); @@ -139,6 +141,7 @@ public void FullFlushShouldNotPropagateSamplingPriority() { ConfigurationKeys.PartialFlushEnabled, true }, { ConfigurationKeys.PartialFlushMinSpans, partialFlushThreshold }, })); + tracer.Setup(x => x.PerTraceSettings).Returns(_tracerMock.PerTraceSettings); ArraySegment? spans = null; @@ -193,6 +196,7 @@ public void PartialFlushShouldPropagateMetadata() tracer.Setup(t => t.Write(It.IsAny>())) .Callback>((s) => spans = s); + tracer.Setup(x => x.PerTraceSettings).Returns(_tracerMock.PerTraceSettings); var traceContext = new TraceContext(tracer.Object); traceContext.SetSamplingPriority(SamplingPriorityValues.UserKeep); diff --git a/tracer/test/Datadog.Trace.Tests/TraceContextTests_SetSamplingDecision.cs b/tracer/test/Datadog.Trace.Tests/TraceContextTests_SetSamplingDecision.cs index 48c3e0c824a8..3c1eb8b6b23b 100644 --- a/tracer/test/Datadog.Trace.Tests/TraceContextTests_SetSamplingDecision.cs +++ b/tracer/test/Datadog.Trace.Tests/TraceContextTests_SetSamplingDecision.cs @@ -4,6 +4,7 @@ // using Datadog.Trace.Sampling; +using Datadog.Trace.Tests.Util; using FluentAssertions; using Moq; using Xunit; @@ -20,8 +21,8 @@ public class TraceContextTests_SetSamplingDecision [InlineData(SamplingPriorityValues.UserKeep, SamplingMechanism.Asm)] public void SetSamplingDecision(int samplingPriority, string samplingMechanism) { - var tracer = new Mock(); - var traceContext = new TraceContext(tracer.Object); + var tracer = new StubDatadogTracer(); + var traceContext = new TraceContext(tracer); traceContext.SetSamplingPriority(samplingPriority, samplingMechanism); traceContext.SamplingPriority.Should().Be(samplingPriority); @@ -39,8 +40,8 @@ public void SetSamplingDecision(int samplingPriority, string samplingMechanism) [Fact] public void SetSamplingDecision_KeepsFirstMechanism() { - var tracer = new Mock(); - var traceContext = new TraceContext(tracer.Object); + var tracer = new StubDatadogTracer(); + var traceContext = new TraceContext(tracer); traceContext.SetSamplingPriority(SamplingPriorityValues.AutoKeep, SamplingMechanism.AgentRate); traceContext.SamplingPriority.Should().Be(SamplingPriorityValues.AutoKeep); @@ -54,8 +55,8 @@ public void SetSamplingDecision_KeepsFirstMechanism() [Fact] public void SetSamplingDecision_RemovesMechanismOnDrop() { - var tracer = new Mock(); - var traceContext = new TraceContext(tracer.Object); + var tracer = new StubDatadogTracer(); + var traceContext = new TraceContext(tracer); traceContext.SetSamplingPriority(SamplingPriorityValues.AutoKeep, SamplingMechanism.AgentRate); traceContext.SamplingPriority.Should().Be(SamplingPriorityValues.AutoKeep); diff --git a/tracer/test/Datadog.Trace.Tests/Util/StubDatadogTracer.cs b/tracer/test/Datadog.Trace.Tests/Util/StubDatadogTracer.cs new file mode 100644 index 000000000000..595985f4c427 --- /dev/null +++ b/tracer/test/Datadog.Trace.Tests/Util/StubDatadogTracer.cs @@ -0,0 +1,33 @@ +// +// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc. +// + +using System; +using Datadog.Trace.Configuration; +using Datadog.Trace.Configuration.Schema; + +namespace Datadog.Trace.Tests.Util; + +internal class StubDatadogTracer : IDatadogTracer +{ + public StubDatadogTracer() + { + DefaultServiceName = "stub-service"; + Settings = new TracerSettings(NullConfigurationSource.Instance); + var namingSchema = new NamingSchema(SchemaVersion.V0, false, false, DefaultServiceName, null, null); + PerTraceSettings = new PerTraceSettings(null, null, namingSchema, MutableSettings.CreateWithoutDefaultSources(Settings)); + } + + public string DefaultServiceName { get; } + + public TracerSettings Settings { get; } + + IGitMetadataTagsProvider IDatadogTracer.GitMetadataTagsProvider => new NullGitMetadataProvider(); + + public PerTraceSettings PerTraceSettings { get; } + + void IDatadogTracer.Write(ArraySegment span) + { + } +}