diff --git a/src/Sentry.OpenTelemetry.Exporter/SentryOptionsExtensions.cs b/src/Sentry.OpenTelemetry.Exporter/SentryOptionsExtensions.cs index 83a4703498..31e5ba9aa5 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,18 @@ 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) + /// + /// 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) { 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..3144488073 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,14 @@ 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. + /// + /// 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, - string dsnString, Uri? collectorUrl = null, TextMapPropagator? defaultTextMapPropagator = null) + string dsnString, Uri? collectorUrl = null) { if (Dsn.IsDisabled(dsnString)) { @@ -52,9 +44,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() {