From 6d5bfd528956ac75d624a75ec66b6f985f8eb9ca Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Mon, 12 Oct 2026 14:19:31 +0200 Subject: [PATCH 1/2] chore: Replace framework-specific middleware ops --- sentry_sdk/consts.py | 1 + sentry_sdk/integrations/django/middleware.py | 2 +- sentry_sdk/integrations/litestar.py | 6 +-- sentry_sdk/integrations/starlette.py | 6 +-- sentry_sdk/integrations/starlite.py | 6 +-- tests/integrations/django/asgi/test_asgi.py | 10 ++-- tests/integrations/django/test_basic.py | 26 +++++------ tests/integrations/litestar/test_litestar.py | 23 ++++------ .../integrations/starlette/test_starlette.py | 46 +++++++++---------- tests/integrations/starlite/test_starlite.py | 25 +++++----- 10 files changed, 75 insertions(+), 76 deletions(-) diff --git a/sentry_sdk/consts.py b/sentry_sdk/consts.py index 60ad307211..b1fab7a6c9 100644 --- a/sentry_sdk/consts.py +++ b/sentry_sdk/consts.py @@ -1360,6 +1360,7 @@ class OP: HTTP_CLIENT = "http.client" HTTP_CLIENT_STREAM = "http.client.stream" HTTP_SERVER = "http.server" + MIDDLEWARE = "middleware" MIDDLEWARE_DJANGO = "middleware.django" MIDDLEWARE_LITESTAR = "middleware.litestar" MIDDLEWARE_LITESTAR_RECEIVE = "middleware.litestar.receive" diff --git a/sentry_sdk/integrations/django/middleware.py b/sentry_sdk/integrations/django/middleware.py index af4ac249e8..dc8227bae5 100644 --- a/sentry_sdk/integrations/django/middleware.py +++ b/sentry_sdk/integrations/django/middleware.py @@ -82,7 +82,7 @@ def _check_middleware_span( middleware_span = sentry_sdk.start_span( name=description, attributes={ - "sentry.op": OP.MIDDLEWARE_DJANGO, + "sentry.op": OP.MIDDLEWARE, "sentry.origin": DjangoIntegration.origin, SPANDATA.MIDDLEWARE_NAME: middleware_name, }, diff --git a/sentry_sdk/integrations/litestar.py b/sentry_sdk/integrations/litestar.py index cc0e8e1efc..f904974c3f 100644 --- a/sentry_sdk/integrations/litestar.py +++ b/sentry_sdk/integrations/litestar.py @@ -170,7 +170,7 @@ async def _create_span_call( with sentry_sdk.start_span( name=middleware_name, attributes={ - "sentry.op": OP.MIDDLEWARE_LITESTAR, + "sentry.op": OP.MIDDLEWARE, "sentry.origin": LitestarIntegration.origin, }, ) as middleware_span: @@ -187,7 +187,7 @@ async def _sentry_receive( with sentry_sdk.start_span( name=getattr(receive, "__qualname__", str(receive)), attributes={ - "sentry.op": OP.MIDDLEWARE_LITESTAR_RECEIVE, + "sentry.op": OP.MIDDLEWARE, "sentry.origin": LitestarIntegration.origin, }, ) as span: @@ -207,7 +207,7 @@ async def _sentry_send(message: "Message") -> None: with sentry_sdk.start_span( name=getattr(send, "__qualname__", str(send)), attributes={ - "sentry.op": OP.MIDDLEWARE_LITESTAR_SEND, + "sentry.op": OP.MIDDLEWARE, "sentry.origin": LitestarIntegration.origin, }, ) as span: diff --git a/sentry_sdk/integrations/starlette.py b/sentry_sdk/integrations/starlette.py index a1fcefb040..a1756cab1a 100644 --- a/sentry_sdk/integrations/starlette.py +++ b/sentry_sdk/integrations/starlette.py @@ -173,11 +173,11 @@ def _start_middleware_span(op: str, name: str) -> "Any": }, ) - with _start_middleware_span(op=OP.MIDDLEWARE_STARLETTE, name=middleware_name): + with _start_middleware_span(op=OP.MIDDLEWARE, name=middleware_name): # Creating spans for the "receive" callback async def _sentry_receive(*args: "Any", **kwargs: "Any") -> "Any": with _start_middleware_span( - op=OP.MIDDLEWARE_STARLETTE_RECEIVE, + op=OP.MIDDLEWARE, name=getattr(receive, "__qualname__", str(receive)), ): return await receive(*args, **kwargs) @@ -189,7 +189,7 @@ async def _sentry_receive(*args: "Any", **kwargs: "Any") -> "Any": # Creating spans for the "send" callback async def _sentry_send(*args: "Any", **kwargs: "Any") -> "Any": with _start_middleware_span( - op=OP.MIDDLEWARE_STARLETTE_SEND, + op=OP.MIDDLEWARE, name=getattr(send, "__qualname__", str(send)), ): return await send(*args, **kwargs) diff --git a/sentry_sdk/integrations/starlite.py b/sentry_sdk/integrations/starlite.py index 584ff0a7e8..e65cb45ce7 100644 --- a/sentry_sdk/integrations/starlite.py +++ b/sentry_sdk/integrations/starlite.py @@ -163,7 +163,7 @@ def _start_middleware_span(op: str, name: str) -> "Any": }, ) - with _start_middleware_span(op=OP.MIDDLEWARE_STARLITE, name=middleware_name): + with _start_middleware_span(op=OP.MIDDLEWARE, name=middleware_name): # Creating spans for the "receive" callback async def _sentry_receive( *args: "Any", **kwargs: "Any" @@ -171,7 +171,7 @@ async def _sentry_receive( if sentry_sdk.get_client().get_integration(StarliteIntegration) is None: return await receive(*args, **kwargs) with _start_middleware_span( - op=OP.MIDDLEWARE_STARLITE_RECEIVE, + op=OP.MIDDLEWARE, name=getattr(receive, "__qualname__", str(receive)), ): return await receive(*args, **kwargs) @@ -185,7 +185,7 @@ async def _sentry_send(message: "Message") -> None: if sentry_sdk.get_client().get_integration(StarliteIntegration) is None: return await send(message) with _start_middleware_span( - op=OP.MIDDLEWARE_STARLITE_SEND, + op=OP.MIDDLEWARE, name=getattr(send, "__qualname__", str(send)), ): return await send(message) diff --git a/tests/integrations/django/asgi/test_asgi.py b/tests/integrations/django/asgi/test_asgi.py index df62d35288..76f9cae259 100644 --- a/tests/integrations/django/asgi/test_asgi.py +++ b/tests/integrations/django/asgi/test_asgi.py @@ -277,11 +277,11 @@ async def test_async_middleware_spans( render_span_tree(spans) == """\ - sentry.op="http.server": name="/simple_async_view" - - sentry.op="middleware.django": name="django.contrib.sessions.middleware.SessionMiddleware.__acall__" - - sentry.op="middleware.django": name="django.contrib.auth.middleware.AuthenticationMiddleware.__acall__" - - sentry.op="middleware.django": name="django.middleware.csrf.CsrfViewMiddleware.__acall__" - - sentry.op="middleware.django": name="tests.integrations.django.myapp.settings.TestMiddleware.__acall__" - - sentry.op="middleware.django": name="django.middleware.csrf.CsrfViewMiddleware.process_view" + - sentry.op="middleware": name="django.contrib.sessions.middleware.SessionMiddleware.__acall__" + - sentry.op="middleware": name="django.contrib.auth.middleware.AuthenticationMiddleware.__acall__" + - sentry.op="middleware": name="django.middleware.csrf.CsrfViewMiddleware.__acall__" + - sentry.op="middleware": name="tests.integrations.django.myapp.settings.TestMiddleware.__acall__" + - sentry.op="middleware": name="django.middleware.csrf.CsrfViewMiddleware.process_view" - sentry.op="view.render": name="simple_async_view\"""" ) diff --git a/tests/integrations/django/test_basic.py b/tests/integrations/django/test_basic.py index 44d604fe75..b4644e48fc 100644 --- a/tests/integrations/django/test_basic.py +++ b/tests/integrations/django/test_basic.py @@ -1499,25 +1499,25 @@ def test_middleware_spans( if DJANGO_VERSION >= (1, 10): EXPECTED_MIDDLEWARE_SPANS = """\ - sentry.op="http.server": name="/message" - - sentry.op="middleware.django": name="django.contrib.sessions.middleware.SessionMiddleware.__call__" - - sentry.op="middleware.django": name="django.contrib.auth.middleware.AuthenticationMiddleware.__call__" - - sentry.op="middleware.django": name="django.middleware.csrf.CsrfViewMiddleware.__call__" - - sentry.op="middleware.django": name="tests.integrations.django.myapp.settings.TestMiddleware.__call__" - - sentry.op="middleware.django": name="tests.integrations.django.myapp.settings.TestFunctionMiddleware.__call__" - - sentry.op="middleware.django": name="django.middleware.csrf.CsrfViewMiddleware.process_view" + - sentry.op="middleware": name="django.contrib.sessions.middleware.SessionMiddleware.__call__" + - sentry.op="middleware": name="django.contrib.auth.middleware.AuthenticationMiddleware.__call__" + - sentry.op="middleware": name="django.middleware.csrf.CsrfViewMiddleware.__call__" + - sentry.op="middleware": name="tests.integrations.django.myapp.settings.TestMiddleware.__call__" + - sentry.op="middleware": name="tests.integrations.django.myapp.settings.TestFunctionMiddleware.__call__" + - sentry.op="middleware": name="django.middleware.csrf.CsrfViewMiddleware.process_view" - sentry.op="view.render": name="message"\ """ else: EXPECTED_MIDDLEWARE_SPANS = """\ - sentry.op="http.server": name="/message" - - sentry.op="middleware.django": name="django.contrib.sessions.middleware.SessionMiddleware.process_request" - - sentry.op="middleware.django": name="django.contrib.auth.middleware.AuthenticationMiddleware.process_request" - - sentry.op="middleware.django": name="tests.integrations.django.myapp.settings.TestMiddleware.process_request" - - sentry.op="middleware.django": name="django.middleware.csrf.CsrfViewMiddleware.process_view" + - sentry.op="middleware": name="django.contrib.sessions.middleware.SessionMiddleware.process_request" + - sentry.op="middleware": name="django.contrib.auth.middleware.AuthenticationMiddleware.process_request" + - sentry.op="middleware": name="tests.integrations.django.myapp.settings.TestMiddleware.process_request" + - sentry.op="middleware": name="django.middleware.csrf.CsrfViewMiddleware.process_view" - sentry.op="view.render": name="message" - - sentry.op="middleware.django": name="tests.integrations.django.myapp.settings.TestMiddleware.process_response" - - sentry.op="middleware.django": name="django.middleware.csrf.CsrfViewMiddleware.process_response" - - sentry.op="middleware.django": name="django.contrib.sessions.middleware.SessionMiddleware.process_response"\ + - sentry.op="middleware": name="tests.integrations.django.myapp.settings.TestMiddleware.process_response" + - sentry.op="middleware": name="django.middleware.csrf.CsrfViewMiddleware.process_response" + - sentry.op="middleware": name="django.contrib.sessions.middleware.SessionMiddleware.process_response"\ """ assert render_span_tree(spans) == EXPECTED_MIDDLEWARE_SPANS diff --git a/tests/integrations/litestar/test_litestar.py b/tests/integrations/litestar/test_litestar.py index f94faf7606..8cd5a43757 100644 --- a/tests/integrations/litestar/test_litestar.py +++ b/tests/integrations/litestar/test_litestar.py @@ -208,7 +208,8 @@ def test_middleware_spans( litestar_spans = ( span for span in spans - if span["attributes"]["sentry.op"] == "middleware.litestar" + if span["attributes"]["sentry.op"] == "middleware" + and span["name"] == span["attributes"].get("middleware.name") ) for span in litestar_spans: @@ -251,7 +252,7 @@ async def do_stuff(message): "attributes": ApproxDict( { "middleware.name": "SampleMiddleware", - "sentry.op": "middleware.litestar", + "sentry.op": "middleware", }, ), }, @@ -260,7 +261,7 @@ async def do_stuff(message): "attributes": ApproxDict( { "middleware.name": "SampleMiddleware", - "sentry.op": "middleware.litestar.send", + "sentry.op": "middleware", } ), }, @@ -269,7 +270,7 @@ async def do_stuff(message): "attributes": ApproxDict( { "middleware.name": "SampleMiddleware", - "sentry.op": "middleware.litestar.send", + "sentry.op": "middleware", } ), }, @@ -284,9 +285,7 @@ def is_matching_span(expected_span, actual_span): sentry_sdk.flush() spans = [item.payload for item in items] actual_litestar_spans = list( - span - for span in spans - if "middleware.litestar" in span["attributes"].get("sentry.op") + span for span in spans if span["attributes"].get("sentry.op") == "middleware" ) assert len(actual_litestar_spans) == 3 @@ -368,7 +367,7 @@ async def my_send(*args, **kwargs): "attributes": ApproxDict( { "middleware.name": "SamplePartialReceiveSendMiddleware", - "sentry.op": "middleware.litestar", + "sentry.op": "middleware", } ), }, @@ -377,7 +376,7 @@ async def my_send(*args, **kwargs): "attributes": ApproxDict( { "middleware.name": "SamplePartialReceiveSendMiddleware", - "sentry.op": "middleware.litestar.receive", + "sentry.op": "middleware", } ), }, @@ -386,7 +385,7 @@ async def my_send(*args, **kwargs): "attributes": ApproxDict( { "middleware.name": "SamplePartialReceiveSendMiddleware", - "sentry.op": "middleware.litestar.send", + "sentry.op": "middleware", } ), }, @@ -399,9 +398,7 @@ def is_matching_span(expected_span, actual_span): ) actual_litestar_spans = list( - span - for span in spans - if "middleware.litestar" in span["attributes"].get("sentry.op") + span for span in spans if span["attributes"].get("sentry.op") == "middleware" ) assert len(actual_litestar_spans) == 3 diff --git a/tests/integrations/starlette/test_starlette.py b/tests/integrations/starlette/test_starlette.py index 6d017aea10..a9ebc82687 100644 --- a/tests/integrations/starlette/test_starlette.py +++ b/tests/integrations/starlette/test_starlette.py @@ -1033,10 +1033,10 @@ def test_middleware_spans(sentry_init, capture_items): "ServerErrorMiddleware", "AuthenticationMiddleware", "ExceptionMiddleware", - "AuthenticationMiddleware", # 'op': 'middleware.starlette.send' - "ServerErrorMiddleware", # 'op': 'middleware.starlette.send' - "AuthenticationMiddleware", # 'op': 'middleware.starlette.send' - "ServerErrorMiddleware", # 'op': 'middleware.starlette.send' + "AuthenticationMiddleware", # 'op': 'middleware' + "ServerErrorMiddleware", # 'op': 'middleware' + "AuthenticationMiddleware", # 'op': 'middleware' + "ServerErrorMiddleware", # 'op': 'middleware' ] sentry_sdk.flush() @@ -1044,7 +1044,7 @@ def test_middleware_spans(sentry_init, capture_items): segment = items.pop().payload middleware_spans = [item.payload for item in items] - # In span-first, the `middleware.starlette.send` ops appear first, + # In span-first, the middleware send ops appear first, # so the list needs to be reversed for the assertions below middleware_spans.reverse() @@ -1105,47 +1105,47 @@ def test_middleware_callback_spans(sentry_init, capture_items): expected = [ { - "op": "middleware.starlette", + "op": "middleware", "description": "ServerErrorMiddleware", "middleware_name": "ServerErrorMiddleware", }, { - "op": "middleware.starlette", + "op": "middleware", "description": "SampleMiddleware", "middleware_name": "SampleMiddleware", }, { - "op": "middleware.starlette", + "op": "middleware", "description": "ExceptionMiddleware", "middleware_name": "ExceptionMiddleware", }, { - "op": "middleware.starlette.send", + "op": "middleware", "description": "SampleMiddleware.__call__..do_stuff", "middleware_name": "ExceptionMiddleware", }, { - "op": "middleware.starlette.send", + "op": "middleware", "description": "ServerErrorMiddleware.__call__.._send", "middleware_name": "SampleMiddleware", }, { - "op": "middleware.starlette.send", + "op": "middleware", "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", "middleware_name": "ServerErrorMiddleware", }, { - "op": "middleware.starlette.send", + "op": "middleware", "description": "SampleMiddleware.__call__..do_stuff", "middleware_name": "ExceptionMiddleware", }, { - "op": "middleware.starlette.send", + "op": "middleware", "description": "ServerErrorMiddleware.__call__.._send", "middleware_name": "SampleMiddleware", }, { - "op": "middleware.starlette.send", + "op": "middleware", "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", "middleware_name": "ServerErrorMiddleware", }, @@ -1156,7 +1156,7 @@ def test_middleware_callback_spans(sentry_init, capture_items): segment = items.pop().payload middleware_spans = [item.payload for item in items] - # In span-first, the `middleware.starlette.send` ops appear first, + # In span-first, the middleware send ops appear first, # so the list needs to be reversed for the assertions below middleware_spans.reverse() @@ -1212,27 +1212,27 @@ def test_middleware_partial_receive_send(sentry_init, capture_items): expected = [ { - "op": "middleware.starlette.send", + "op": "middleware", "description": "functools.partial(.my_send at ", }, { - "op": "middleware.starlette.send", + "op": "middleware", "description": "functools.partial(.my_send at ", }, { - "op": "middleware.starlette", + "op": "middleware", "description": "ExceptionMiddleware", }, { - "op": "middleware.starlette.send", + "op": "middleware", "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", }, { - "op": "middleware.starlette.send", + "op": "middleware", "description": "ServerErrorMiddleware.__call__.._send", }, { - "op": "middleware.starlette.receive", + "op": "middleware", "description": ( "_ASGIAdapter.send..receive" if STARLETTE_VERSION < (0, 21) @@ -1240,11 +1240,11 @@ def test_middleware_partial_receive_send(sentry_init, capture_items): ), }, { - "op": "middleware.starlette", + "op": "middleware", "description": "SamplePartialReceiveSendMiddleware", }, { - "op": "middleware.starlette", + "op": "middleware", "description": "ServerErrorMiddleware", }, ] diff --git a/tests/integrations/starlite/test_starlite.py b/tests/integrations/starlite/test_starlite.py index ed02a2c340..0bacb1da09 100644 --- a/tests/integrations/starlite/test_starlite.py +++ b/tests/integrations/starlite/test_starlite.py @@ -196,7 +196,9 @@ def test_middleware_spans(sentry_init, capture_items): middleware_spans = [ item.payload for item in items - if item.payload.get("attributes", {}).get("sentry.op") == "middleware.starlite" + if item.payload.get("attributes", {}).get("sentry.op") == "middleware" + and item.payload.get("name") + == item.payload.get("attributes", {}).get("middleware.name") ] assert len(middleware_spans) == 3 @@ -232,15 +234,15 @@ async def do_stuff(message): expected_starlite_spans = [ { - "op": "middleware.starlite", + "op": "middleware", "description": "SampleMiddleware", }, { - "op": "middleware.starlite.send", + "op": "middleware", "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", }, { - "op": "middleware.starlite.send", + "op": "middleware", "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", }, ] @@ -250,8 +252,7 @@ async def do_stuff(message): actual_starlite_spans = [ item.payload for item in items - if "middleware.starlite" - in item.payload.get("attributes", {}).get("sentry.op", "") + if item.payload.get("attributes", {}).get("sentry.op") == "middleware" ] assert len(actual_starlite_spans) == 3 @@ -326,15 +327,15 @@ async def my_send(*args, **kwargs): expected_starlite_spans = [ { - "op": "middleware.starlite", + "op": "middleware", "description": "SamplePartialReceiveSendMiddleware", }, { - "op": "middleware.starlite.receive", + "op": "middleware", "description": "TestClientTransport.create_receive..receive", }, { - "op": "middleware.starlite.send", + "op": "middleware", "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", }, ] @@ -344,8 +345,7 @@ async def my_send(*args, **kwargs): actual_starlite_spans = [ item.payload for item in items - if "middleware.starlite" - in item.payload.get("attributes", {}).get("sentry.op", "") + if item.payload.get("attributes", {}).get("sentry.op") == "middleware" ] assert len(actual_starlite_spans) == 3 @@ -391,7 +391,8 @@ def test_span_origin(sentry_init, capture_items): starlite_items = [ item for item in items - if "starlite" in item.payload.get("attributes", {}).get("sentry.op", "") + if item.payload.get("attributes", {}).get("sentry.origin") + == "auto.http.starlite" ] assert len(starlite_items) > 0 for item in starlite_items: From 653a389fb86f24666650b624ca47580efe8bfc61 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Mon, 12 Oct 2026 18:45:59 +0200 Subject: [PATCH 2/2] migration guide and use OP constants where reasonable --- MIGRATION_GUIDE.md | 1 + tests/integrations/litestar/test_litestar.py | 21 +++++----- .../integrations/starlette/test_starlette.py | 40 +++++++++---------- tests/integrations/starlite/test_starlite.py | 26 ++++++------ 4 files changed, 43 insertions(+), 45 deletions(-) diff --git a/MIGRATION_GUIDE.md b/MIGRATION_GUIDE.md index e979cdfbfa..8031b82ee3 100644 --- a/MIGRATION_GUIDE.md +++ b/MIGRATION_GUIDE.md @@ -43,6 +43,7 @@ Span ops are now a smaller, framework-neutral set. - The Cohere integration now emits `gen_ai.chat` instead of `ai.chat_completions.create.cohere`, and `gen_ai.embeddings` instead of `ai.embeddings.create.cohere`. - The Django integration now emits `view.render` instead of `view.response.render`, `view` instead of `view.authenticate`, and `function` instead of `event.django`. +- The Django, Starlette, Starlite, and Litestar integrations now emit `middleware` instead of `middleware.django`, `middleware.starlette`, `middleware.starlette.receive`, `middleware.starlette.send`, `middleware.starlite`, `middleware.starlite.receive`, `middleware.starlite.send`, `middleware.litestar`, `middleware.litestar.receive`, and `middleware.litestar.send`. #### Django diff --git a/tests/integrations/litestar/test_litestar.py b/tests/integrations/litestar/test_litestar.py index 8cd5a43757..e561136240 100644 --- a/tests/integrations/litestar/test_litestar.py +++ b/tests/integrations/litestar/test_litestar.py @@ -15,6 +15,7 @@ import sentry_sdk from sentry_sdk import capture_message +from sentry_sdk.consts import OP from sentry_sdk.integrations.litestar import LitestarIntegration from sentry_sdk.utils import SENSITIVE_DATA_SUBSTITUTE from tests.conftest import ApproxDict @@ -208,12 +209,10 @@ def test_middleware_spans( litestar_spans = ( span for span in spans - if span["attributes"]["sentry.op"] == "middleware" - and span["name"] == span["attributes"].get("middleware.name") + if span["attributes"]["sentry.op"] == OP.MIDDLEWARE and span["name"] in expected ) for span in litestar_spans: - assert span["name"] in expected assert span["name"] not in found found.add(span["name"]) assert span["name"] == span["attributes"]["middleware.name"] @@ -252,7 +251,7 @@ async def do_stuff(message): "attributes": ApproxDict( { "middleware.name": "SampleMiddleware", - "sentry.op": "middleware", + "sentry.op": OP.MIDDLEWARE, }, ), }, @@ -261,7 +260,7 @@ async def do_stuff(message): "attributes": ApproxDict( { "middleware.name": "SampleMiddleware", - "sentry.op": "middleware", + "sentry.op": OP.MIDDLEWARE, } ), }, @@ -270,7 +269,7 @@ async def do_stuff(message): "attributes": ApproxDict( { "middleware.name": "SampleMiddleware", - "sentry.op": "middleware", + "sentry.op": OP.MIDDLEWARE, } ), }, @@ -285,7 +284,7 @@ def is_matching_span(expected_span, actual_span): sentry_sdk.flush() spans = [item.payload for item in items] actual_litestar_spans = list( - span for span in spans if span["attributes"].get("sentry.op") == "middleware" + span for span in spans if OP.MIDDLEWARE in span["attributes"].get("sentry.op") ) assert len(actual_litestar_spans) == 3 @@ -367,7 +366,7 @@ async def my_send(*args, **kwargs): "attributes": ApproxDict( { "middleware.name": "SamplePartialReceiveSendMiddleware", - "sentry.op": "middleware", + "sentry.op": OP.MIDDLEWARE, } ), }, @@ -376,7 +375,7 @@ async def my_send(*args, **kwargs): "attributes": ApproxDict( { "middleware.name": "SamplePartialReceiveSendMiddleware", - "sentry.op": "middleware", + "sentry.op": OP.MIDDLEWARE, } ), }, @@ -385,7 +384,7 @@ async def my_send(*args, **kwargs): "attributes": ApproxDict( { "middleware.name": "SamplePartialReceiveSendMiddleware", - "sentry.op": "middleware", + "sentry.op": OP.MIDDLEWARE, } ), }, @@ -398,7 +397,7 @@ def is_matching_span(expected_span, actual_span): ) actual_litestar_spans = list( - span for span in spans if span["attributes"].get("sentry.op") == "middleware" + span for span in spans if OP.MIDDLEWARE in span["attributes"].get("sentry.op") ) assert len(actual_litestar_spans) == 3 diff --git a/tests/integrations/starlette/test_starlette.py b/tests/integrations/starlette/test_starlette.py index a9ebc82687..860e8e074c 100644 --- a/tests/integrations/starlette/test_starlette.py +++ b/tests/integrations/starlette/test_starlette.py @@ -25,7 +25,7 @@ import sentry_sdk from sentry_sdk import capture_message, get_baggage, get_traceparent from sentry_sdk._types import SENSITIVE_DATA_SUBSTITUTE -from sentry_sdk.consts import SPANDATA +from sentry_sdk.consts import OP, SPANDATA from sentry_sdk.integrations.asgi import SentryAsgiMiddleware from sentry_sdk.integrations.logging import LoggingIntegration from sentry_sdk.integrations.starlette import ( @@ -1044,7 +1044,7 @@ def test_middleware_spans(sentry_init, capture_items): segment = items.pop().payload middleware_spans = [item.payload for item in items] - # In span-first, the middleware send ops appear first, + # In span-first, the `middleware` ops appear first, # so the list needs to be reversed for the assertions below middleware_spans.reverse() @@ -1105,47 +1105,47 @@ def test_middleware_callback_spans(sentry_init, capture_items): expected = [ { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "ServerErrorMiddleware", "middleware_name": "ServerErrorMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SampleMiddleware", "middleware_name": "SampleMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "ExceptionMiddleware", "middleware_name": "ExceptionMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SampleMiddleware.__call__..do_stuff", "middleware_name": "ExceptionMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "ServerErrorMiddleware.__call__.._send", "middleware_name": "SampleMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", "middleware_name": "ServerErrorMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SampleMiddleware.__call__..do_stuff", "middleware_name": "ExceptionMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "ServerErrorMiddleware.__call__.._send", "middleware_name": "SampleMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", "middleware_name": "ServerErrorMiddleware", }, @@ -1156,7 +1156,7 @@ def test_middleware_callback_spans(sentry_init, capture_items): segment = items.pop().payload middleware_spans = [item.payload for item in items] - # In span-first, the middleware send ops appear first, + # In span-first, the `middleware` ops appear first, # so the list needs to be reversed for the assertions below middleware_spans.reverse() @@ -1212,27 +1212,27 @@ def test_middleware_partial_receive_send(sentry_init, capture_items): expected = [ { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "functools.partial(.my_send at ", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "functools.partial(.my_send at ", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "ExceptionMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "ServerErrorMiddleware.__call__.._send", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": ( "_ASGIAdapter.send..receive" if STARLETTE_VERSION < (0, 21) @@ -1240,11 +1240,11 @@ def test_middleware_partial_receive_send(sentry_init, capture_items): ), }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SamplePartialReceiveSendMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "ServerErrorMiddleware", }, ] diff --git a/tests/integrations/starlite/test_starlite.py b/tests/integrations/starlite/test_starlite.py index 0bacb1da09..f05574df2d 100644 --- a/tests/integrations/starlite/test_starlite.py +++ b/tests/integrations/starlite/test_starlite.py @@ -12,6 +12,7 @@ import sentry_sdk from sentry_sdk import capture_message from sentry_sdk._types import SENSITIVE_DATA_SUBSTITUTE +from sentry_sdk.consts import OP from sentry_sdk.integrations.starlite import StarliteIntegration from tests.integrations.utils import DATA_COLLECTION_USER_INFO_CASES @@ -196,15 +197,13 @@ def test_middleware_spans(sentry_init, capture_items): middleware_spans = [ item.payload for item in items - if item.payload.get("attributes", {}).get("sentry.op") == "middleware" - and item.payload.get("name") - == item.payload.get("attributes", {}).get("middleware.name") + if item.payload.get("attributes", {}).get("sentry.op", "") == OP.MIDDLEWARE + and item.payload.get("name") in expected ] assert len(middleware_spans) == 3 found = set() for span in middleware_spans: - assert span["name"] in expected assert span["name"] not in found found.add(span["name"]) assert span["name"] == span["attributes"]["middleware.name"] @@ -234,15 +233,15 @@ async def do_stuff(message): expected_starlite_spans = [ { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SampleMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", }, ] @@ -252,7 +251,7 @@ async def do_stuff(message): actual_starlite_spans = [ item.payload for item in items - if item.payload.get("attributes", {}).get("sentry.op") == "middleware" + if OP.MIDDLEWARE in item.payload.get("attributes", {}).get("sentry.op", "") ] assert len(actual_starlite_spans) == 3 @@ -327,15 +326,15 @@ async def my_send(*args, **kwargs): expected_starlite_spans = [ { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SamplePartialReceiveSendMiddleware", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "TestClientTransport.create_receive..receive", }, { - "op": "middleware", + "op": OP.MIDDLEWARE, "description": "SentryAsgiMiddleware._run_app.._sentry_wrapped_send", }, ] @@ -345,7 +344,7 @@ async def my_send(*args, **kwargs): actual_starlite_spans = [ item.payload for item in items - if item.payload.get("attributes", {}).get("sentry.op") == "middleware" + if OP.MIDDLEWARE in item.payload.get("attributes", {}).get("sentry.op", "") ] assert len(actual_starlite_spans) == 3 @@ -391,8 +390,7 @@ def test_span_origin(sentry_init, capture_items): starlite_items = [ item for item in items - if item.payload.get("attributes", {}).get("sentry.origin") - == "auto.http.starlite" + if item.payload.get("attributes", {}).get("sentry.op", "") == OP.MIDDLEWARE ] assert len(starlite_items) > 0 for item in starlite_items: