diff --git a/sentry_sdk/integrations/asgi.py b/sentry_sdk/integrations/asgi.py index 79071db788..7a0d0bd339 100644 --- a/sentry_sdk/integrations/asgi.py +++ b/sentry_sdk/integrations/asgi.py @@ -107,8 +107,14 @@ async def _run_asgi3(self, scope, receive, send): async def _run_app(self, scope, callback): # type: (Any, Any) -> Any - if _asgi_middleware_applied.get(False): - return await callback() + is_recursive_asgi_middleware = _asgi_middleware_applied.get(False) + + if is_recursive_asgi_middleware: + try: + return await callback() + except Exception as exc: + _capture_exception(Hub.current, exc) + raise exc from None _asgi_middleware_applied.set(True) try: diff --git a/tests/integrations/asgi/test_asgi.py b/tests/integrations/asgi/test_asgi.py index 2561537708..521c7c8302 100644 --- a/tests/integrations/asgi/test_asgi.py +++ b/tests/integrations/asgi/test_asgi.py @@ -1,7 +1,7 @@ import sys import pytest -from sentry_sdk import Hub, capture_message +from sentry_sdk import Hub, capture_message, last_event_id from sentry_sdk.integrations.asgi import SentryAsgiMiddleware from starlette.applications import Starlette from starlette.responses import PlainTextResponse @@ -179,3 +179,26 @@ async def app(scope, receive, send): "url": "ws://testserver/", } ) + + +def test_starlette_last_event_id(app, sentry_init, capture_events, request): + sentry_init(send_default_pii=True) + events = capture_events() + + @app.route("/handlederror") + def handlederror(request): + raise ValueError("oh no") + + @app.exception_handler(500) + def handler(*args, **kwargs): + return PlainTextResponse(last_event_id(), status_code=500) + + client = TestClient(SentryAsgiMiddleware(app), raise_server_exceptions=False) + response = client.get("/handlederror") + assert response.status_code == 500 + + (event,) = events + assert response.content.strip().decode("ascii") == event["event_id"] + (exception,) = event["exception"]["values"] + assert exception["type"] == "ValueError" + assert exception["value"] == "oh no"