From ce64320f46ed35731914a2dc8b2863b1f12882b7 Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Thu, 17 Sep 2026 13:03:48 +1200 Subject: [PATCH 1/6] feat(otel): mark span processor based OpenTelemetry init methods obsolete AddSentry and UseOpenTelemetry will be removed in 7.0.0 in favour of AddSentryOtlpExporter/UseOtlp from Sentry.OpenTelemetry.Exporter. Samples still using them are migrated to OTLP. Closes #4932 Co-Authored-By: Claude Opus 5 --- .../Program.cs | 21 ++++++++++++------- ...ry.Samples.AspNetCore.Blazor.Server.csproj | 3 ++- .../Sentry.Samples.GraphQL.Server/Program.cs | 21 ++++++++++++------- .../Sentry.Samples.GraphQL.Server.csproj | 3 ++- .../README.md | 8 +++---- .../README.md | 8 +++---- .../SentryOptionsExtensions.cs | 14 ++++++------- .../TracerProviderBuilderExtensions.cs | 9 ++++---- 8 files changed, 49 insertions(+), 38 deletions(-) diff --git a/samples/Sentry.Samples.AspNetCore.Blazor.Server/Program.cs b/samples/Sentry.Samples.AspNetCore.Blazor.Server/Program.cs index 5192452051..dda6c4779c 100644 --- a/samples/Sentry.Samples.AspNetCore.Blazor.Server/Program.cs +++ b/samples/Sentry.Samples.AspNetCore.Blazor.Server/Program.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Components.Server.Circuits; using OpenTelemetry.Trace; -using Sentry.OpenTelemetry; +using Sentry.OpenTelemetry.Exporter; using Sentry.Samples.AspNetCore.Blazor.Server.Services; var builder = WebApplication.CreateBuilder(args); @@ -10,6 +10,15 @@ builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); +#if SENTRY_DSN_DEFINED_IN_ENV +var dsn = Environment.GetEnvironmentVariable("SENTRY_DSN") + ?? throw new InvalidOperationException("SENTRY_DSN environment variable is not set"); +#else +// A DSN is required. You can set here in code, or you can set it in the SENTRY_DSN environment variable. +// See https://docs.sentry.io/product/sentry-basics/dsn-explainer/ +var dsn = SamplesShared.Dsn; +#endif + #if NET10_0_OR_GREATER // OpenTelemetry is required for the new .NET 10 Blazor telemetry features builder.Services.AddOpenTelemetry() @@ -19,19 +28,15 @@ tracing.AddSource("Microsoft.AspNetCore.Components.Server.Circuits"); tracing.AddAspNetCoreInstrumentation(); // Add Sentry as an exporter - tracing.AddSentry(); + tracing.AddSentryOtlpExporter(dsn); }); #endif builder.WebHost.UseSentry(options => { -#if !SENTRY_DSN_DEFINED_IN_ENV - // A DSN is required. You can set here in code, in the SENTRY_DSN environment variable or in your appsettings.json - // See https://docs.sentry.io/product/sentry-basics/dsn-explainer/ - options.Dsn = SamplesShared.Dsn; -#endif + options.Dsn = dsn; #if NET10_0_OR_GREATER - options.UseOpenTelemetry(); + options.UseOtlp(); options.AddEventProcessor(new BlazorEventProcessor()); #endif options.TracesSampleRate = 1.0; diff --git a/samples/Sentry.Samples.AspNetCore.Blazor.Server/Sentry.Samples.AspNetCore.Blazor.Server.csproj b/samples/Sentry.Samples.AspNetCore.Blazor.Server/Sentry.Samples.AspNetCore.Blazor.Server.csproj index 7dac418922..d547b02518 100644 --- a/samples/Sentry.Samples.AspNetCore.Blazor.Server/Sentry.Samples.AspNetCore.Blazor.Server.csproj +++ b/samples/Sentry.Samples.AspNetCore.Blazor.Server/Sentry.Samples.AspNetCore.Blazor.Server.csproj @@ -18,13 +18,14 @@ - + + diff --git a/samples/Sentry.Samples.GraphQL.Server/Program.cs b/samples/Sentry.Samples.GraphQL.Server/Program.cs index ab38e073b6..5eb4f9f537 100644 --- a/samples/Sentry.Samples.GraphQL.Server/Program.cs +++ b/samples/Sentry.Samples.GraphQL.Server/Program.cs @@ -12,7 +12,7 @@ using GraphQL.Types; using OpenTelemetry.Resources; using OpenTelemetry.Trace; -using Sentry.OpenTelemetry; +using Sentry.OpenTelemetry.Exporter; using Sentry.Samples.GraphQL.Server.Notes; namespace Sentry.Samples.GraphQL.Server; @@ -29,6 +29,15 @@ public static WebApplication BuildWebApplication(string[] args) { var builder = WebApplication.CreateBuilder(args); +#if SENTRY_DSN_DEFINED_IN_ENV + var dsn = Environment.GetEnvironmentVariable("SENTRY_DSN") + ?? throw new InvalidOperationException("SENTRY_DSN environment variable is not set"); +#else + // A DSN is required. You can set here in code, or you can set it in the SENTRY_DSN environment variable. + // See https://docs.sentry.io/product/sentry-basics/dsn-explainer/ + var dsn = SamplesShared.Dsn; +#endif + builder.Services.AddOpenTelemetry() .WithTracing(tracerProviderBuilder => tracerProviderBuilder @@ -36,21 +45,17 @@ public static WebApplication BuildWebApplication(string[] args) .ConfigureResource(resource => resource.AddService("Sentry.Samples.GraphQL.Server")) .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() - .AddSentry() // <-- Ensure telemetry is sent to Sentry + .AddSentryOtlpExporter(dsn) // <-- Ensure telemetry is sent to Sentry ); builder.WebHost.UseSentry(options => { -#if !SENTRY_DSN_DEFINED_IN_ENV - // A DSN is required. You can set here in code, or you can set it in the SENTRY_DSN environment variable. - // See https://docs.sentry.io/product/sentry-basics/dsn-explainer/ - options.Dsn = SamplesShared.Dsn; -#endif + options.Dsn = dsn; options.TracesSampleRate = 1.0; options.Debug = true; options.SendDefaultPii = true; - options.UseOpenTelemetry(); // <-- Configure Sentry to use OpenTelemetry trace information + options.UseOtlp(); // <-- Configure Sentry to use OpenTelemetry trace information }); builder.Services diff --git a/samples/Sentry.Samples.GraphQL.Server/Sentry.Samples.GraphQL.Server.csproj b/samples/Sentry.Samples.GraphQL.Server/Sentry.Samples.GraphQL.Server.csproj index 86170f0edc..baabb06778 100644 --- a/samples/Sentry.Samples.GraphQL.Server/Sentry.Samples.GraphQL.Server.csproj +++ b/samples/Sentry.Samples.GraphQL.Server/Sentry.Samples.GraphQL.Server.csproj @@ -17,6 +17,7 @@ + @@ -29,7 +30,7 @@ - + diff --git a/samples/Sentry.Samples.OpenTelemetry.AspNetCore/README.md b/samples/Sentry.Samples.OpenTelemetry.AspNetCore/README.md index e97237ae1c..2fdcb82755 100644 --- a/samples/Sentry.Samples.OpenTelemetry.AspNetCore/README.md +++ b/samples/Sentry.Samples.OpenTelemetry.AspNetCore/README.md @@ -13,15 +13,15 @@ builder.Services.AddOpenTelemetry() .ConfigureResource(resource => resource.AddService(Telemetry.ServiceName)) .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() - .AddSentry() // <-- Configure OpenTelemetry to send trace information to Sentry + .AddSentryOtlpExporter(dsn) // <-- Configure OpenTelemetry to send trace information to Sentry ); builder.WebHost.UseSentry(options => { - options.Dsn = "...Your DSN..."; + options.Dsn = dsn; options.Debug = builder.Environment.IsDevelopment(); options.TracesSampleRate = 1.0; - options.UseOpenTelemetry(); // <-- Configure Sentry to use OpenTelemetry trace information + options.UseOtlp(); // <-- Configure Sentry to use OpenTelemetry trace information }); ``` @@ -33,4 +33,4 @@ and/or to downstream services. If you need to further customize header propagation in your application (e.g. propagating other vendor specific headers) then you can do so by creating a `CompositeTextMapPropagator` consisting of the custom propagator(s) you need plus the -`SentryPropagator`. You can supply this as an optional parameter to the `AddSentry` method. +`SentryPropagator`. You can supply this as an optional parameter to the `AddSentryOtlpExporter` method. diff --git a/samples/Sentry.Samples.OpenTelemetry.Console/README.md b/samples/Sentry.Samples.OpenTelemetry.Console/README.md index 78558b0b7a..0bc3ede1e8 100644 --- a/samples/Sentry.Samples.OpenTelemetry.Console/README.md +++ b/samples/Sentry.Samples.OpenTelemetry.Console/README.md @@ -10,14 +10,14 @@ using var tracerProvider = Sdk.CreateTracerProviderBuilder() resource.AddService( serviceName: serviceName, serviceVersion: serviceVersion)) - .AddSentry() // <-- Configure OpenTelemetry to send traces to Sentry + .AddSentryOtlpExporter(dsn) // <-- Configure OpenTelemetry to send traces to Sentry .Build(); SentrySdk.Init(o => { - options.Dsn = "...Your DSN..."; + options.Dsn = dsn; options.TracesSampleRate = 1.0; - options.UseOpenTelemetry(); // <-- Configure Sentry to use OpenTelemetry trace information + options.UseOtlp(); // <-- Configure Sentry to use OpenTelemetry trace information }); ``` @@ -29,4 +29,4 @@ and/or to downstream services. If you need to further customize header propagation in your application (e.g. propagating other vendor specific headers) then you can do so by creating a `CompositeTextMapPropagator` consisting of the custom propagator(s) you need plus the -`SentryPropagator`. You can supply this as an optional parameter to the `AddSentry` method. +`SentryPropagator`. You can supply this as an optional parameter to the `AddSentryOtlpExporter` method. diff --git a/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs b/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs index e6bacbfd8a..7c8b1acc7f 100644 --- a/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs +++ b/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs @@ -8,6 +8,10 @@ namespace Sentry.OpenTelemetry; /// public static class SentryOptionsExtensions { + internal const string ObsoleteMessage = + "Use UseOtlp from the Sentry.OpenTelemetry.Exporter package instead. " + + "This method will be removed in version 7.0.0."; + /// /// Enables OpenTelemetry instrumentation with Sentry /// @@ -28,10 +32,7 @@ public static class SentryOptionsExtensions /// It's recommended that you set this to true since mixing OpenTelemetry and Sentry traces may yield /// unexpected results. It is false by default for backward compatibility only. /// - /// - /// This method of initialising the Sentry OpenTelemetry integration will be deprecated in a future major release. - /// We recommend you use the Sentry.OpenTelemetry.Exporter integration instead. - /// + [Obsolete(ObsoleteMessage)] public static void UseOpenTelemetry(this SentryOptions options, TracerProviderBuilder traceProviderBuilder, TextMapPropagator? defaultTextMapPropagator = null, bool disableSentryTracing = false) { @@ -52,10 +53,7 @@ public static void UseOpenTelemetry(this SentryOptions options, TracerProviderBu /// It's recommended that you set this to true since mixing OpenTelemetry and Sentry traces may yield /// unexpected results. It is false by default for backward compatibility only. /// - /// - /// This method of initialising the Sentry OpenTelemetry integration will be deprecated in a future major release. - /// We recommend you use the Sentry.OpenTelemetry.Exporter integration instead. - /// + [Obsolete(ObsoleteMessage)] public static void UseOpenTelemetry(this SentryOptions options, bool disableSentryTracing = false) { options.Instrumenter = Instrumenter.OpenTelemetry; diff --git a/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs b/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs index 573942131f..2c382a2803 100644 --- a/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs +++ b/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs @@ -11,6 +11,10 @@ namespace Sentry.OpenTelemetry; /// public static class TracerProviderBuilderExtensions { + internal const string ObsoleteMessage = + "Use AddSentryOtlpExporter from the Sentry.OpenTelemetry.Exporter package instead. " + + "This method will be removed in version 7.0.0."; + /// /// /// Ensures OpenTelemetry trace information is sent to Sentry. OpenTelemetry spans will be converted to Sentry spans @@ -35,10 +39,7 @@ public static class TracerProviderBuilderExtensions /// /// /// The supplied for chaining. - /// - /// This method of initialising the Sentry OpenTelemetry integration will be deprecated in a future major release. - /// We recommend you use the Sentry.OpenTelemetry.Exporter integration instead. - /// + [Obsolete(ObsoleteMessage)] public static TracerProviderBuilder AddSentry(this TracerProviderBuilder tracerProviderBuilder, TextMapPropagator? defaultTextMapPropagator = null) { From 0ddd862f913bc8afaa73f1c5e764930e47ddcb0c Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Thu, 17 Sep 2026 13:14:29 +1200 Subject: [PATCH 2/6] Tweak comments - leaves us options in terms of when we remove it. Co-authored-by: James Crosswell --- src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs b/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs index 7c8b1acc7f..8d237870ee 100644 --- a/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs +++ b/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs @@ -10,7 +10,7 @@ public static class SentryOptionsExtensions { internal const string ObsoleteMessage = "Use UseOtlp from the Sentry.OpenTelemetry.Exporter package instead. " + - "This method will be removed in version 7.0.0."; + "This method will be removed in future versions."; /// /// Enables OpenTelemetry instrumentation with Sentry From a475c409ae2413b40f8f4fe8e042fb01f16302a2 Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Mon, 21 Sep 2026 10:06:06 +1200 Subject: [PATCH 3/6] Remove code from readme --- .../README.md | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/samples/Sentry.Samples.OpenTelemetry.AspNetCore/README.md b/samples/Sentry.Samples.OpenTelemetry.AspNetCore/README.md index 2fdcb82755..01d6f960dd 100644 --- a/samples/Sentry.Samples.OpenTelemetry.AspNetCore/README.md +++ b/samples/Sentry.Samples.OpenTelemetry.AspNetCore/README.md @@ -1,29 +1,7 @@ # Overview This sample demonstrates how an ASP.NET Core application that is instrumented with the OpenTelemetry .NET SDK can be -configured to send trace information to Sentry, with the following initialization code: - -```csharp -var builder = WebApplication.CreateBuilder(args); - -builder.Services.AddOpenTelemetry() - .WithTracing(tracerProviderBuilder => - tracerProviderBuilder - .AddSource(Telemetry.ActivitySource.Name) - .ConfigureResource(resource => resource.AddService(Telemetry.ServiceName)) - .AddAspNetCoreInstrumentation() - .AddHttpClientInstrumentation() - .AddSentryOtlpExporter(dsn) // <-- Configure OpenTelemetry to send trace information to Sentry - ); - -builder.WebHost.UseSentry(options => -{ - options.Dsn = dsn; - options.Debug = builder.Environment.IsDevelopment(); - options.TracesSampleRate = 1.0; - options.UseOtlp(); // <-- Configure Sentry to use OpenTelemetry trace information -}); -``` +configured to send trace information to Sentry. ## Customizing propagation From a9567a7d7b426d843a0ccfa56bfabf246a2181e6 Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Mon, 21 Sep 2026 10:10:16 +1200 Subject: [PATCH 4/6] Apply suggestion from @ric-oliv Co-authored-by: Ricardo Colombo Oliveira --- src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs b/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs index 2c382a2803..99d555a73b 100644 --- a/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs +++ b/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs @@ -13,7 +13,7 @@ public static class TracerProviderBuilderExtensions { internal const string ObsoleteMessage = "Use AddSentryOtlpExporter from the Sentry.OpenTelemetry.Exporter package instead. " + - "This method will be removed in version 7.0.0."; + "This method will be removed in future versions."; /// /// From 99d0f1076698227ac259fa3b60e6a27a76c771a1 Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Mon, 21 Sep 2026 10:11:01 +1200 Subject: [PATCH 5/6] Remove code from Console sample readme Co-Authored-By: Claude Opus 5 --- .../README.md | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/samples/Sentry.Samples.OpenTelemetry.Console/README.md b/samples/Sentry.Samples.OpenTelemetry.Console/README.md index 0bc3ede1e8..b64cd7a997 100644 --- a/samples/Sentry.Samples.OpenTelemetry.Console/README.md +++ b/samples/Sentry.Samples.OpenTelemetry.Console/README.md @@ -1,25 +1,7 @@ # Overview This sample demonstrates how a console application that is instrumented with the OpenTelemetry .NET SDK can be -configured to send trace information to Sentry, with the following initialization code: - -```csharp -using var tracerProvider = Sdk.CreateTracerProviderBuilder() - .AddSource(serviceName) - .ConfigureResource(resource => - resource.AddService( - serviceName: serviceName, - serviceVersion: serviceVersion)) - .AddSentryOtlpExporter(dsn) // <-- Configure OpenTelemetry to send traces to Sentry - .Build(); - -SentrySdk.Init(o => -{ - options.Dsn = dsn; - options.TracesSampleRate = 1.0; - options.UseOtlp(); // <-- Configure Sentry to use OpenTelemetry trace information -}); -``` +configured to send trace information to Sentry. ## Customizing propagation From ff328745839b5c3cf802007b8b711868d5ba2112 Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Mon, 21 Sep 2026 10:13:19 +1200 Subject: [PATCH 6/6] Name obsolete message constants after the methods they annotate Co-Authored-By: Claude Opus 5 --- src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs | 6 +++--- src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs b/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs index 8d237870ee..7b0971dd35 100644 --- a/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs +++ b/src/Sentry.OpenTelemetry/SentryOptionsExtensions.cs @@ -8,7 +8,7 @@ namespace Sentry.OpenTelemetry; /// public static class SentryOptionsExtensions { - internal const string ObsoleteMessage = + internal const string ObsoleteUseOpenTelemetry = "Use UseOtlp from the Sentry.OpenTelemetry.Exporter package instead. " + "This method will be removed in future versions."; @@ -32,7 +32,7 @@ public static class SentryOptionsExtensions /// It's recommended that you set this to true since mixing OpenTelemetry and Sentry traces may yield /// unexpected results. It is false by default for backward compatibility only. /// - [Obsolete(ObsoleteMessage)] + [Obsolete(ObsoleteUseOpenTelemetry)] public static void UseOpenTelemetry(this SentryOptions options, TracerProviderBuilder traceProviderBuilder, TextMapPropagator? defaultTextMapPropagator = null, bool disableSentryTracing = false) { @@ -53,7 +53,7 @@ public static void UseOpenTelemetry(this SentryOptions options, TracerProviderBu /// It's recommended that you set this to true since mixing OpenTelemetry and Sentry traces may yield /// unexpected results. It is false by default for backward compatibility only. /// - [Obsolete(ObsoleteMessage)] + [Obsolete(ObsoleteUseOpenTelemetry)] public static void UseOpenTelemetry(this SentryOptions options, bool disableSentryTracing = false) { options.Instrumenter = Instrumenter.OpenTelemetry; diff --git a/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs b/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs index 99d555a73b..e4529e05cd 100644 --- a/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs +++ b/src/Sentry.OpenTelemetry/TracerProviderBuilderExtensions.cs @@ -11,7 +11,7 @@ namespace Sentry.OpenTelemetry; /// public static class TracerProviderBuilderExtensions { - internal const string ObsoleteMessage = + internal const string ObsoleteAddSentry = "Use AddSentryOtlpExporter from the Sentry.OpenTelemetry.Exporter package instead. " + "This method will be removed in future versions."; @@ -39,7 +39,7 @@ public static class TracerProviderBuilderExtensions /// /// /// The supplied for chaining. - [Obsolete(ObsoleteMessage)] + [Obsolete(ObsoleteAddSentry)] public static TracerProviderBuilder AddSentry(this TracerProviderBuilder tracerProviderBuilder, TextMapPropagator? defaultTextMapPropagator = null) {