@@ -1162,16 +1162,12 @@ async def hello(request):
11621162
11631163 sentry_sdk .flush ()
11641164
1165- # The aiohttp_client fixture is itself sentry-instrumented and emits the
1166- # first http.client segment; the server-side http.server span is the other
1167- # segment. Asserting the exact length confirms no other spans leak in.
1168- assert len (items ) == 2
1169-
1170- server_span , client_span = [item .payload for item in items ]
1165+ # The server-side http.server span is the only segment. The aiohttp_client
1166+ # fixture's outgoing http.client span is suppressed because there is no
1167+ # active span when the test client makes the request.
1168+ assert len (items ) == 1
11711169
1172- assert client_span ["is_segment" ] is True
1173- assert client_span ["attributes" ]["sentry.op" ] == "http.client"
1174- assert client_span ["name" ].startswith ("GET http://127.0.0.1:" )
1170+ (server_span ,) = [item .payload for item in items ]
11751171
11761172 assert server_span ["is_segment" ] is True
11771173 assert (
@@ -1242,7 +1238,7 @@ async def hello(request):
12421238
12431239 sentry_sdk .flush ()
12441240
1245- server_span , _client_segment = [item .payload for item in items ]
1241+ ( server_span ,) = [item .payload for item in items ]
12461242
12471243 # send_default_pii defaults to False, so _filter_headers substitutes
12481244 # sensitive headers with SENSITIVE_DATA_SUBSTITUTE ("[Filtered]"). The
@@ -1282,7 +1278,7 @@ async def hello(request):
12821278
12831279 sentry_sdk .flush ()
12841280
1285- server_span , _client_segment = [item .payload for item in items ]
1281+ ( server_span ,) = [item .payload for item in items ]
12861282
12871283 # With send_default_pii=True, _filter_headers is a no-op and the original
12881284 # value reaches the span attribute.
@@ -1321,8 +1317,8 @@ async def hello(request):
13211317
13221318 sentry_sdk .flush ()
13231319
1324- assert len (items ) == 2
1325- server_segment , client_segment = [item .payload for item in items ]
1320+ assert len (items ) == 1
1321+ ( server_segment ,) = [item .payload for item in items ]
13261322
13271323 if send_pii :
13281324 assert server_segment ["attributes" ]["url.query" ] == "foo=bar&baz=qux"
@@ -1378,8 +1374,8 @@ async def hello(request):
13781374
13791375 sentry_sdk .flush ()
13801376
1381- assert len (items ) == 2
1382- server_segment , client_segment = [item .payload for item in items ]
1377+ assert len (items ) == 1
1378+ ( server_segment ,) = [item .payload for item in items ]
13831379
13841380 assert server_segment ["name" ] == expected_name
13851381 assert server_segment ["is_segment" ]
@@ -1408,21 +1404,14 @@ async def hello(request):
14081404
14091405 sentry_sdk .flush ()
14101406
1411- # 1 error event + 2 spans (server http.server, test client http.client segment )
1412- assert len (items ) == 3
1407+ # 1 error event + 1 span (server http.server)
1408+ assert len (items ) == 2
14131409
14141410 error_event = items [0 ]
14151411 assert error_event .type == "event"
14161412 assert error_event .payload ["exception" ]["values" ][0 ]["type" ] == "ZeroDivisionError"
14171413
1418- server_span , segment = [item .payload for item in items [1 :]]
1419-
1420- assert segment ["is_segment" ] is True
1421- assert segment ["attributes" ]["sentry.op" ] == "http.client"
1422- # The test client receives the 500 response that aiohttp's outer error
1423- # handler synthesizes from the unhandled exception.
1424- assert segment ["attributes" ]["http.response.status_code" ] == 500
1425- assert segment ["status" ] == "error"
1414+ server_span = items [1 ].payload
14261415
14271416 # The integration's generic Exception path reraises without recording
14281417 # http.response.status_code on the server span. StreamedSpan.__exit__
@@ -1456,13 +1445,8 @@ async def hello(request):
14561445
14571446 sentry_sdk .flush ()
14581447
1459- assert len (items ) == 2
1460- server_span , segment = [item .payload for item in items ]
1461-
1462- assert segment ["is_segment" ] is True
1463- assert segment ["attributes" ]["sentry.op" ] == "http.client"
1464- assert segment ["attributes" ]["http.response.status_code" ] == 403
1465- assert segment ["status" ] == "error"
1448+ assert len (items ) == 1
1449+ (server_span ,) = [item .payload for item in items ]
14661450
14671451 assert server_span ["attributes" ]["sentry.op" ] == "http.server"
14681452 assert server_span ["attributes" ]["http.response.status_code" ] == 403
@@ -1493,13 +1477,8 @@ async def hello(request):
14931477
14941478 sentry_sdk .flush ()
14951479
1496- assert len (items ) == 2
1497- server_span , segment = [item .payload for item in items ]
1498-
1499- assert segment ["is_segment" ] is True
1500- assert segment ["attributes" ]["sentry.op" ] == "http.client"
1501- assert segment ["attributes" ]["http.response.status_code" ] == 302
1502- assert segment ["status" ] == "ok"
1480+ assert len (items ) == 1
1481+ (server_span ,) = [item .payload for item in items ]
15031482
15041483 assert server_span ["attributes" ]["sentry.op" ] == "http.server"
15051484 assert server_span ["attributes" ]["http.response.status_code" ] == 302
@@ -1538,18 +1517,13 @@ async def hello(request):
15381517
15391518 sentry_sdk .flush ()
15401519
1541- # 3 spans, finished inner-first:
1520+ # 2 spans, finished inner-first:
15421521 # #0 inner http.client (server -> raw_server)
15431522 # #1 server http.server
1544- # #2 outer http.client segment (test client -> server)
1545- assert len (items ) == 3
1523+ assert len (items ) == 2
15461524
15471525 inner_client_span = items [0 ].payload
15481526 server_span = items [1 ].payload
1549- segment = items [2 ].payload
1550-
1551- assert segment ["is_segment" ] is True
1552- assert segment ["attributes" ]["sentry.op" ] == "http.client"
15531527
15541528 assert server_span ["attributes" ]["sentry.op" ] == "http.server"
15551529
@@ -1596,21 +1570,14 @@ async def handler(request):
15961570
15971571 sentry_sdk .flush ()
15981572
1599- # raw_server bypasses Application._handle, so only the test client's
1600- # outgoing http.client segment is emitted.
1601- assert len (items ) == 1
1602- client_span = items [0 ].payload
1603-
1604- assert client_span ["is_segment" ] is True
1605- assert client_span ["attributes" ]["sentry.op" ] == "http.client"
1606- assert client_span ["name" ].startswith ("GET http://127.0.0.1:" )
1607- assert resp .request_info .headers [
1608- "sentry-trace"
1609- ] == "{trace_id}-{span_id}-{sampled}" .format (
1610- trace_id = client_span ["trace_id" ],
1611- span_id = client_span ["span_id" ],
1612- sampled = 1 ,
1613- )
1573+ # The outgoing http.client span is suppressed because there is no active
1574+ # span when the test client makes the request.
1575+ assert len (items ) == 0
1576+
1577+ # Even though no span is created, the trace propagation headers must still
1578+ # be added to the outgoing request so the trace is not broken.
1579+ assert "sentry-trace" in resp .request_info .headers
1580+ assert "baggage" in resp .request_info .headers
16141581
16151582
16161583@pytest .mark .asyncio
@@ -1640,7 +1607,7 @@ async def hello(request):
16401607
16411608 sentry_sdk .flush ()
16421609
1643- child_span , server_span , client_span = [item .payload for item in items ]
1610+ child_span , server_span = [item .payload for item in items ]
16441611
16451612 if send_default_pii :
16461613 assert server_span ["attributes" ]["user.ip_address" ] == "127.0.0.1"
0 commit comments