From 2016306b93f9f23cb080cf5ae7ed787638984723 Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Wed, 9 Sep 2020 13:50:53 +0200 Subject: [PATCH 1/3] fix: Allow ASGI middleware to capture exceptions in nested call --- sentry_sdk/integrations/asgi.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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: From e252b08bb79ecbfdd9ad8786a4d91fa27a5db4a6 Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Mon, 14 Sep 2020 11:26:32 +0200 Subject: [PATCH 2/3] add tests --- tests/integrations/asgi/test_asgi.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tests/integrations/asgi/test_asgi.py b/tests/integrations/asgi/test_asgi.py index 2561537708..6f4d3d9402 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 @@ -9,6 +9,7 @@ from starlette.websockets import WebSocket + @pytest.fixture def app(): app = Starlette() @@ -179,3 +180,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' From b5680cd82e4da07ef3c9faa21c1be848c737a0fc Mon Sep 17 00:00:00 2001 From: sentry-bot Date: Mon, 14 Sep 2020 09:27:59 +0000 Subject: [PATCH 3/3] fix: Formatting --- tests/integrations/asgi/test_asgi.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/integrations/asgi/test_asgi.py b/tests/integrations/asgi/test_asgi.py index 6f4d3d9402..521c7c8302 100644 --- a/tests/integrations/asgi/test_asgi.py +++ b/tests/integrations/asgi/test_asgi.py @@ -9,7 +9,6 @@ from starlette.websockets import WebSocket - @pytest.fixture def app(): app = Starlette() @@ -198,8 +197,8 @@ def handler(*args, **kwargs): response = client.get("/handlederror") assert response.status_code == 500 - event, = events - assert response.content.strip().decode('ascii') == event['event_id'] + (event,) = events + assert response.content.strip().decode("ascii") == event["event_id"] (exception,) = event["exception"]["values"] - assert exception['type'] == 'ValueError' - assert exception['value'] == 'oh no' + assert exception["type"] == "ValueError" + assert exception["value"] == "oh no"