From a4e72cd8393b6e4e21b26f3c4986621f47528d6f Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Thu, 9 Jan 2025 16:45:25 +1300 Subject: [PATCH 1/4] Add SentryOptions.DisableSentryHttpMessageHandler --- .../SentryHttpMessageHandlerBuilderFilter.cs | 3 +- src/Sentry/BindableSentryOptions.cs | 2 + src/Sentry/SentryHttpMessageHandler.cs | 3 +- src/Sentry/SentryOptions.cs | 8 ++++ ...tryHttpMessageHandlerBuilderFilterTests.cs | 46 +++++++++++++++++++ ...piApprovalTests.Run.DotNet8_0.verified.txt | 1 + ...piApprovalTests.Run.DotNet9_0.verified.txt | 1 + .../ApiApprovalTests.Run.Net4_8.verified.txt | 1 + 8 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 test/Sentry.Extensions.Logging.Tests/SentryHttpMessageHandlerBuilderFilterTests.cs diff --git a/src/Sentry.Extensions.Logging/SentryHttpMessageHandlerBuilderFilter.cs b/src/Sentry.Extensions.Logging/SentryHttpMessageHandlerBuilderFilter.cs index f35cad05d9..7cbc7ebc54 100644 --- a/src/Sentry.Extensions.Logging/SentryHttpMessageHandlerBuilderFilter.cs +++ b/src/Sentry.Extensions.Logging/SentryHttpMessageHandlerBuilderFilter.cs @@ -14,7 +14,8 @@ public Action Configure(Action { var hub = _getHub(); - if (!handlerBuilder.AdditionalHandlers.Any(h => h is SentryHttpMessageHandler)) + var enableHandler = hub.GetSentryOptions()?.DisableSentryHttpMessageHandler == false; + if (enableHandler && !handlerBuilder.AdditionalHandlers.Any(h => h is SentryHttpMessageHandler)) { handlerBuilder.AdditionalHandlers.Add( new SentryHttpMessageHandler(hub) diff --git a/src/Sentry/BindableSentryOptions.cs b/src/Sentry/BindableSentryOptions.cs index 46d3ec7711..cd9e5cc8d8 100644 --- a/src/Sentry/BindableSentryOptions.cs +++ b/src/Sentry/BindableSentryOptions.cs @@ -48,6 +48,7 @@ internal partial class BindableSentryOptions public TimeSpan? AutoSessionTrackingInterval { get; set; } public bool? AutoSessionTracking { get; set; } public bool? UseAsyncFileIO { get; set; } + public bool? DisableSentryHttpMessageHandler { get; set; } public bool? JsonPreserveReferences { get; set; } public bool? EnableSpotlight { get; set; } public string? SpotlightUrl { get; set; } @@ -94,6 +95,7 @@ public void ApplyTo(SentryOptions options) options.AutoSessionTrackingInterval = AutoSessionTrackingInterval ?? options.AutoSessionTrackingInterval; options.AutoSessionTracking = AutoSessionTracking ?? options.AutoSessionTracking; options.UseAsyncFileIO = UseAsyncFileIO ?? options.UseAsyncFileIO; + options.DisableSentryHttpMessageHandler = DisableSentryHttpMessageHandler ?? options.DisableSentryHttpMessageHandler; options.JsonPreserveReferences = JsonPreserveReferences ?? options.JsonPreserveReferences; options.EnableSpotlight = EnableSpotlight ?? options.EnableSpotlight; options.SpotlightUrl = SpotlightUrl ?? options.SpotlightUrl; diff --git a/src/Sentry/SentryHttpMessageHandler.cs b/src/Sentry/SentryHttpMessageHandler.cs index db409c9132..f75f958b8a 100644 --- a/src/Sentry/SentryHttpMessageHandler.cs +++ b/src/Sentry/SentryHttpMessageHandler.cs @@ -5,7 +5,8 @@ namespace Sentry; /// -/// Special HTTP message handler that can be used to propagate Sentry headers and other contextual information. +/// Special HTTP message handler that can be used to propagate Sentry headers and other contextual information. Will +/// also create events for failed requests if is enabled. /// public class SentryHttpMessageHandler : SentryMessageHandler { diff --git a/src/Sentry/SentryOptions.cs b/src/Sentry/SentryOptions.cs index 127cc4bf11..be6d9eaa57 100644 --- a/src/Sentry/SentryOptions.cs +++ b/src/Sentry/SentryOptions.cs @@ -1066,6 +1066,14 @@ public StackTraceMode StackTraceMode /// internal Instrumenter Instrumenter { get; set; } = Instrumenter.Sentry; + /// + /// + /// Set to `true` to prevents Sentry from automatically registering . + /// + /// Defaults to `false`. Should be set to `true` when using the OpenTelemetry.Instrumentation.Http. + /// + public bool DisableSentryHttpMessageHandler { get; set; } = false; + /// /// Adds a to be used when serializing or deserializing /// objects to JSON with this SDK. For example, when custom context data might use diff --git a/test/Sentry.Extensions.Logging.Tests/SentryHttpMessageHandlerBuilderFilterTests.cs b/test/Sentry.Extensions.Logging.Tests/SentryHttpMessageHandlerBuilderFilterTests.cs new file mode 100644 index 0000000000..57e2dec7a3 --- /dev/null +++ b/test/Sentry.Extensions.Logging.Tests/SentryHttpMessageHandlerBuilderFilterTests.cs @@ -0,0 +1,46 @@ +using Microsoft.Extensions.Http; + +namespace Sentry.Extensions.Logging.Tests; + +public class SentryHttpMessageHandlerBuilderFilterTests +{ + [Fact] + public void Configure_HandlerEnabled_ShouldAddSentryHttpMessageHandler() + { + // Arrange + var hub = Substitute.For(); + SentryClientExtensions.SentryOptionsForTestingOnly = new SentryOptions { DisableSentryHttpMessageHandler = false }; + + var filter = new SentryHttpMessageHandlerBuilderFilter(() => hub); + var handlerBuilder = Substitute.For(); + handlerBuilder.AdditionalHandlers.Returns(new List()); + Action next = _ => { }; + + // Act + var configure = filter.Configure(next); + configure(handlerBuilder); + + // Assert + handlerBuilder.AdditionalHandlers.Should().ContainSingle(h => h is SentryHttpMessageHandler); + } + + [Fact] + public void Configure_HandlerDisabled_ShouldNotAddSentryHttpMessageHandler() + { + // Arrange + var hub = Substitute.For(); + SentryClientExtensions.SentryOptionsForTestingOnly = new SentryOptions { DisableSentryHttpMessageHandler = true }; + + var filter = new SentryHttpMessageHandlerBuilderFilter(() => hub); + var handlerBuilder = Substitute.For(); + handlerBuilder.AdditionalHandlers.Returns(new List()); + Action next = _ => { }; + + // Act + var configure = filter.Configure(next); + configure(handlerBuilder); + + // Assert + handlerBuilder.AdditionalHandlers.Should().NotContain(h => h is SentryHttpMessageHandler); + } +} diff --git a/test/Sentry.Tests/ApiApprovalTests.Run.DotNet8_0.verified.txt b/test/Sentry.Tests/ApiApprovalTests.Run.DotNet8_0.verified.txt index 6a7583141c..843b28f7e4 100644 --- a/test/Sentry.Tests/ApiApprovalTests.Run.DotNet8_0.verified.txt +++ b/test/Sentry.Tests/ApiApprovalTests.Run.DotNet8_0.verified.txt @@ -664,6 +664,7 @@ namespace Sentry public Sentry.SentryLevel DiagnosticLevel { get; set; } public Sentry.Extensibility.IDiagnosticLogger? DiagnosticLogger { get; set; } public bool DisableFileWrite { get; set; } + public bool DisableSentryHttpMessageHandler { get; set; } public string? Distribution { get; set; } public string? Dsn { get; set; } public bool EnableScopeSync { get; set; } diff --git a/test/Sentry.Tests/ApiApprovalTests.Run.DotNet9_0.verified.txt b/test/Sentry.Tests/ApiApprovalTests.Run.DotNet9_0.verified.txt index 6a7583141c..843b28f7e4 100644 --- a/test/Sentry.Tests/ApiApprovalTests.Run.DotNet9_0.verified.txt +++ b/test/Sentry.Tests/ApiApprovalTests.Run.DotNet9_0.verified.txt @@ -664,6 +664,7 @@ namespace Sentry public Sentry.SentryLevel DiagnosticLevel { get; set; } public Sentry.Extensibility.IDiagnosticLogger? DiagnosticLogger { get; set; } public bool DisableFileWrite { get; set; } + public bool DisableSentryHttpMessageHandler { get; set; } public string? Distribution { get; set; } public string? Dsn { get; set; } public bool EnableScopeSync { get; set; } diff --git a/test/Sentry.Tests/ApiApprovalTests.Run.Net4_8.verified.txt b/test/Sentry.Tests/ApiApprovalTests.Run.Net4_8.verified.txt index 460ab5309d..a14cf232b7 100644 --- a/test/Sentry.Tests/ApiApprovalTests.Run.Net4_8.verified.txt +++ b/test/Sentry.Tests/ApiApprovalTests.Run.Net4_8.verified.txt @@ -651,6 +651,7 @@ namespace Sentry public Sentry.SentryLevel DiagnosticLevel { get; set; } public Sentry.Extensibility.IDiagnosticLogger? DiagnosticLogger { get; set; } public bool DisableFileWrite { get; set; } + public bool DisableSentryHttpMessageHandler { get; set; } public string? Distribution { get; set; } public string? Dsn { get; set; } public bool EnableScopeSync { get; set; } From fa6290765ee5df9452a740ee035c630fcbcbd661 Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Thu, 9 Jan 2025 17:06:08 +1300 Subject: [PATCH 2/4] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54ed60add3..466f3588e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +- Added `SentryOptions.DisableSentryHttpMessageHandler` ([#3879](https://github.com/getsentry/sentry-dotnet/pull/3879)) + ## 5.0.1 ### Fixes From de2f660507277fdf052e6c8123e9a88c9fae27fa Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Thu, 9 Jan 2025 20:20:29 +1300 Subject: [PATCH 3/4] Skip tests on Android --- .../SentryHttpMessageHandlerBuilderFilterTests.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/test/Sentry.Extensions.Logging.Tests/SentryHttpMessageHandlerBuilderFilterTests.cs b/test/Sentry.Extensions.Logging.Tests/SentryHttpMessageHandlerBuilderFilterTests.cs index 57e2dec7a3..ee3e59fff6 100644 --- a/test/Sentry.Extensions.Logging.Tests/SentryHttpMessageHandlerBuilderFilterTests.cs +++ b/test/Sentry.Extensions.Logging.Tests/SentryHttpMessageHandlerBuilderFilterTests.cs @@ -4,9 +4,13 @@ namespace Sentry.Extensions.Logging.Tests; public class SentryHttpMessageHandlerBuilderFilterTests { - [Fact] + [SkippableFact] public void Configure_HandlerEnabled_ShouldAddSentryHttpMessageHandler() { +#if __ANDROID__ + Skip.If(true, "Can't create proxies for classes without parameterless constructors on Android"); +#endif + // Arrange var hub = Substitute.For(); SentryClientExtensions.SentryOptionsForTestingOnly = new SentryOptions { DisableSentryHttpMessageHandler = false }; @@ -24,9 +28,13 @@ public void Configure_HandlerEnabled_ShouldAddSentryHttpMessageHandler() handlerBuilder.AdditionalHandlers.Should().ContainSingle(h => h is SentryHttpMessageHandler); } - [Fact] + [SkippableFact] public void Configure_HandlerDisabled_ShouldNotAddSentryHttpMessageHandler() { +#if __ANDROID__ + Skip.If(true, "Can't create proxies for classes without parameterless constructors on Android"); +#endif + // Arrange var hub = Substitute.For(); SentryClientExtensions.SentryOptionsForTestingOnly = new SentryOptions { DisableSentryHttpMessageHandler = true }; From e0a69480abd1f3b9d4267d4de6475bf39ebb8d30 Mon Sep 17 00:00:00 2001 From: James Crosswell Date: Mon, 13 Jan 2025 09:12:34 +1300 Subject: [PATCH 4/4] Update CHANGELOG.md Co-authored-by: Bruno Garcia --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 466f3588e6..035c44901d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## Unreleased -- Added `SentryOptions.DisableSentryHttpMessageHandler` ([#3879](https://github.com/getsentry/sentry-dotnet/pull/3879)) +- Added `SentryOptions.DisableSentryHttpMessageHandler`. Useful if you're using `OpenTelemetry.Instrumentation.Http` and ending up with duplicate spans. ([#3879](https://github.com/getsentry/sentry-dotnet/pull/3879)) ## 5.0.1