Skip to content

Commit 7707813

Browse files
fix: Unsampled spans no longer propagate empty trace headers (#4302)
Resolves #4301
1 parent cb61400 commit 7707813

File tree

5 files changed

+54
-1
lines changed

5 files changed

+54
-1
lines changed

CHANGELOG.md

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

3+
## Unreleased
4+
5+
### Fixes
6+
7+
- Unsampled spans no longer propagate empty trace headers ([#4302](https://github.com/getsentry/sentry-dotnet/pull/4302))
8+
39
## 5.11.1
410

511
### Fixes

src/Sentry.AspNetCore/Extensions/HttpContextExtensions.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,14 @@ internal static class HttpContextExtensions
5656

5757
try
5858
{
59-
return SentryTraceHeader.Parse(value!);
59+
var traceHeader = SentryTraceHeader.Parse(value!);
60+
if (traceHeader?.TraceId != SentryId.Empty)
61+
{
62+
return traceHeader;
63+
}
64+
65+
options?.LogWarning("Sentry trace header '{0}' has an empty trace ID.", value);
66+
return null;
6067
}
6168
catch (Exception ex)
6269
{

src/Sentry/Internal/UnsampledSpan.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ internal sealed class UnsampledSpan(UnsampledTransaction transaction, SpanId? sp
66
public override SpanId SpanId { get; } = spanId ?? SpanId.Empty;
77
internal UnsampledTransaction Transaction => transaction;
88
public override ISpan StartChild(string operation) => transaction.StartChild(operation);
9+
public override SentryTraceHeader GetTraceHeader() => transaction.GetTraceHeader();
910
}

test/Sentry.AspNetCore.Tests/Extensions/HttpContextExtensionsTests.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,20 @@ public void TryGetRouteTemplate_WithSentryRouteName_RouteName()
7878
// Assert
7979
Assert.Equal(expectedName, filteredRoute);
8080
}
81+
82+
[Fact]
83+
public void TryGetSentryTraceHeader_WithEmptyTraceId_ReturnsNull()
84+
{
85+
// Arrange
86+
var httpContext = Fixture.GetSut();
87+
var options = new SentryOptions();
88+
httpContext.Request.Headers.Append(SentryTraceHeader.HttpHeaderName, "00000000000000000000000000000000-1000000000000000-1");
89+
90+
// Act
91+
var header = httpContext.TryGetSentryTraceHeader(options);
92+
93+
// Assert
94+
Assert.Null(header);
95+
}
8196
}
8297
#endif
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
namespace Sentry.Tests.Internals;
2+
3+
public class UnsampledSpanTests
4+
{
5+
[Fact]
6+
public void GetTraceHeader_CreatesHeaderFromUnsampledTransaction()
7+
{
8+
// Arrange
9+
var hub = Substitute.For<IHub>();
10+
ITransactionContext context = new TransactionContext("TestTransaction", "TestOperation",
11+
new SentryTraceHeader(SentryId.Create(), SpanId.Create(), false)
12+
);
13+
var transaction = new UnsampledTransaction(hub, context);
14+
var unsampledSpan = transaction.StartChild("Foo");
15+
16+
// Act
17+
var traceHeader = unsampledSpan.GetTraceHeader();
18+
19+
// Assert
20+
traceHeader.TraceId.Should().Be(context.TraceId);
21+
traceHeader.SpanId.Should().Be(context.SpanId);
22+
traceHeader.IsSampled.Should().Be(context.IsSampled);
23+
}
24+
}

0 commit comments

Comments
 (0)