diff --git a/sentry_sdk/integrations/pyramid.py b/sentry_sdk/integrations/pyramid.py index 5ab6ef90e9..49f734f52b 100644 --- a/sentry_sdk/integrations/pyramid.py +++ b/sentry_sdk/integrations/pyramid.py @@ -4,6 +4,7 @@ import weakref import sentry_sdk +from sentry_sdk.consts import SPANDATA from sentry_sdk.integrations import DidNotEnable, Integration from sentry_sdk.integrations._wsgi_common import RequestExtractor from sentry_sdk.integrations.wsgi import SentryWsgiMiddleware @@ -81,6 +82,18 @@ def sentry_patched_call_view( if integration is None: return old_call_view(registry, request, *args, **kwargs) + route_path = None + try: + route_path = request.matched_route.pattern + except Exception: + pass + + server_span = sentry_sdk.get_current_scope()._server_segment_span + if server_span is not None and route_path is not None: + server_span.set_attribute( + SPANDATA.HTTP_ROUTE, request.matched_route.pattern + ) + _set_transaction_name_and_source( sentry_sdk.get_current_scope(), integration.transaction_style, request ) diff --git a/tests/integrations/pyramid/test_pyramid.py b/tests/integrations/pyramid/test_pyramid.py index 5290de6357..0f90143600 100644 --- a/tests/integrations/pyramid/test_pyramid.py +++ b/tests/integrations/pyramid/test_pyramid.py @@ -11,6 +11,7 @@ import sentry_sdk from sentry_sdk import add_breadcrumb, capture_message +from sentry_sdk.consts import SPANDATA from sentry_sdk.integrations.pyramid import PyramidIntegration from sentry_sdk.serializer import MAX_DATABAG_BREADTH from sentry_sdk.traces import SpanStatus @@ -177,6 +178,28 @@ def test_transaction_style( assert transaction_event["transaction_info"] == {"source": expected_source} +def test_http_route( + sentry_init, + get_client, + capture_items, +): + sentry_init( + integrations=[PyramidIntegration()], + traces_sample_rate=1.0, + trace_lifecycle="stream", + ) + + items = capture_items("span") + + client = get_client() + client.get("/message/123456") + + sentry_sdk.flush() + + (segment,) = [item.payload for item in items if item.payload.get("is_segment")] + assert segment["attributes"][SPANDATA.HTTP_ROUTE] == "/message/{message_id}" + + @pytest.mark.parametrize("max_value_length", [1024, None]) def test_large_json_request( sentry_init, capture_events, route, get_client, max_value_length