From 066eab7ee5cc5c0e3885a7bc91a39144b11c83fd Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Fri, 26 Jun 2026 13:10:47 +1200 Subject: [PATCH 1/2] fix(otlp): don't configure an automatic OTel propagator The OTLP integration spec states the integration MUST NOT set up an automatic propagator; cross-service trace propagation is handled by the propagateTraceparent setting or by user-configured OTel propagators. AddSentryOtlpExporter / UseOtlp previously called Sdk.SetDefaultTextMapPropagator(new SentryPropagator()), which is inconsistent with the spec and with our other OTLP integrations. This removes that call and the now-purposeless defaultTextMapPropagator parameter from both public methods. BREAKING CHANGE: removed the defaultTextMapPropagator parameter from AddSentryOtlpExporter and UseOtlp. Co-Authored-By: Claude Opus 4.8 --- .../SentryOptionsExtensions.cs | 22 +++++++---------- .../SentryTracerProviderBuilderExtensions.cs | 24 ++++++------------- .../SentryOptionsExtensionsTests.cs | 16 ------------- ...tryTracerProviderBuilderExtensionsTests.cs | 20 ++++++++++++++++ 4 files changed, 35 insertions(+), 47 deletions(-) diff --git a/src/Sentry.OpenTelemetry.Exporter/SentryOptionsExtensions.cs b/src/Sentry.OpenTelemetry.Exporter/SentryOptionsExtensions.cs index 83a4703498..47d8bbe21b 100644 --- a/src/Sentry.OpenTelemetry.Exporter/SentryOptionsExtensions.cs +++ b/src/Sentry.OpenTelemetry.Exporter/SentryOptionsExtensions.cs @@ -1,4 +1,3 @@ -using OpenTelemetry.Context.Propagation; using OpenTelemetry.Trace; using Sentry.OpenTelemetry.Exporter; @@ -21,24 +20,19 @@ public static class SentryOptionsExtensions /// /// A custom endpoint to export OLTP trace information to. If no url is provided, the /// endpoint will be inferred automatically from the DSN. - /// - /// The default TextMapPropagator to be used by OpenTelemetry. - /// - /// If this parameter is not supplied, the will be used, which propagates the - /// baggage header as well as Sentry trace headers. - /// - /// - /// The is required for Sentry's OpenTelemetry integration to work, but you - /// could wrap this in a if you needed other propagators as well. - /// - /// - public static void UseOtlp(this SentryOptions options, TracerProviderBuilder tracerProviderBuilder, Uri? collectorUrl = null, TextMapPropagator? defaultTextMapPropagator = null) + /// + /// In line with the OTLP integration specification, this method does not configure an OpenTelemetry propagator. + /// Cross-service trace propagation should be enabled either via the + /// option or by configuring OpenTelemetry propagators yourself (e.g. by calling + /// Sdk.SetDefaultTextMapPropagator). + /// + public static void UseOtlp(this SentryOptions options, TracerProviderBuilder tracerProviderBuilder, Uri? collectorUrl = null) { if (string.IsNullOrWhiteSpace(options.Dsn)) { throw new ArgumentException("Sentry DSN must be set before calling `SentryOptions.UseOtlp`", nameof(options.Dsn)); } - tracerProviderBuilder.AddSentryOtlpExporter(options.Dsn, collectorUrl, defaultTextMapPropagator); + tracerProviderBuilder.AddSentryOtlpExporter(options.Dsn, collectorUrl); options.UseOtlp(); } diff --git a/src/Sentry.OpenTelemetry.Exporter/SentryTracerProviderBuilderExtensions.cs b/src/Sentry.OpenTelemetry.Exporter/SentryTracerProviderBuilderExtensions.cs index 7dcf8e07fc..589d8497ab 100644 --- a/src/Sentry.OpenTelemetry.Exporter/SentryTracerProviderBuilderExtensions.cs +++ b/src/Sentry.OpenTelemetry.Exporter/SentryTracerProviderBuilderExtensions.cs @@ -1,7 +1,5 @@ -using OpenTelemetry.Context.Propagation; using OpenTelemetry.Exporter; using Sentry; -using Sentry.OpenTelemetry; // ReSharper disable once CheckNamespace -- Discoverability namespace OpenTelemetry.Trace; @@ -27,20 +25,15 @@ public static class SentryTracerProviderBuilderExtensions /// The DSN for your Sentry project /// A custom endpoint to export OLTP trace information to. If no url is provided, the /// endpoint will be inferred automatically from the DSN. - /// - /// The default TextMapPropagator to be used by OpenTelemetry. - /// - /// If this parameter is not supplied, the will be used, which propagates the - /// baggage header as well as Sentry trace headers. - /// - /// - /// The is required for Sentry's OpenTelemetry integration to work, but you - /// could wrap this in a if you needed other propagators as well. - /// - /// /// The supplied for chaining. + /// + /// In line with the OTLP integration specification, this method does not configure an OpenTelemetry propagator. + /// Cross-service trace propagation should be enabled either via the + /// option or by configuring OpenTelemetry propagators yourself (e.g. by calling + /// Sdk.SetDefaultTextMapPropagator). + /// public static TracerProviderBuilder AddSentryOtlpExporter(this TracerProviderBuilder tracerProviderBuilder, - string dsnString, Uri? collectorUrl = null, TextMapPropagator? defaultTextMapPropagator = null) + string dsnString, Uri? collectorUrl = null) { if (Dsn.IsDisabled(dsnString)) { @@ -52,9 +45,6 @@ public static TracerProviderBuilder AddSentryOtlpExporter(this TracerProviderBui throw new ArgumentException(MissingDsnWarning, nameof(dsnString)); } - defaultTextMapPropagator ??= new SentryPropagator(); - Sdk.SetDefaultTextMapPropagator(defaultTextMapPropagator); - collectorUrl ??= dsn.GetOtlpTracesEndpointUri(); tracerProviderBuilder.AddOtlpExporter(options => OtlpConfigurationCallback(options, collectorUrl, dsn.PublicKey)); return tracerProviderBuilder; diff --git a/test/Sentry.OpenTelemetry.Exporter.Tests/SentryOptionsExtensionsTests.cs b/test/Sentry.OpenTelemetry.Exporter.Tests/SentryOptionsExtensionsTests.cs index 01f5fa7c35..42be97c6ab 100644 --- a/test/Sentry.OpenTelemetry.Exporter.Tests/SentryOptionsExtensionsTests.cs +++ b/test/Sentry.OpenTelemetry.Exporter.Tests/SentryOptionsExtensionsTests.cs @@ -1,4 +1,3 @@ -using OpenTelemetry.Context.Propagation; using OpenTelemetry.Trace; namespace Sentry.OpenTelemetry.Exporter.Tests; @@ -119,19 +118,4 @@ public void UseOtlp_WithTracerProviderBuilder_WithCustomCollectorUrl_DoesNotThro // Assert act.Should().NotThrow(); } - - [Fact] - public void UseOtlp_WithCustomPropagator_DoesNotThrow() - { - // Arrange - var options = new SentryOptions { Dsn = DsnSamples.ValidDsn }; - var tracerProviderBuilder = Substitute.For(); - var customPropagator = Substitute.For(); - - // Act - var act = () => options.UseOtlp(tracerProviderBuilder, defaultTextMapPropagator: customPropagator); - - // Assert - act.Should().NotThrow(); - } } diff --git a/test/Sentry.OpenTelemetry.Exporter.Tests/SentryTracerProviderBuilderExtensionsTests.cs b/test/Sentry.OpenTelemetry.Exporter.Tests/SentryTracerProviderBuilderExtensionsTests.cs index d061cbac7c..a48e506664 100644 --- a/test/Sentry.OpenTelemetry.Exporter.Tests/SentryTracerProviderBuilderExtensionsTests.cs +++ b/test/Sentry.OpenTelemetry.Exporter.Tests/SentryTracerProviderBuilderExtensionsTests.cs @@ -1,3 +1,5 @@ +using OpenTelemetry; +using OpenTelemetry.Context.Propagation; using OpenTelemetry.Exporter; using OpenTelemetry.Trace; @@ -35,6 +37,24 @@ public void AddSentryOtlpExporter_DisabledSdkDsn_ReturnsWithoutConfiguringExport tracerProviderBuilder.DidNotReceive().AddInstrumentation(Arg.Any>()); } + [Fact] + public void AddSentryOtlpExporter_DoesNotConfigureDefaultPropagator() + { + // Arrange + // The OTLP integration spec requires that we MUST NOT set up an automatic propagator. Cross-service trace + // propagation is left to the propagateTraceparent option or to user-configured OTel propagators. + // See https://develop.sentry.dev/sdk/telemetry/traces/otlp/#integration-spec + var sentinel = new TraceContextPropagator(); + Sdk.SetDefaultTextMapPropagator(sentinel); + var tracerProviderBuilder = Substitute.For(); + + // Act + tracerProviderBuilder.AddSentryOtlpExporter("https://examplePublicKey@o0.ingest.sentry.io/123456"); + + // Assert + Propagators.DefaultTextMapPropagator.Should().BeSameAs(sentinel); + } + [Fact] public void OtlpConfigurationCallback_WithCustomCollectorUrl_SetsEndpointToCustomUrl() { From 87baa969b196e7f0fc53cd74239513aac075b6ec Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Fri, 26 Jun 2026 14:26:20 +1200 Subject: [PATCH 2/2] Tweak remarks in XML docs Co-authored-by: James Crosswell --- src/Sentry.OpenTelemetry.Exporter/SentryOptionsExtensions.cs | 5 ++--- .../SentryTracerProviderBuilderExtensions.cs | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Sentry.OpenTelemetry.Exporter/SentryOptionsExtensions.cs b/src/Sentry.OpenTelemetry.Exporter/SentryOptionsExtensions.cs index 47d8bbe21b..31e5ba9aa5 100644 --- a/src/Sentry.OpenTelemetry.Exporter/SentryOptionsExtensions.cs +++ b/src/Sentry.OpenTelemetry.Exporter/SentryOptionsExtensions.cs @@ -21,9 +21,8 @@ public static class SentryOptionsExtensions /// A custom endpoint to export OLTP trace information to. If no url is provided, the /// endpoint will be inferred automatically from the DSN. /// - /// In line with the OTLP integration specification, this method does not configure an OpenTelemetry propagator. - /// Cross-service trace propagation should be enabled either via the - /// option or by configuring OpenTelemetry propagators yourself (e.g. by calling + /// This method does not configure an OpenTelemetry propagator. + /// Cross-service trace propagation should be enabled via the OpenTelemetry SDK (e.g. by calling /// Sdk.SetDefaultTextMapPropagator). /// public static void UseOtlp(this SentryOptions options, TracerProviderBuilder tracerProviderBuilder, Uri? collectorUrl = null) diff --git a/src/Sentry.OpenTelemetry.Exporter/SentryTracerProviderBuilderExtensions.cs b/src/Sentry.OpenTelemetry.Exporter/SentryTracerProviderBuilderExtensions.cs index 589d8497ab..3144488073 100644 --- a/src/Sentry.OpenTelemetry.Exporter/SentryTracerProviderBuilderExtensions.cs +++ b/src/Sentry.OpenTelemetry.Exporter/SentryTracerProviderBuilderExtensions.cs @@ -27,9 +27,8 @@ public static class SentryTracerProviderBuilderExtensions /// endpoint will be inferred automatically from the DSN. /// The supplied for chaining. /// - /// In line with the OTLP integration specification, this method does not configure an OpenTelemetry propagator. - /// Cross-service trace propagation should be enabled either via the - /// option or by configuring OpenTelemetry propagators yourself (e.g. by calling + /// This method does not configure an OpenTelemetry propagator. + /// Cross-service trace propagation should be enabled via the OpenTelemetry SDK (e.g. by calling /// Sdk.SetDefaultTextMapPropagator). /// public static TracerProviderBuilder AddSentryOtlpExporter(this TracerProviderBuilder tracerProviderBuilder,