Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### Fixes

- Revert W3C traceparent support ([#4204](https://github.com/getsentry/sentry-dotnet/pull/4204))
- Support musl on Linux ([#4188](https://github.com/getsentry/sentry-dotnet/pull/4188))
- Support for Windows ARM64 with Native AOT ([#4187](https://github.com/getsentry/sentry-dotnet/pull/4187))
- Addressed potential performance issue with Sentry.Maui ([#4219](https://github.com/getsentry/sentry-dotnet/pull/4219))
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