Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions sentry_sdk/integrations/asgi.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
25 changes: 24 additions & 1 deletion tests/integrations/asgi/test_asgi.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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"