Skip to content

Commit b5bf667

Browse files
committed
feat(tracing): add support for W3C traceparent header in SentryPropagator and enhance tests
1 parent 395e3e5 commit b5bf667

File tree

4 files changed

+78
-5
lines changed

4 files changed

+78
-5
lines changed

sentry_sdk/integrations/opentelemetry/propagator.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from sentry_sdk.tracing import (
2929
BAGGAGE_HEADER_NAME,
3030
SENTRY_TRACE_HEADER_NAME,
31+
W3C_TRACE_HEADER_NAME,
3132
)
3233
from sentry_sdk.tracing_utils import Baggage, extract_sentrytrace_data
3334

@@ -103,6 +104,7 @@ def inject(self, carrier, context=None, setter=default_setter):
103104
return
104105

105106
setter.set(carrier, SENTRY_TRACE_HEADER_NAME, sentry_span.to_traceparent())
107+
setter.set(carrier, W3C_TRACE_HEADER_NAME, sentry_span.to_w3c_traceparent())
106108

107109
if sentry_span.containing_transaction:
108110
baggage = sentry_span.containing_transaction.get_baggage()
@@ -114,4 +116,4 @@ def inject(self, carrier, context=None, setter=default_setter):
114116
@property
115117
def fields(self):
116118
# type: () -> Set[str]
117-
return {SENTRY_TRACE_HEADER_NAME, BAGGAGE_HEADER_NAME}
119+
return {SENTRY_TRACE_HEADER_NAME, BAGGAGE_HEADER_NAME, W3C_TRACE_HEADER_NAME}

tests/integrations/asgi/test_asgi.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,77 @@ async def test_trace_from_headers_if_performance_disabled(
367367
assert error_event["contexts"]["trace"]["trace_id"] == trace_id
368368

369369

370+
@pytest.mark.asyncio
371+
async def test_trace_from_w3c_headers_if_performance_enabled(
372+
sentry_init,
373+
asgi3_app_with_error_and_msg,
374+
capture_events,
375+
):
376+
sentry_init(traces_sample_rate=1.0)
377+
app = SentryAsgiMiddleware(asgi3_app_with_error_and_msg)
378+
379+
trace_id = "582b43a4192642f0b136d5159a501701"
380+
w3c_trace_header = "00-{}-{}-{}".format(trace_id, "6e8f22c393e68f19", "01")
381+
382+
with pytest.raises(ZeroDivisionError):
383+
async with TestClient(app) as client:
384+
events = capture_events()
385+
await client.get(
386+
"/",
387+
headers={
388+
"traceparent": w3c_trace_header,
389+
},
390+
)
391+
392+
msg_event, error_event, transaction_event = events
393+
394+
assert msg_event["contexts"]["trace"]
395+
assert "trace_id" in msg_event["contexts"]["trace"]
396+
397+
assert error_event["contexts"]["trace"]
398+
assert "trace_id" in error_event["contexts"]["trace"]
399+
400+
assert transaction_event["contexts"]["trace"]
401+
assert "trace_id" in transaction_event["contexts"]["trace"]
402+
403+
assert msg_event["contexts"]["trace"]["trace_id"] == trace_id
404+
assert error_event["contexts"]["trace"]["trace_id"] == trace_id
405+
assert transaction_event["contexts"]["trace"]["trace_id"] == trace_id
406+
407+
408+
@pytest.mark.asyncio
409+
async def test_trace_from_w3c_headers_if_performance_disabled(
410+
sentry_init,
411+
asgi3_app_with_error_and_msg,
412+
capture_events,
413+
):
414+
sentry_init()
415+
app = SentryAsgiMiddleware(asgi3_app_with_error_and_msg)
416+
417+
trace_id = "582b43a4192642f0b136d5159a501701"
418+
w3c_trace_header = "00-{}-{}-{}".format(trace_id, "6e8f22c393e68f19", "01")
419+
420+
with pytest.raises(ZeroDivisionError):
421+
async with TestClient(app) as client:
422+
events = capture_events()
423+
await client.get(
424+
"/",
425+
headers={
426+
"traceparent": w3c_trace_header,
427+
},
428+
)
429+
430+
msg_event, error_event = events
431+
432+
assert msg_event["contexts"]["trace"]
433+
assert "trace_id" in msg_event["contexts"]["trace"]
434+
assert msg_event["contexts"]["trace"]["trace_id"] == trace_id
435+
436+
assert error_event["contexts"]["trace"]
437+
assert "trace_id" in error_event["contexts"]["trace"]
438+
assert error_event["contexts"]["trace"]["trace_id"] == trace_id
439+
440+
370441
@pytest.mark.asyncio
371442
async def test_websocket(sentry_init, asgi3_ws_app, capture_events, request):
372443
sentry_init(send_default_pii=True)

tests/integrations/opentelemetry/test_propagator.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ def test_inject_sentry_span_no_baggage():
192192
full_context = set_span_in_context(span, context)
193193
SentryPropagator().inject(carrier, full_context, setter)
194194

195-
setter.set.assert_called_once_with(
195+
setter.set.assert_any_call(
196196
carrier,
197197
"sentry-trace",
198198
"1234567890abcdef1234567890abcdef-1234567890abcdef-1",
@@ -237,7 +237,7 @@ def test_inject_w3c_span_no_baggage():
237237
full_context = set_span_in_context(span, context)
238238
SentryPropagator().inject(carrier, full_context, setter)
239239

240-
setter.set.assert_called_once_with(
240+
setter.set.assert_any_call(
241241
carrier,
242242
"traceparent",
243243
"00-ec2da13ee483f41e7323f8c78ed8f4e4-4c6d5fcab571acb0-01",
@@ -281,7 +281,7 @@ def test_inject_sentry_span_empty_baggage():
281281
full_context = set_span_in_context(span, context)
282282
SentryPropagator().inject(carrier, full_context, setter)
283283

284-
setter.set.assert_called_once_with(
284+
setter.set.assert_any_call(
285285
carrier,
286286
"sentry-trace",
287287
"1234567890abcdef1234567890abcdef-1234567890abcdef-1",

tests/integrations/tornado/test_tornado.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ def test_error_has_existing_w3c_trace_context_performance_enabled(
416416
trace_id = "d6a6892c89ff99522ab2041c4cd71a68"
417417
parent_span_id = "6fac8cb0c8a904d0"
418418
parent_sampled = "01"
419-
w3c_trace_header = "{}-{}-{}".format(trace_id, parent_span_id, parent_sampled)
419+
w3c_trace_header = "00-{}-{}-{}".format(trace_id, parent_span_id, parent_sampled)
420420

421421
headers = {"traceparent": w3c_trace_header}
422422

0 commit comments

Comments
 (0)