From f493057fdee8b542cdd2c949ee042864c8777133 Mon Sep 17 00:00:00 2001 From: Neel Shah Date: Wed, 16 Oct 2024 17:03:38 +0200 Subject: [PATCH] Allow custom transaction names in asgi (#3664) --- sentry_sdk/integrations/asgi.py | 2 ++ tests/integrations/asgi/test_asgi.py | 42 ++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/sentry_sdk/integrations/asgi.py b/sentry_sdk/integrations/asgi.py index 1b256c8eee..f5e8665b4f 100644 --- a/sentry_sdk/integrations/asgi.py +++ b/sentry_sdk/integrations/asgi.py @@ -28,6 +28,7 @@ TRANSACTION_SOURCE_ROUTE, TRANSACTION_SOURCE_URL, TRANSACTION_SOURCE_COMPONENT, + TRANSACTION_SOURCE_CUSTOM, ) from sentry_sdk.utils import ( ContextVar, @@ -274,6 +275,7 @@ def event_processor(self, event, hint, asgi_scope): ].get("source") in [ TRANSACTION_SOURCE_COMPONENT, TRANSACTION_SOURCE_ROUTE, + TRANSACTION_SOURCE_CUSTOM, ] if not already_set: name, source = self._get_transaction_name_and_source( diff --git a/tests/integrations/asgi/test_asgi.py b/tests/integrations/asgi/test_asgi.py index d5368ddfe1..e0a3900a38 100644 --- a/tests/integrations/asgi/test_asgi.py +++ b/tests/integrations/asgi/test_asgi.py @@ -126,6 +126,31 @@ async def app(scope, receive, send): return app +@pytest.fixture +def asgi3_custom_transaction_app(): + + async def app(scope, receive, send): + sentry_sdk.get_current_scope().set_transaction_name("foobar", source="custom") + await send( + { + "type": "http.response.start", + "status": 200, + "headers": [ + [b"content-type", b"text/plain"], + ], + } + ) + + await send( + { + "type": "http.response.body", + "body": b"Hello, world!", + } + ) + + return app + + def test_invalid_transaction_style(asgi3_app): with pytest.raises(ValueError) as exp: SentryAsgiMiddleware(asgi3_app, transaction_style="URL") @@ -679,3 +704,20 @@ def dummy_traces_sampler(sampling_context): async with TestClient(app) as client: await client.get(request_url) + + +@pytest.mark.asyncio +async def test_custom_transaction_name( + sentry_init, asgi3_custom_transaction_app, capture_events +): + sentry_init(traces_sample_rate=1.0) + events = capture_events() + app = SentryAsgiMiddleware(asgi3_custom_transaction_app) + + async with TestClient(app) as client: + await client.get("/test") + + (transaction_event,) = events + assert transaction_event["type"] == "transaction" + assert transaction_event["transaction"] == "foobar" + assert transaction_event["transaction_info"] == {"source": "custom"}