Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## Unreleased

### Fixes

- Revert W3C traceparent support ([#4204](https://github.com/getsentry/sentry-dotnet/pull/4204))

## 5.8.0

### Features
Expand Down
24 changes: 0 additions & 24 deletions src/Sentry.AspNet/HttpContextExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,6 @@ public static class HttpContextExtensions
}
}

private static W3CTraceHeader? TryGetW3CTraceHeader(HttpContext context, SentryOptions? options)
{
var value = context.Request.Headers.Get(W3CTraceHeader.HttpHeaderName);
if (string.IsNullOrWhiteSpace(value))
{
return null;
}

options?.LogDebug("Received Sentry trace header '{0}'.", value);

try
{
return W3CTraceHeader.Parse(value);
}
catch (Exception ex)
{
options?.LogError(ex, "Invalid Sentry trace header '{0}'.", value);
return null;
}
}

private static BaggageHeader? TryGetBaggageHeader(HttpContext context, SentryOptions? options)
{
var value = context.Request.Headers.Get(BaggageHeader.HttpHeaderName);
Expand Down Expand Up @@ -86,10 +65,7 @@ public static void StartOrContinueTrace(this HttpContext httpContext)
{
var options = SentrySdk.CurrentOptions;

// If both sentry-trace and traceparent headers are present, sentry-trace takes precedence.
// See: https://github.com/getsentry/team-sdks/issues/41
var traceHeader = TryGetSentryTraceHeader(httpContext, options);
traceHeader ??= TryGetW3CTraceHeader(httpContext, options)?.SentryTraceHeader;
var baggageHeader = TryGetBaggageHeader(httpContext, options);

var method = httpContext.Request.HttpMethod;
Expand Down
21 changes: 0 additions & 21 deletions src/Sentry.AspNetCore/Extensions/HttpContextExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,27 +65,6 @@ internal static class HttpContextExtensions
}
}

public static W3CTraceHeader? TryGetW3CTraceHeader(this HttpContext context, SentryOptions? options)
{
var value = context.Request.Headers.GetValueOrDefault(W3CTraceHeader.HttpHeaderName);
if (string.IsNullOrWhiteSpace(value))
{
return null;
}

options?.LogDebug("Received Sentry trace header '{0}'.", value);

try
{
return W3CTraceHeader.Parse(value!);
}
catch (Exception ex)
{
options?.LogError(ex, "Invalid Sentry trace header '{0}'.", value);
return null;
}
}

public static BaggageHeader? TryGetBaggageHeader(this HttpContext context, SentryOptions? options)
{
var value = context.Request.Headers.GetValueOrDefault(BaggageHeader.HttpHeaderName);
Expand Down
3 changes: 0 additions & 3 deletions src/Sentry.AspNetCore/SentryMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,7 @@ public async Task InvokeAsync(HttpContext context, RequestDelegate next)
context.Response.OnCompleted(() => hub.FlushAsync(_options.FlushTimeout));
}

// If both sentry-trace and traceparent headers are present, sentry-trace takes precedence.
// See: https://github.com/getsentry/team-sdks/issues/41
var traceHeader = context.TryGetSentryTraceHeader(_options);
traceHeader ??= context.TryGetW3CTraceHeader(_options)?.SentryTraceHeader;
var baggageHeader = context.TryGetBaggageHeader(_options);
var transactionContext = hub.ContinueTrace(traceHeader, baggageHeader);

Expand Down
25 changes: 0 additions & 25 deletions src/Sentry.Azure.Functions.Worker/HttpRequestDataExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,31 +30,6 @@ internal static class HttpRequestDataExtensions
}
}

public static W3CTraceHeader? TryGetW3CTraceHeader(this HttpRequestData context, IDiagnosticLogger? logger)
{
var traceHeaderValue = context.Headers.TryGetValues(W3CTraceHeader.HttpHeaderName, out var values)
? values.FirstOrDefault()
: null;

if (traceHeaderValue is null)
{
logger?.LogDebug("Did not receive a Sentry trace header.");
return null;
}

logger?.LogDebug("Received Sentry trace header '{0}'.", traceHeaderValue);

try
{
return W3CTraceHeader.Parse(traceHeaderValue);
}
catch (Exception ex)
{
logger?.LogError(ex, "Invalid Sentry trace header '{0}'.", traceHeaderValue);
return null;
}
}

