diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 6f1df629e44..9e5ed04df1c 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +* `TracerProviderSDK` modified for spans with remote parent. For such spans + activity will be created irrespective of SamplingResult, to maintain context + propagation. + ([#3329](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3329)) + * Fix issue where a measurement would be dropped when recording it with a null-valued tag. ([#3325](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3325)) diff --git a/src/OpenTelemetry/Trace/TracerProviderSdk.cs b/src/OpenTelemetry/Trace/TracerProviderSdk.cs index 4f2a292e6e3..cd760e29548 100644 --- a/src/OpenTelemetry/Trace/TracerProviderSdk.cs +++ b/src/OpenTelemetry/Trace/TracerProviderSdk.cs @@ -199,7 +199,7 @@ internal TracerProviderSdk( else if (sampler is AlwaysOffSampler) { listener.Sample = (ref ActivityCreationOptions options) => - !Sdk.SuppressInstrumentation ? PropagateOrIgnoreData(options.Parent.TraceId) : ActivitySamplingResult.None; + !Sdk.SuppressInstrumentation ? PropagateOrIgnoreData(options.Parent) : ActivitySamplingResult.None; this.getRequestedDataAction = this.RunGetRequestedDataAlwaysOffSampler; } else @@ -393,17 +393,17 @@ private static ActivitySamplingResult ComputeActivitySamplingResult( return activitySamplingResult; } - return PropagateOrIgnoreData(options.Parent.TraceId); + return PropagateOrIgnoreData(options.Parent); } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static ActivitySamplingResult PropagateOrIgnoreData(ActivityTraceId traceId) + private static ActivitySamplingResult PropagateOrIgnoreData(in ActivityContext parentContext) { - var isRootSpan = traceId == default; + var isRootSpan = parentContext.TraceId == default; - // If it is the root span select PropagationData so the trace ID is preserved + // If it is the root span or the parent is remote select PropagationData so the trace ID is preserved // even if no activity of the trace is recorded (sampled per OpenTelemetry parlance). - return isRootSpan + return (isRootSpan || parentContext.IsRemote) ? ActivitySamplingResult.PropagationData : ActivitySamplingResult.None; } diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs index c3f7d3b90c4..a18a24df015 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderSdkTest.cs @@ -222,7 +222,7 @@ public void TracerProviderSdkSamplerAttributesAreAppliedToActivity(SamplingDecis } } - [Fact(Skip = "https://github.com/open-telemetry/opentelemetry-dotnet/issues/3315")] + [Fact] public void TracerSdkSetsActivitySamplingResultAsPropagationWhenParentIsRemote() { var testSampler = new TestSampler();