Skip to content

Commit 4818a25

Browse files
committed
feat: Implement TryGetW3CTraceHeader in Middlewares and Extensions
1 parent cffea5c commit 4818a25

File tree

4 files changed

+48
-0
lines changed

4 files changed

+48
-0
lines changed

src/Sentry.AspNetCore/Extensions/HttpContextExtensions.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,27 @@ internal static class HttpContextExtensions
6363
options?.LogError(ex, "Invalid Sentry trace header '{0}'.", value);
6464
return null;
6565
}
66+
}
67+
68+
public static W3CTraceHeader? TryGetW3CTraceHeader(this HttpContext context, SentryOptions? options)
69+
{
70+
var value = context.Request.Headers.GetValueOrDefault(W3CTraceHeader.HttpHeaderName);
71+
if (string.IsNullOrWhiteSpace(value))
72+
{
73+
return null;
74+
}
75+
76+
options?.LogDebug("Received Sentry trace header '{0}'.", value);
77+
78+
try
79+
{
80+
return W3CTraceHeader.Parse(value!);
81+
}
82+
catch (Exception ex)
83+
{
84+
options?.LogError(ex, "Invalid Sentry trace header '{0}'.", value);
85+
return null;
86+
}
6687
}
6788

6889
public static BaggageHeader? TryGetBaggageHeader(this HttpContext context, SentryOptions? options)

src/Sentry.AspNetCore/SentryMiddleware.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ public async Task InvokeAsync(HttpContext context, RequestDelegate next)
106106
}
107107

108108
var traceHeader = context.TryGetSentryTraceHeader(_options);
109+
traceHeader ??= context.TryGetW3CTraceHeader(_options)?.SentryTraceHeader;
109110
var baggageHeader = context.TryGetBaggageHeader(_options);
110111
var transactionContext = hub.ContinueTrace(traceHeader, baggageHeader);
111112

src/Sentry.Azure.Functions.Worker/HttpRequestDataExtensions.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,31 @@ internal static class HttpRequestDataExtensions
3030
}
3131
}
3232

33+
public static W3CTraceHeader? TryGetW3CTraceHeader(this HttpRequestData context, IDiagnosticLogger? logger)
34+
{
35+
var traceHeaderValue = context.Headers.TryGetValues(W3CTraceHeader.HttpHeaderName, out var values)
36+
? values.FirstOrDefault()
37+
: null;
38+
39+
if (traceHeaderValue is null)
40+
{
41+
logger?.LogDebug("Did not receive a Sentry trace header.");
42+
return null;
43+
}
44+
45+
logger?.LogDebug("Received Sentry trace header '{0}'.", traceHeaderValue);
46+
47+
try
48+
{
49+
return W3CTraceHeader.Parse(traceHeaderValue);
50+
}
51+
catch (Exception ex)
52+
{
53+
logger?.LogError(ex, "Invalid Sentry trace header '{0}'.", traceHeaderValue);
54+
return null;
55+
}
56+
}
57+
3358
public static BaggageHeader? TryGetBaggageHeader(this HttpRequestData context, IDiagnosticLogger? logger)
3459
{
3560
var baggageValue = context.Headers.TryGetValues(BaggageHeader.HttpHeaderName, out var value)

src/Sentry.Azure.Functions.Worker/SentryFunctionsWorkerMiddleware.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ private async Task<TransactionContext> StartOrContinueTraceAsync(FunctionContext
124124
}
125125

126126
var traceHeader = requestData.TryGetSentryTraceHeader(_logger);
127+
traceHeader ??= requestData.TryGetW3CTraceHeader(_logger)?.SentryTraceHeader;
127128
var baggageHeader = requestData.TryGetBaggageHeader(_logger);
128129

129130
return SentrySdk.ContinueTrace(traceHeader, baggageHeader, transactionName, Operation);

0 commit comments

Comments
 (0)