TurboGears / TurboGears/backlash
Add ASGI support for TraceErrorsMiddleware (crash reporting)
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 13
- Forks
- 13
- PR merge metrics
- No merged PRs in 30d
Description
Goal
Provide an ASGI counterpart to TraceErrorsMiddleware so ASGI applications (Starlette, FastAPI, bare ASGI apps) can get crash reporting through the existing reporters (email, Sentry).
Done criteria:
- A new
AsgiTraceErrorsMiddleware(e.g. inbacklash/tracing/errors/) that:- Passes through non-
httpscopes (websocket,lifespan) untouched. - Catches unhandled exceptions, builds the context (context injectors receive the ASGI
scope), captures the traceback, logs it, and dispatches it to the configured reporters. - Sends a plain
500 Internal Server Errorresponse whenhttp.response.starthas not been sent; logs and re-raises when the response already started (matchingAsgiDebuggedApplicationpost-start semantics from #23). - Supports the recorded-exception protocol: after the app completes, a
backlash.exc_infokey stashed in the scope by the framework is popped and reported (ASGI analog of the WSGIenviron['backlash.exc_info']handshake used by TurboGears).
- Passes through non-
- Reporters are reused unchanged.
- Error output goes to the
backlashlogger /sys.stderr(nowsgi.errorsequivalent exists in ASGI). - Behavior is covered by in-process ASGI tests mirroring the existing WSGI middleware semantics.
Out of scope: TraceSlowRequestsMiddleware. Its thread-ident stack snapshotting (sys._current_frames()) is meaningless under an event loop and needs a redesign around asyncio.Task.get_stack(); that deserves its own issue.
Why
#23 brings the interactive debugger to ASGI, but production crash reporting (email/Sentry) remains WSGI-only, so ASGI users get development-time parity without the production-facing half. The middleware is structurally a stripped-down AsgiDebuggedApplication (run app, capture, report, plain 500), and the reporters already consume only the transport-agnostic Traceback object, so the port is a thin adapter (~60 lines) over existing scaffolding.
One caveat worth addressing during implementation: EmailReporter uses synchronous smtplib, which blocks the event loop while reporting. Consider offloading reporter dispatch (e.g. asyncio.to_thread) or documenting the trade-off; the Sentry reporter queues internally and is unaffected.
References
backlash/tracing/errors/middleware.py(TraceErrorsMiddleware) — WSGI logic to mirror, including thebacklash.exc_info/backlash.exc_environrecorded-exception handshake.backlash/asgi.py(AsgiDebuggedApplication, from #23) — established ASGI shell patterns: scope filtering, response-started tracking, post-start re-raise, logger/stderr error sink.backlash/tracing/reporters/(mail.py,sentry.py) — transport-agnostic reporters to reuse.- Issue: Add ASGI support for the interactive debugger #23 — parent effort; this middleware depends on conventions introduced there.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with backlash/tracing/errors/middleware.py for the WSGI behavior and backlash/asgi.py for scope filtering and response-started handling. Then inspect backlash/tracing/reporters/mail.py and sentry.py, and use in-process ASGI tests to verify exception reporting, recorded exceptions, non-http pass-through, and the plain 500 or post-start re-raise behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 65/100