-
Notifications
You must be signed in to change notification settings - Fork 638
fix(tracing): Skip child span creation in streaming path when no current span (web frameworks) #6810
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
fix(tracing): Skip child span creation in streaming path when no current span (web frameworks) #6810
Changes from all commits
24da80f
dc9ec11
8af72d8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -1162,16 +1162,12 @@ | |
|
|
||
| sentry_sdk.flush() | ||
|
|
||
| # The aiohttp_client fixture is itself sentry-instrumented and emits the | ||
| # first http.client segment; the server-side http.server span is the other | ||
| # segment. Asserting the exact length confirms no other spans leak in. | ||
| assert len(items) == 2 | ||
|
|
||
| server_span, client_span = [item.payload for item in items] | ||
| # The server-side http.server span is the only segment. The aiohttp_client | ||
| # fixture's outgoing http.client span is suppressed because there is no | ||
| # active span when the test client makes the request. | ||
| assert len(items) == 1 | ||
|
|
||
| assert client_span["is_segment"] is True | ||
| assert client_span["attributes"]["sentry.op"] == "http.client" | ||
| assert client_span["name"].startswith("GET http://127.0.0.1:") | ||
| (server_span,) = [item.payload for item in items] | ||
|
|
||
| assert server_span["is_segment"] is True | ||
| assert ( | ||
|
|
@@ -1242,7 +1238,7 @@ | |
|
|
||
| sentry_sdk.flush() | ||
|
|
||
| server_span, _client_segment = [item.payload for item in items] | ||
| (server_span,) = [item.payload for item in items] | ||
|
|
||
| # send_default_pii defaults to False, so _filter_headers substitutes | ||
| # sensitive headers with SENSITIVE_DATA_SUBSTITUTE ("[Filtered]"). The | ||
|
|
@@ -1282,7 +1278,7 @@ | |
|
|
||
| sentry_sdk.flush() | ||
|
|
||
| server_span, _client_segment = [item.payload for item in items] | ||
| (server_span,) = [item.payload for item in items] | ||
|
|
||
| # With send_default_pii=True, _filter_headers is a no-op and the original | ||
| # value reaches the span attribute. | ||
|
|
@@ -1321,8 +1317,8 @@ | |
|
|
||
| sentry_sdk.flush() | ||
|
|
||
| assert len(items) == 2 | ||
| server_segment, client_segment = [item.payload for item in items] | ||
| assert len(items) == 1 | ||
| (server_segment,) = [item.payload for item in items] | ||
|
|
||
| if send_pii: | ||
| assert server_segment["attributes"]["url.query"] == "foo=bar&baz=qux" | ||
|
|
@@ -1378,8 +1374,8 @@ | |
|
|
||
| sentry_sdk.flush() | ||
|
|
||
| assert len(items) == 2 | ||
| server_segment, client_segment = [item.payload for item in items] | ||
| assert len(items) == 1 | ||
| (server_segment,) = [item.payload for item in items] | ||
|
|
||
| assert server_segment["name"] == expected_name | ||
| assert server_segment["is_segment"] | ||
|
|
@@ -1408,21 +1404,14 @@ | |
|
|
||
| sentry_sdk.flush() | ||
|
|
||
| # 1 error event + 2 spans (server http.server, test client http.client segment) | ||
| assert len(items) == 3 | ||
| # 1 error event + 1 span (server http.server) | ||
| assert len(items) == 2 | ||
|
|
||
| error_event = items[0] | ||
| assert error_event.type == "event" | ||
| assert error_event.payload["exception"]["values"][0]["type"] == "ZeroDivisionError" | ||
|
|
||
| server_span, segment = [item.payload for item in items[1:]] | ||
|
|
||
| assert segment["is_segment"] is True | ||
| assert segment["attributes"]["sentry.op"] == "http.client" | ||
| # The test client receives the 500 response that aiohttp's outer error | ||
| # handler synthesizes from the unhandled exception. | ||
| assert segment["attributes"]["http.response.status_code"] == 500 | ||
| assert segment["status"] == "error" | ||
| server_span = items[1].payload | ||
|
|
||
| # The integration's generic Exception path reraises without recording | ||
| # http.response.status_code on the server span. StreamedSpan.__exit__ | ||
|
|
@@ -1456,13 +1445,8 @@ | |
|
|
||
| sentry_sdk.flush() | ||
|
|
||
| assert len(items) == 2 | ||
| server_span, segment = [item.payload for item in items] | ||
|
|
||
| assert segment["is_segment"] is True | ||
| assert segment["attributes"]["sentry.op"] == "http.client" | ||
| assert segment["attributes"]["http.response.status_code"] == 403 | ||
| assert segment["status"] == "error" | ||
| assert len(items) == 1 | ||
| (server_span,) = [item.payload for item in items] | ||
|
|
||
| assert server_span["attributes"]["sentry.op"] == "http.server" | ||
| assert server_span["attributes"]["http.response.status_code"] == 403 | ||
|
|
@@ -1493,13 +1477,8 @@ | |
|
|
||
| sentry_sdk.flush() | ||
|
|
||
| assert len(items) == 2 | ||
| server_span, segment = [item.payload for item in items] | ||
|
|
||
| assert segment["is_segment"] is True | ||
| assert segment["attributes"]["sentry.op"] == "http.client" | ||
| assert segment["attributes"]["http.response.status_code"] == 302 | ||
| assert segment["status"] == "ok" | ||
| assert len(items) == 1 | ||
| (server_span,) = [item.payload for item in items] | ||
|
|
||
| assert server_span["attributes"]["sentry.op"] == "http.server" | ||
| assert server_span["attributes"]["http.response.status_code"] == 302 | ||
|
|
@@ -1538,18 +1517,13 @@ | |
|
|
||
| sentry_sdk.flush() | ||
|
|
||
| # 3 spans, finished inner-first: | ||
| # 2 spans, finished inner-first: | ||
| # #0 inner http.client (server -> raw_server) | ||
| # #1 server http.server | ||
| # #2 outer http.client segment (test client -> server) | ||
| assert len(items) == 3 | ||
| assert len(items) == 2 | ||
|
|
||
| inner_client_span = items[0].payload | ||
| server_span = items[1].payload | ||
| segment = items[2].payload | ||
|
|
||
| assert segment["is_segment"] is True | ||
| assert segment["attributes"]["sentry.op"] == "http.client" | ||
|
|
||
| assert server_span["attributes"]["sentry.op"] == "http.server" | ||
|
|
||
|
|
@@ -1592,28 +1566,16 @@ | |
| items = capture_items("span") | ||
|
|
||
| client = await aiohttp_client(raw_server) | ||
| resp = await client.get("/") | ||
| await client.get("/") | ||
|
|
||
| sentry_sdk.flush() | ||
|
|
||
| # raw_server bypasses Application._handle, so only the test client's | ||
| # outgoing http.client segment is emitted. | ||
| assert len(items) == 1 | ||
| client_span = items[0].payload | ||
|
|
||
| assert client_span["is_segment"] is True | ||
| assert client_span["attributes"]["sentry.op"] == "http.client" | ||
| assert client_span["name"].startswith("GET http://127.0.0.1:") | ||
| assert resp.request_info.headers[ | ||
| "sentry-trace" | ||
| ] == "{trace_id}-{span_id}-{sampled}".format( | ||
| trace_id=client_span["trace_id"], | ||
| span_id=client_span["span_id"], | ||
| sampled=1, | ||
| ) | ||
| # The outgoing http.client span is suppressed because there is no active | ||
| # span when the test client makes the request. | ||
| assert len(items) == 0 | ||
|
|
||
|
|
||
| @pytest.mark.asyncio | ||
|
Check warning on line 1578 in tests/integrations/aiohttp/test_aiohttp.py
|
||
|
Comment on lines
+1573
to
1578
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Outgoing trace header propagation dropped when no active span in streaming mode This test previously verified that the Evidence
Identified by Warden code-review · DYK-FKT |
||
| @pytest.mark.parametrize("send_default_pii", [True, False]) | ||
| async def test_user_ip_address_on_all_spans( | ||
| sentry_init, aiohttp_client, capture_items, send_default_pii | ||
|
|
@@ -1640,7 +1602,7 @@ | |
|
|
||
| sentry_sdk.flush() | ||
|
|
||
| child_span, server_span, client_span = [item.payload for item in items] | ||
| child_span, server_span = [item.payload for item in items] | ||
|
|
||
| if send_default_pii: | ||
| assert server_span["attributes"]["user.ip_address"] == "127.0.0.1" | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.