7
7
from aiohttp .client import ServerDisconnectedError
8
8
from aiohttp .web_request import Request
9
9
10
- from sentry_sdk import capture_message
10
+ from sentry_sdk import capture_message , start_transaction
11
11
from sentry_sdk .integrations .aiohttp import AioHttpIntegration
12
12
13
13
try :
@@ -54,6 +54,8 @@ async def hello(request):
54
54
"Accept-Encoding" : "gzip, deflate" ,
55
55
"Host" : host ,
56
56
"User-Agent" : request ["headers" ]["User-Agent" ],
57
+ "baggage" : mock .ANY ,
58
+ "sentry-trace" : mock .ANY ,
57
59
}
58
60
59
61
@@ -372,11 +374,13 @@ async def hello(request):
372
374
373
375
events = capture_events ()
374
376
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.
378
379
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
+
380
384
assert resp .status == 500
381
385
382
386
msg_event , error_event , transaction_event = events
@@ -410,11 +414,13 @@ async def hello(request):
410
414
411
415
events = capture_events ()
412
416
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.
416
419
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
+
418
424
assert resp .status == 500
419
425
420
426
msg_event , error_event = events
@@ -427,3 +433,75 @@ async def hello(request):
427
433
428
434
assert msg_event ["contexts" ]["trace" ]["trace_id" ] == trace_id
429
435
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