diff --git a/src/OpenTelemetry.Extensions.Propagators/JaegerPropagator.cs b/src/OpenTelemetry.Extensions.Propagators/JaegerPropagator.cs index d11d8d67912..38193de9717 100644 --- a/src/OpenTelemetry.Extensions.Propagators/JaegerPropagator.cs +++ b/src/OpenTelemetry.Extensions.Propagators/JaegerPropagator.cs @@ -10,6 +10,7 @@ namespace OpenTelemetry.Extensions.Propagators; /// /// A text map propagator for Jaeger trace context. See https://www.jaegertracing.io/docs/next-release/client-libraries/#propagation-format. /// +[Obsolete(ObsoleteMessage)] public class JaegerPropagator : TextMapPropagator { internal const string JaegerHeader = "uber-trace-id"; @@ -19,14 +20,21 @@ public class JaegerPropagator : TextMapPropagator internal static readonly string[] JaegerDelimiters = [JaegerDelimiter, JaegerDelimiterEncoded]; + private const string ObsoleteMessage = "The Jaeger propagator is obsolete and will be removed in a future version. The Jaeger propagation format has been deprecated in favor of W3C Trace Context. Use TraceContextPropagator instead. See https://www.jaegertracing.io/sdk-migration/#propagation-format and https://github.com/open-telemetry/opentelemetry-specification/issues/4827 for more information."; + private static readonly int TraceId128BitLength = "0af7651916cd43dd8448eb211c80319c".Length; private static readonly int SpanIdLength = "00f067aa0ba902b7".Length; /// +#pragma warning disable CS0809 // Obsolete member overrides non-obsolete member public override ISet Fields => new HashSet { JaegerHeader }; +#pragma warning restore CS0809 // Obsolete member overrides non-obsolete member /// + [Obsolete(ObsoleteMessage)] +#pragma warning disable CS0809 // Obsolete member overrides non-obsolete member public override PropagationContext Extract(PropagationContext context, T carrier, Func?> getter) +#pragma warning restore CS0809 // Obsolete member overrides non-obsolete member { if (context.ActivityContext.IsValid()) { @@ -81,7 +89,10 @@ public override PropagationContext Extract(PropagationContext context, T carr } /// + [Obsolete(ObsoleteMessage)] +#pragma warning disable CS0809 // Obsolete member overrides non-obsolete member public override void Inject(PropagationContext context, T carrier, Action setter) +#pragma warning restore CS0809 // Obsolete member overrides non-obsolete member { // from https://www.jaegertracing.io/docs/next-release/client-libraries/#propagation-format // parent id is optional and deprecated, will not attempt to set it. diff --git a/src/OpenTelemetry.Extensions.Propagators/README.md b/src/OpenTelemetry.Extensions.Propagators/README.md index dbdda2b3953..32e1269d441 100644 --- a/src/OpenTelemetry.Extensions.Propagators/README.md +++ b/src/OpenTelemetry.Extensions.Propagators/README.md @@ -8,6 +8,14 @@ propagators by following the [OpenTelemetry specification](https://opentelemetry (currently supporting [B3](https://github.com/openzipkin/b3-propagation) format) for tracing. +> [!NOTE] +> `JaegerPropagator` is deprecated and will be removed in a future version. +> The Jaeger propagation format has been deprecated in favor of W3C Trace Context. +> Use `TraceContextPropagator` from the `OpenTelemetry` package instead. +> See [Jaeger's migration guide](https://www.jaegertracing.io/sdk-migration/#propagation-format) +> and [OpenTelemetry specification issue #4827](https://github.com/open-telemetry/opentelemetry-specification/issues/4827) +> for more information. + ## Installation Add a reference to the diff --git a/test/OpenTelemetry.Extensions.Propagators.Tests/JaegerPropagatorTests.cs b/test/OpenTelemetry.Extensions.Propagators.Tests/JaegerPropagatorTests.cs index 765ea3b3db5..ebcb914f0aa 100644 --- a/test/OpenTelemetry.Extensions.Propagators.Tests/JaegerPropagatorTests.cs +++ b/test/OpenTelemetry.Extensions.Propagators.Tests/JaegerPropagatorTests.cs @@ -44,7 +44,9 @@ public void ExtractReturnsOriginalContextIfContextIsAlreadyValid() var headers = new Dictionary(); // act +#pragma warning disable CS0618 // Type or member is obsolete var result = new JaegerPropagator().Extract(propagationContext, headers, Getter); +#pragma warning restore CS0618 // assert Assert.Equal(propagationContext, result); @@ -57,7 +59,9 @@ public void ExtractReturnsOriginalContextIfCarrierIsNull() var propagationContext = default(PropagationContext); // act +#pragma warning disable CS0618 // Type or member is obsolete var result = new JaegerPropagator().Extract(propagationContext, null, Getter!); +#pragma warning restore CS0618 // assert Assert.Equal(propagationContext, result); @@ -72,7 +76,9 @@ public void ExtractReturnsOriginalContextIfGetterIsNull() var headers = new Dictionary(); // act +#pragma warning disable CS0618 // Type or member is obsolete var result = new JaegerPropagator().Extract(propagationContext, headers, null!); +#pragma warning restore CS0618 // assert Assert.Equal(propagationContext, result); @@ -102,7 +108,9 @@ public void ExtractReturnsOriginalContextIfHeaderIsNotValid(string traceId, stri var headers = new Dictionary { { JaegerHeader, [formattedHeader] } }; // act +#pragma warning disable CS0618 // Type or member is obsolete var result = new JaegerPropagator().Extract(propagationContext, headers, Getter); +#pragma warning restore CS0618 // assert Assert.Equal(propagationContext, result); @@ -141,7 +149,9 @@ public void ExtractReturnsNewContextIfHeaderIsValid(string traceId, string spanI var headers = new Dictionary { { JaegerHeader, [formattedHeader] } }; // act +#pragma warning disable CS0618 // Type or member is obsolete var result = new JaegerPropagator().Extract(propagationContext, headers, Getter); +#pragma warning restore CS0618 // assert Assert.Equal(traceId.PadLeft(TraceId.Length, '0'), result.ActivityContext.TraceId.ToString()); @@ -158,7 +168,9 @@ public void InjectDoesNoopIfContextIsInvalid() var headers = new Dictionary(); // act +#pragma warning disable CS0618 // Type or member is obsolete new JaegerPropagator().Inject(propagationContext, headers, Setter); +#pragma warning restore CS0618 // assert Assert.Empty(headers); @@ -175,7 +187,9 @@ public void InjectDoesNoopIfCarrierIsNull() default); // act +#pragma warning disable CS0618 // Type or member is obsolete new JaegerPropagator().Inject(propagationContext, null, Setter!); +#pragma warning restore CS0618 // assert } @@ -193,7 +207,9 @@ public void InjectDoesNoopIfSetterIsNull() var headers = new Dictionary(); // act +#pragma warning disable CS0618 // Type or member is obsolete new JaegerPropagator().Inject(propagationContext, headers, null!); +#pragma warning restore CS0618 // assert Assert.Empty(headers); @@ -221,7 +237,9 @@ public void InjectWillAddJaegerFormattedTraceToCarrier(string sampledFlag) var headers = new Dictionary(); // act +#pragma warning disable CS0618 // Type or member is obsolete new JaegerPropagator().Inject(propagationContext, headers, Setter); +#pragma warning restore CS0618 // assert Assert.Single(headers);