From 21c7fc10d5d7448380cc0b57a7a6a689cf31c0ef Mon Sep 17 00:00:00 2001 From: Bruno Garcia Date: Sat, 7 Jun 2025 13:59:13 -0400 Subject: [PATCH 1/5] use correct parent span in http --- src/Sentry/SentryMessageHandler.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Sentry/SentryMessageHandler.cs b/src/Sentry/SentryMessageHandler.cs index 8784ef1822..60c5b05ad5 100644 --- a/src/Sentry/SentryMessageHandler.cs +++ b/src/Sentry/SentryMessageHandler.cs @@ -86,7 +86,7 @@ protected override async Task SendAsync( var span = ProcessRequest(request, method, url); try { - PropagateTraceHeaders(request, url); + PropagateTraceHeaders(request, url, span); var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false); HandleResponse(response, span, method, url); return response; @@ -108,7 +108,7 @@ protected override HttpResponseMessage Send(HttpRequestMessage request, Cancella var span = ProcessRequest(request, method, url); try { - PropagateTraceHeaders(request, url); + PropagateTraceHeaders(request, url, span); var response = base.Send(request, cancellationToken); HandleResponse(response, span, method, url); return response; @@ -121,7 +121,7 @@ protected override HttpResponseMessage Send(HttpRequestMessage request, Cancella } #endif - private void PropagateTraceHeaders(HttpRequestMessage request, string url) + private void PropagateTraceHeaders(HttpRequestMessage request, string url, ISpan? parentSpan) { // Assign a default inner handler for convenience the first time this is used. // We can't do this in a constructor, or it will throw when used with HttpMessageHandlerBuilderFilter. @@ -135,15 +135,17 @@ private void PropagateTraceHeaders(HttpRequestMessage request, string url) if (_options?.TracePropagationTargets.MatchesSubstringOrRegex(url) is true or null) { - AddSentryTraceHeader(request); + AddSentryTraceHeader(request, parentSpan); AddBaggageHeader(request); } } - private void AddSentryTraceHeader(HttpRequestMessage request) + private void AddSentryTraceHeader(HttpRequestMessage request, ISpan? parentSpan) { // Set trace header if it hasn't already been set - if (!request.Headers.Contains(SentryTraceHeader.HttpHeaderName) && _hub.GetTraceHeader() is { } traceHeader) + if (!request.Headers.Contains(SentryTraceHeader.HttpHeaderName) && + // Use the span created by this integration as parent, instead of its own parent + (parentSpan?.GetTraceHeader() ?? _hub.GetTraceHeader()) is { } traceHeader) { request.Headers.Add(SentryTraceHeader.HttpHeaderName, traceHeader.ToString()); } From 0233ca2c4918d344c4a517cf67a686636fb2642f Mon Sep 17 00:00:00 2001 From: Bruno Garcia Date: Sat, 7 Jun 2025 14:23:03 -0400 Subject: [PATCH 2/5] test --- .../SentryHttpMessageHandlerTests.cs | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/test/Sentry.Tests/SentryHttpMessageHandlerTests.cs b/test/Sentry.Tests/SentryHttpMessageHandlerTests.cs index 7cc372f5b9..a2783714a9 100644 --- a/test/Sentry.Tests/SentryHttpMessageHandlerTests.cs +++ b/test/Sentry.Tests/SentryHttpMessageHandlerTests.cs @@ -33,6 +33,40 @@ public async Task SendAsync_SentryTraceHeaderNotSet_SetsHeader_ByDefault() string.Concat(h.Value) == "75302ac48a024bde9a3b3734a82e36c8-1000000000000000-0"); } + [Fact] + public async Task SendAsync_SentryTraceHeaderNotSet_SetsHeader_ToCorrectParent() + { + // Arrange + var hub = Substitute.For(); + + const string rootTraceHeader = "75302ac48a024bde9a3b3734a82e36c8-1000000000000000-1"; + hub.GetTraceHeader().ReturnsForAnyArgs( + SentryTraceHeader.Parse(rootTraceHeader)); + var parentSpan = Substitute.For(); + parentSpan.GetTraceHeader().ReturnsForAnyArgs( + SentryTraceHeader.Parse(rootTraceHeader)); + hub.GetSpan().ReturnsForAnyArgs(parentSpan); + const string httpSpanTraceHeader = "75302ac48a024bde9a3b3734a82e36c8-2000000000000000-1"; + var httpSpan = Substitute.For(); + httpSpan.GetTraceHeader().ReturnsForAnyArgs( + SentryTraceHeader.Parse(httpSpanTraceHeader)); + parentSpan.StartChild(Arg.Any()).ReturnsForAnyArgs(httpSpan); + + using var innerHandler = new RecordingHttpMessageHandler(new FakeHttpMessageHandler()); + using var sentryHandler = new SentryHttpMessageHandler(innerHandler, hub); + using var client = new HttpClient(sentryHandler); + + // Act + await client.GetAsync("https://localhost/"); + + using var request = innerHandler.GetRequests().Single(); + + // Assert + request.Headers.Should().Contain(h => + h.Key == "sentry-trace" && + string.Concat(h.Value) == httpSpanTraceHeader); + } + [Fact] public async Task SendAsync_SentryTraceHeaderNotSet_SetsHeader_WhenUrlMatchesPropagationOptions() { From 18fae46ebcc9c5ae8a63c203cf1a89732a56da8d Mon Sep 17 00:00:00 2001 From: Bruno Garcia Date: Sat, 7 Jun 2025 14:29:52 -0400 Subject: [PATCH 3/5] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1530a40d9..67fdc8d632 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Fixes + +- The HTTP instrumentation uses the span created for the outgoing request in the sentry-trace header, fixing the parent-child relationship between client and server ([#4264](https://github.com/getsentry/sentry-dotnet/pull/4264)) + ### Dependencies - Bump Native SDK from v0.8.5 to v0.9.0 ([#4260](https://github.com/getsentry/sentry-dotnet/pull/4260)) From 46556276a69e45faae06a2e0a9b4ec30da8bf5d0 Mon Sep 17 00:00:00 2001 From: getsentry-bot Date: Sat, 7 Jun 2025 18:35:04 +0000 Subject: [PATCH 4/5] release: 5.11.0-alpha.1 --- CHANGELOG.md | 2 +- Directory.Build.props | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67fdc8d632..15c8368cbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Unreleased +## 5.11.0-alpha.1 ### Fixes diff --git a/Directory.Build.props b/Directory.Build.props index f4b108ce6e..1ebda328c4 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - 5.10.0 + 5.11.0-alpha.1 13 true true From 59fb4e8322e94d8e1ae26a78cd24dc2702760978 Mon Sep 17 00:00:00 2001 From: Bruno Garcia Date: Sat, 7 Jun 2025 16:38:15 -0400 Subject: [PATCH 5/5] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15c8368cbd..67fdc8d632 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 5.11.0-alpha.1 +## Unreleased ### Fixes