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);