public static BaggageHeader? TryGetBaggageHeader(this HttpRequestData context, IDiagnosticLogger? logger)
{
var baggageValue = context.Headers.TryGetValues(BaggageHeader.HttpHeaderName, out var value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,7 @@ private async Task<TransactionContext> StartOrContinueTraceAsync(FunctionContext
TransactionNameCache.TryAdd(transactionNameKey, transactionName);
}

// If both sentry-trace and traceparent headers are present, sentry-trace takes precedence.
// See: https://github.com/getsentry/team-sdks/issues/41
var traceHeader = requestData.TryGetSentryTraceHeader(_logger);
traceHeader ??= requestData.TryGetW3CTraceHeader(_logger)?.SentryTraceHeader;
var baggageHeader = requestData.TryGetBaggageHeader(_logger);

return SentrySdk.ContinueTrace(traceHeader, baggageHeader, transactionName, Operation);
Expand Down
10 changes: 0 additions & 10 deletions src/Sentry/SentryMessageHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,6 @@ private void PropagateTraceHeaders(HttpRequestMessage request, string url)
if (_options?.TracePropagationTargets.MatchesSubstringOrRegex(url) is true or null)
{
AddSentryTraceHeader(request);
AddW3CTraceHeader(request);
AddBaggageHeader(request);
}
}
Expand All @@ -150,15 +149,6 @@ private void AddSentryTraceHeader(HttpRequestMessage request)
}
}

private void AddW3CTraceHeader(HttpRequestMessage request)
{
// Set trace header if it hasn't already been set
if (!request.Headers.Contains(W3CTraceHeader.HttpHeaderName) && _hub.GetTraceHeader() is { } traceHeader)
{
request.Headers.Add(W3CTraceHeader.HttpHeaderName, new W3CTraceHeader(traceHeader).ToString());
}
}

private void AddBaggageHeader(HttpRequestMessage request)
{
var baggage = _hub.GetBaggage();
Expand Down
3 changes: 1 addition & 2 deletions src/Sentry/SentryOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -952,8 +952,7 @@ public double? ProfilesSampleRate
/// <summary>
/// A customizable list of <see cref="StringOrRegex"/> objects, each containing either a
/// substring or regular expression pattern that can be used to control which outgoing HTTP requests
/// will have the <c>sentry-trace</c>, <c>traceparent</c>, and <c>baggage</c> headers propagated,
/// for purposes of distributed tracing.
/// will have the <c>sentry-trace</c> and <c>baggage</c> headers propagated, for purposes of distributed tracing.
/// The default value contains a single value of <c>.*</c>, which matches everything.
/// To disable propagation completely, clear this collection or set it to an empty collection.
/// </summary>
Expand Down
131 changes: 0 additions & 131 deletions src/Sentry/W3CTraceHeader.cs

This file was deleted.

28 changes: 11 additions & 17 deletions test/Sentry.AspNetCore.Tests/SentryMiddlewareTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -682,10 +682,8 @@ public async Task InvokeAsync_InstrumenterOpenTelemetry_SavesScope()
}
}

