77from aiohttp .client import ServerDisconnectedError
88from aiohttp .web_request import Request
99
10- from sentry_sdk import capture_message
10+ from sentry_sdk import capture_message , start_transaction
1111from sentry_sdk .integrations .aiohttp import AioHttpIntegration
1212
1313try :
@@ -54,6 +54,8 @@ async def hello(request):
5454 "Accept-Encoding" : "gzip, deflate" ,
5555 "Host" : host ,
5656 "User-Agent" : request ["headers" ]["User-Agent" ],
57+ "baggage" : mock .ANY ,
58+ "sentry-trace" : mock .ANY ,
5759 }
5860
5961
@@ -372,11 +374,13 @@ async def hello(request):
372374
373375 events = capture_events ()
374376
375- trace_id = "582b43a4192642f0b136d5159a501701"
376- sentry_trace_header = "{}-{}-{}" .format (trace_id , "6e8f22c393e68f19" , 1 )
377-
377+ # The aiohttp_client is instrumented so will generate the sentry-trace header and add request.
378+ # Get the sentry-trace header from the request so we can later compare with transaction events.
378379 client = await aiohttp_client (app )
379- resp = await client .get ("/" , headers = {"sentry-trace" : sentry_trace_header })
380+ resp = await client .get ("/" )
381+ sentry_trace_header = resp .request_info .headers .get ("sentry-trace" )
382+ trace_id = sentry_trace_header .split ("-" )[0 ]
383+
380384 assert resp .status == 500
381385
382386 msg_event , error_event , transaction_event = events
@@ -410,11 +414,13 @@ async def hello(request):
410414
411415 events = capture_events ()
412416
413- trace_id = "582b43a4192642f0b136d5159a501701"
414- sentry_trace_header = "{}-{}-{}" .format (trace_id , "6e8f22c393e68f19" , 1 )
415-
417+ # The aiohttp_client is instrumented so will generate the sentry-trace header and add request.
418+ # Get the sentry-trace header from the request so we can later compare with transaction events.
416419 client = await aiohttp_client (app )
417- resp = await client .get ("/" , headers = {"sentry-trace" : sentry_trace_header })
420+ resp = await client .get ("/" )
421+ sentry_trace_header = resp .request_info .headers .get ("sentry-trace" )
422+ trace_id = sentry_trace_header .split ("-" )[0 ]
423+
418424 assert resp .status == 500
419425
420426 msg_event , error_event = events
@@ -427,3 +433,75 @@ async def hello(request):
427433
428434 assert msg_event ["contexts" ]["trace" ]["trace_id" ] == trace_id
429435 assert error_event ["contexts" ]["trace" ]["trace_id" ] == trace_id
436+
437+
438+ @pytest .mark .asyncio
439+ async def test_crumb_capture (
440+ sentry_init , aiohttp_raw_server , aiohttp_client , loop , capture_events
441+ ):
442+ def before_breadcrumb (crumb , hint ):
443+ crumb ["data" ]["extra" ] = "foo"
444+ return crumb
445+
446+ sentry_init (
447+ integrations = [AioHttpIntegration ()], before_breadcrumb = before_breadcrumb
448+ )
449+
450+ async def handler (request ):
451+ return web .Response (text = "OK" )
452+
453+ raw_server = await aiohttp_raw_server (handler )
454+
455+ with start_transaction ():
456+ events = capture_events ()
457+
458+ client = await aiohttp_client (raw_server )
459+ resp = await client .get ("/" )
460+ assert resp .status == 200
461+ capture_message ("Testing!" )
462+
463+ (event ,) = events
464+
465+ crumb = event ["breadcrumbs" ]["values" ][0 ]
466+ assert crumb ["type" ] == "http"
467+ assert crumb ["category" ] == "httplib"
468+ assert crumb ["data" ] == {
469+ "url" : "http://127.0.0.1:{}/" .format (raw_server .port ),
470+ "http.fragment" : "" ,
471+ "http.method" : "GET" ,
472+ "http.query" : "" ,
473+ "http.response.status_code" : 200 ,
474+ "reason" : "OK" ,
475+ "extra" : "foo" ,
476+ }
477+
478+
479+ @pytest .mark .asyncio
480+ async def test_outgoing_trace_headers (sentry_init , aiohttp_raw_server , aiohttp_client ):
481+ sentry_init (
482+ integrations = [AioHttpIntegration ()],
483+ traces_sample_rate = 1.0 ,
484+ )
485+
486+ async def handler (request ):
487+ return web .Response (text = "OK" )
488+
489+ raw_server = await aiohttp_raw_server (handler )
490+
491+ with start_transaction (
492+ name = "/interactions/other-dogs/new-dog" ,
493+ op = "greeting.sniff" ,
494+ # make trace_id difference between transactions
495+ trace_id = "0123456789012345678901234567890" ,
496+ ) as transaction :
497+ client = await aiohttp_client (raw_server )
498+ resp = await client .get ("/" )
499+ request_span = transaction ._span_recorder .spans [- 1 ]
500+
501+ assert resp .request_info .headers [
502+ "sentry-trace"
503+ ] == "{trace_id}-{parent_span_id}-{sampled}" .format (
504+ trace_id = transaction .trace_id ,
505+ parent_span_id = request_span .span_id ,
506+ sampled = 1 ,
507+ )
0 commit comments