Skip to content

Commit dc3c0dd

Browse files
Add SentryOptions.DisableSentryHttpMessageHandler (#3879)
1 parent c20d162 commit dc3c0dd

File tree

9 files changed

+75
-2
lines changed

9 files changed

+75
-2
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
- 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))
6+
37
## 5.0.1
48

59
### Features

src/Sentry.Extensions.Logging/SentryHttpMessageHandlerBuilderFilter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ public Action<HttpMessageHandlerBuilder> Configure(Action<HttpMessageHandlerBuil
1414
handlerBuilder =>
1515
{
1616
var hub = _getHub();
17-
if (!handlerBuilder.AdditionalHandlers.Any(h => h is SentryHttpMessageHandler))
17+
var enableHandler = hub.GetSentryOptions()?.DisableSentryHttpMessageHandler == false;
18+
if (enableHandler && !handlerBuilder.AdditionalHandlers.Any(h => h is SentryHttpMessageHandler))
1819
{
1920
handlerBuilder.AdditionalHandlers.Add(
2021
new SentryHttpMessageHandler(hub)

src/Sentry/BindableSentryOptions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ internal partial class BindableSentryOptions
4848
public TimeSpan? AutoSessionTrackingInterval { get; set; }
4949
public bool? AutoSessionTracking { get; set; }
5050
public bool? UseAsyncFileIO { get; set; }
51+
public bool? DisableSentryHttpMessageHandler { get; set; }
5152
public bool? JsonPreserveReferences { get; set; }
5253
public bool? EnableSpotlight { get; set; }
5354
public string? SpotlightUrl { get; set; }
@@ -94,6 +95,7 @@ public void ApplyTo(SentryOptions options)
9495
options.AutoSessionTrackingInterval = AutoSessionTrackingInterval ?? options.AutoSessionTrackingInterval;
9596
options.AutoSessionTracking = AutoSessionTracking ?? options.AutoSessionTracking;
9697
options.UseAsyncFileIO = UseAsyncFileIO ?? options.UseAsyncFileIO;
98+
options.DisableSentryHttpMessageHandler = DisableSentryHttpMessageHandler ?? options.DisableSentryHttpMessageHandler;
9799
options.JsonPreserveReferences = JsonPreserveReferences ?? options.JsonPreserveReferences;
98100
options.EnableSpotlight = EnableSpotlight ?? options.EnableSpotlight;
99101
options.SpotlightUrl = SpotlightUrl ?? options.SpotlightUrl;

src/Sentry/SentryHttpMessageHandler.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
namespace Sentry;
66

77
/// <summary>
8-
/// Special HTTP message handler that can be used to propagate Sentry headers and other contextual information.
8+
/// Special HTTP message handler that can be used to propagate Sentry headers and other contextual information. Will
9+
/// also create events for failed requests if <see cref="SentryOptions.CaptureFailedRequests"/> is enabled.
910
/// </summary>
1011
public class SentryHttpMessageHandler : SentryMessageHandler
1112
{

src/Sentry/SentryOptions.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,14 @@ public StackTraceMode StackTraceMode
10661066
/// </summary>
10671067
internal Instrumenter Instrumenter { get; set; } = Instrumenter.Sentry;
10681068

1069+
/// <summary>
1070+
/// <para>
1071+
/// Set to `true` to prevents Sentry from automatically registering <see cref="SentryHttpMessageHandler"/>.
1072+
/// </para>
1073+
/// <para>Defaults to `false`. Should be set to `true` when using the OpenTelemetry.Instrumentation.Http.</para>
1074+
/// </summary>
1075+
public bool DisableSentryHttpMessageHandler { get; set; } = false;
1076+
10691077
/// <summary>
10701078
/// Adds a <see cref="JsonConverter"/> to be used when serializing or deserializing
10711079
/// objects to JSON with this SDK. For example, when custom context data might use
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using Microsoft.Extensions.Http;
2+
3+
namespace Sentry.Extensions.Logging.Tests;
4+
5+
public class SentryHttpMessageHandlerBuilderFilterTests
6+
{
7+
[SkippableFact]
8+
public void Configure_HandlerEnabled_ShouldAddSentryHttpMessageHandler()
9+
{
10+
#if __ANDROID__
11+
Skip.If(true, "Can't create proxies for classes without parameterless constructors on Android");
12+
#endif
13+
14+
// Arrange
15+
var hub = Substitute.For<IHub>();
16+
SentryClientExtensions.SentryOptionsForTestingOnly = new SentryOptions { DisableSentryHttpMessageHandler = false };
17+
18+
var filter = new SentryHttpMessageHandlerBuilderFilter(() => hub);
19+
var handlerBuilder = Substitute.For<HttpMessageHandlerBuilder>();
20+
handlerBuilder.AdditionalHandlers.Returns(new List<DelegatingHandler>());
21+
Action<HttpMessageHandlerBuilder> next = _ => { };
22+
23+
// Act
24+
var configure = filter.Configure(next);
25+
configure(handlerBuilder);
26+
27+
// Assert
28+
handlerBuilder.AdditionalHandlers.Should().ContainSingle(h => h is SentryHttpMessageHandler);
29+
}
30+
31+
[SkippableFact]
32+
public void Configure_HandlerDisabled_ShouldNotAddSentryHttpMessageHandler()
33+
{
34+
#if __ANDROID__
35+
Skip.If(true, "Can't create proxies for classes without parameterless constructors on Android");
36+
#endif
37+
38+
// Arrange
39+
var hub = Substitute.For<IHub>();
40+
SentryClientExtensions.SentryOptionsForTestingOnly = new SentryOptions { DisableSentryHttpMessageHandler = true };
41+
42+
var filter = new SentryHttpMessageHandlerBuilderFilter(() => hub);
43+
var handlerBuilder = Substitute.For<HttpMessageHandlerBuilder>();
44+
handlerBuilder.AdditionalHandlers.Returns(new List<DelegatingHandler>());
45+
Action<HttpMessageHandlerBuilder> next = _ => { };
46+
47+
// Act
48+
var configure = filter.Configure(next);
49+
configure(handlerBuilder);
50+
51+
// Assert
52+
handlerBuilder.AdditionalHandlers.Should().NotContain(h => h is SentryHttpMessageHandler);
53+
}
54+
}

test/Sentry.Tests/ApiApprovalTests.Run.DotNet8_0.verified.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,7 @@ namespace Sentry
664664
public Sentry.SentryLevel DiagnosticLevel { get; set; }
665665
public Sentry.Extensibility.IDiagnosticLogger? DiagnosticLogger { get; set; }
666666
public bool DisableFileWrite { get; set; }
667+
public bool DisableSentryHttpMessageHandler { get; set; }
667668
public string? Distribution { get; set; }
668669
public string? Dsn { get; set; }
669670
public bool EnableScopeSync { get; set; }

test/Sentry.Tests/ApiApprovalTests.Run.DotNet9_0.verified.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,7 @@ namespace Sentry
664664
public Sentry.SentryLevel DiagnosticLevel { get; set; }
665665
public Sentry.Extensibility.IDiagnosticLogger? DiagnosticLogger { get; set; }
666666
public bool DisableFileWrite { get; set; }
667+
public bool DisableSentryHttpMessageHandler { get; set; }
667668
public string? Distribution { get; set; }
668669
public string? Dsn { get; set; }
669670
public bool EnableScopeSync { get; set; }

test/Sentry.Tests/ApiApprovalTests.Run.Net4_8.verified.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,7 @@ namespace Sentry
651651
public Sentry.SentryLevel DiagnosticLevel { get; set; }
652652
public Sentry.Extensibility.IDiagnosticLogger? DiagnosticLogger { get; set; }
653653
public bool DisableFileWrite { get; set; }
654+
public bool DisableSentryHttpMessageHandler { get; set; }
654655
public string? Distribution { get; set; }
655656
public string? Dsn { get; set; }
656657
public bool EnableScopeSync { get; set; }

0 commit comments

Comments
 (0)