[Theory]
[InlineData("Sentry-Trace", "4b4d2878507b43d3af7dd8c4ab7a96d9-3cc6fd1337d243de", "4b4d2878507b43d3af7dd8c4ab7a96d9")]
[InlineData("traceparent", "00-4b4d2878507b43d3af7dd8c4ab7a96d8-3cc6fd1337d243de-00", "4b4d2878507b43d3af7dd8c4ab7a96d8")]
public async Task InvokeAsync_RequestContainsSentryHeaders_ContinuesTrace(string headerName, string headerValue, string expectedTraceId)
[Fact]
public async Task InvokeAsync_RequestContainsSentryHeaders_ContinuesTrace()
{
SentryTraceHeader capturedTraceHeader = null;
BaggageHeader capturedBaggageHeader = null;
Expand All @@ -700,7 +698,7 @@ public async Task InvokeAsync_RequestContainsSentryHeaders_ContinuesTrace(string
var request = Substitute.For<HttpRequest>();
var fakeHeaders = new HeaderDictionary
{
{ headerName, headerValue},
{ "Sentry-Trace", "4b4d2878507b43d3af7dd8c4ab7a96d9-3cc6fd1337d243de"},
{ "Baggage", "sentry-trace_id=4b4d2878507b43d3af7dd8c4ab7a96d9, sentry-public_key=eb18e953812b41c3aeb042e666fd3b5c"},
};
_ = request.Headers.Returns(fakeHeaders);
Expand All @@ -712,21 +710,19 @@ public async Task InvokeAsync_RequestContainsSentryHeaders_ContinuesTrace(string
_fixture.Hub.Received().ContinueTrace(Arg.Any<SentryTraceHeader>(), Arg.Any<BaggageHeader>());

Assert.NotNull(capturedTraceHeader);
Assert.Equal(expectedTraceId, capturedTraceHeader.TraceId.ToString());
Assert.Equal("4b4d2878507b43d3af7dd8c4ab7a96d9", capturedTraceHeader.TraceId.ToString());
Assert.NotNull(capturedBaggageHeader);
Assert.Equal("sentry-trace_id=4b4d2878507b43d3af7dd8c4ab7a96d9, sentry-public_key=eb18e953812b41c3aeb042e666fd3b5c", capturedBaggageHeader.ToString());
}

[Theory]
[InlineData("Sentry-Trace", "4b4d2878507b43d3af7dd8c4ab7a96d9-3cc6fd1337d243de", "4b4d2878507b43d3af7dd8c4ab7a96d9")]
[InlineData("traceparent", "00-4b4d2878507b43d3af7dd8c4ab7a96d8-3cc6fd1337d243de-00", "4b4d2878507b43d3af7dd8c4ab7a96d8")]
public async Task InvokeAsync_RequestContainsSentryHeaders_AddsHeadersAndTransactionContextToItems(string headerName, string headerValue, string expectedTraceId)
[Fact]
public async Task InvokeAsync_RequestContainsSentryHeaders_AddsHeadersAndTransactionContextToItems()
{
var sut = _fixture.GetSut();
var request = Substitute.For<HttpRequest>();
var fakeHeaders = new HeaderDictionary
{
{ headerName, headerValue},
{ "Sentry-Trace", "4b4d2878507b43d3af7dd8c4ab7a96d9-3cc6fd1337d243de"},
{ "Baggage", "sentry-trace_id=4b4d2878507b43d3af7dd8c4ab7a96d9, sentry-public_key=eb18e953812b41c3aeb042e666fd3b5c"},
};
var contextItems = new Dictionary<object, object>();
Expand All @@ -745,24 +741,22 @@ public async Task InvokeAsync_RequestContainsSentryHeaders_AddsHeadersAndTransac

var traceHeader = contextItems[SentryMiddleware.TraceHeaderItemKey] as SentryTraceHeader;
Assert.NotNull(traceHeader);
Assert.Equal(expectedTraceId, traceHeader.TraceId.ToString());
Assert.Equal("4b4d2878507b43d3af7dd8c4ab7a96d9", traceHeader.TraceId.ToString());
var baggageHeader = contextItems[SentryMiddleware.BaggageHeaderItemKey] as BaggageHeader;
Assert.NotNull(baggageHeader);
Assert.Equal("sentry-trace_id=4b4d2878507b43d3af7dd8c4ab7a96d9, sentry-public_key=eb18e953812b41c3aeb042e666fd3b5c", baggageHeader.ToString());
var transactionContext = contextItems[SentryMiddleware.BaggageHeaderItemKey] as BaggageHeader;
Assert.NotNull(transactionContext);
}

[Theory]
[InlineData("Sentry-Trace", "4b4d2878507b43d3af7dd8c4ab7a96d9-3cc6fd1337d243de")]
[InlineData("traceparent", "00-4b4d2878507b43d3af7dd8c4ab7a96d8-3cc6fd1337d243de-01")]
public async Task InvokeAsync_InvokingWithTheSameContextTwice_DoesNotThrow(string headerName, string headerValue)
[Fact]
public async Task InvokeAsync_InvokingWithTheSameContextTwice_DoesNotThrow()
{
var sut = _fixture.GetSut();
var request = Substitute.For<HttpRequest>();
var fakeHeaders = new HeaderDictionary
{
{ headerName, headerValue},
{ "Sentry-Trace", "4b4d2878507b43d3af7dd8c4ab7a96d9-3cc6fd1337d243de"},
{ "Baggage", "sentry-trace_id=4b4d2878507b43d3af7dd8c4ab7a96d9, sentry-public_key=eb18e953812b41c3aeb042e666fd3b5c"},
};
var contextItems = new Dictionary<object, object>();
Expand Down
Loading
Loading