Skip to content

Commit 0a688f2

Browse files
committed
feat: add W3C header support to tracing client and utils
1 parent 4c72876 commit 0a688f2

File tree

4 files changed

+55
-0
lines changed

4 files changed

+55
-0
lines changed

dart/lib/src/http_client/tracing_client.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class TracingClient extends BaseClient {
5050
_hub.options.tracePropagationTargets, request.url.toString())) {
5151
if (span != null) {
5252
addSentryTraceHeaderFromSpan(span, request.headers);
53+
addW3CHeaderFromSpan(span, request.headers);
5354
addBaggageHeaderFromSpan(
5455
span,
5556
request.headers,
@@ -61,6 +62,7 @@ class TracingClient extends BaseClient {
6162

6263
final traceHeader = propagationContext.toSentryTrace();
6364
addSentryTraceHeader(traceHeader, request.headers);
65+
addW3CHeaderFromSentryTrace(traceHeader, request.headers);
6466

6567
final baggage = propagationContext.baggage;
6668
if (baggage != null) {

dart/lib/src/utils/tracing_utils.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,22 @@ void addSentryTraceHeader(
1111
headers[traceHeader.name] = traceHeader.value;
1212
}
1313

14+
void addW3CHeaderFromSpan(ISentrySpan span, Map<String, dynamic> headers) {
15+
final traceHeader = span.toSentryTrace();
16+
addW3CHeaderFromSentryTrace(traceHeader, headers);
17+
}
18+
19+
void addW3CHeaderFromSentryTrace(
20+
SentryTraceHeader traceHeader, Map<String, dynamic> headers) {
21+
headers['traceparent'] = formatAsW3CHeader(traceHeader);
22+
}
23+
24+
String formatAsW3CHeader(SentryTraceHeader traceHeader) {
25+
final sampled = traceHeader.sampled;
26+
final traceFlags = sampled != null && sampled ? '01' : '00';
27+
return '00-${traceHeader.traceId}-${traceHeader.spanId}-$traceFlags';
28+
}
29+
1430
void addBaggageHeaderFromSpan(
1531
ISentrySpan span,
1632
Map<String, dynamic> headers, {

dart/test/utils/tracing_utils_test.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,41 @@ void main() {
112112
expect(headers[baggage.name], newValue);
113113
});
114114

115+
group('$addW3CHeaderFromSentryTrace', () {
116+
final fixture = Fixture();
117+
final headerName = 'traceparent';
118+
final headerValue =
119+
'00-${fixture._context.traceId}-${fixture._context.spanId}-01';
120+
121+
test('formats SentryTraceHeader as W3C header', () {
122+
final sut = fixture.getSut();
123+
final sentryHeader = sut.toSentryTrace();
124+
125+
final w3cHeader = formatAsW3CHeader(sentryHeader);
126+
127+
expect(w3cHeader, headerValue);
128+
});
129+
130+
test('adds W3C traceparent from span', () {
131+
final headers = <String, String>{};
132+
final sut = fixture.getSut();
133+
134+
addW3CHeaderFromSpan(sut, headers);
135+
136+
expect(headers[headerName], headerValue);
137+
});
138+
139+
test('adds W3C traceparent header', () {
140+
final headers = <String, String>{};
141+
final sut = fixture.getSut();
142+
final sentryHeader = sut.toSentryTrace();
143+
144+
addW3CHeaderFromSentryTrace(sentryHeader, headers);
145+
146+
expect(headers[headerName], headerValue);
147+
});
148+
});
149+
115150
test('overwrites duplicate key values', () {
116151
final headers = <String, String>{};
117152
final oldValue =

dio/lib/src/tracing_client_adapter.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class TracingClientAdapter implements HttpClientAdapter {
5858
)) {
5959
if (span != null) {
6060
addSentryTraceHeaderFromSpan(span, options.headers);
61+
addW3CHeaderFromSpan(span, request.headers);
6162
addBaggageHeaderFromSpan(
6263
span,
6364
options.headers,
@@ -72,6 +73,7 @@ class TracingClientAdapter implements HttpClientAdapter {
7273

7374
final traceHeader = propagationContext.toSentryTrace();
7475
addSentryTraceHeader(traceHeader, options.headers);
76+
addW3CHeaderFromSentryTrace(traceHeader, options.headers);
7577

7678
final baggage = propagationContext.baggage;
7779
if (baggage != null) {

0 commit comments

Comments
 (0)