Skip to content

Commit ce83b95

Browse files
untitakersentry-bot
and
sentry-bot
authored
fix: Allow ASGI middleware to capture exceptions in nested call (getsentry#817)
Co-authored-by: sentry-bot <markus+ghbot@sentry.io>
1 parent 3d5b5ee commit ce83b95

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

sentry_sdk/integrations/asgi.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,14 @@ async def _run_asgi3(self, scope, receive, send):
107107

108108
async def _run_app(self, scope, callback):
109109
# type: (Any, Any) -> Any
110-
if _asgi_middleware_applied.get(False):
111-
return await callback()
110+
is_recursive_asgi_middleware = _asgi_middleware_applied.get(False)
111+
112+
if is_recursive_asgi_middleware:
113+
try:
114+
return await callback()
115+
except Exception as exc:
116+
_capture_exception(Hub.current, exc)
117+
raise exc from None
112118

113119
_asgi_middleware_applied.set(True)
114120
try:

tests/integrations/asgi/test_asgi.py

+24-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sys
22

33
import pytest
4-
from sentry_sdk import Hub, capture_message
4+
from sentry_sdk import Hub, capture_message, last_event_id
55
from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
66
from starlette.applications import Starlette
77
from starlette.responses import PlainTextResponse
@@ -179,3 +179,26 @@ async def app(scope, receive, send):
179179
"url": "ws://testserver/",
180180
}
181181
)
182+
183+
184+
def test_starlette_last_event_id(app, sentry_init, capture_events, request):
185+
sentry_init(send_default_pii=True)
186+
events = capture_events()
187+
188+
@app.route("/handlederror")
189+
def handlederror(request):
190+
raise ValueError("oh no")
191+
192+
@app.exception_handler(500)
193+
def handler(*args, **kwargs):
194+
return PlainTextResponse(last_event_id(), status_code=500)
195+
196+
client = TestClient(SentryAsgiMiddleware(app), raise_server_exceptions=False)
197+
response = client.get("/handlederror")
198+
assert response.status_code == 500
199+
200+
(event,) = events
201+
assert response.content.strip().decode("ascii") == event["event_id"]
202+
(exception,) = event["exception"]["values"]
203+
assert exception["type"] == "ValueError"
204+
assert exception["value"] == "oh no"

0 commit comments

Comments
 (0)