Repository navigation
feat(asgi): add error tracking middleware - #1037
Merged
Merged
Conversation
Contributor
posthog-python Compliance ReportDate: 2026-10-08T10:43:07.271314+00:00 ✅ All Tests Passed!121/121 tests passed Capture_V1 Tests✅ 95/95 tests passed View Details
Capture_Ai Tests✅ 5/5 tests passed View Details
Feature_Flags Tests✅ 17/17 tests passed View Details
Feature_Flags_Local_Evaluation Tests✅ 4/4 tests passed View Details
|
hpouillot
force-pushed
the
feat/asgi-error-tracking
branch
from
October 8, 2026 09:48
f07926f to
163293e
Compare
PR overviewAll previously flagged issues have been addressed. No open security concerns remain on this pull request. Security reviewNo open security issues remain on this pull request. Fixed/addressed: 1 · PR risk: 0/10 |
hpouillot
force-pushed
the
feat/asgi-error-tracking
branch
from
October 8, 2026 10:22
163293e to
39a00c8
Compare
hpouillot
force-pushed
the
feat/asgi-error-tracking
branch
from
October 8, 2026 10:34
39a00c8 to
e43ca8e
Compare
ablaszkiewicz
approved these changes
Oct 8, 2026
ablaszkiewicz
left a comment
Contributor
There was a problem hiding this comment.
Looks good 👍 I was worried we would extract some unwanted headers but I see that we only capture very specific ones
3 of 5 tasks
3 of 5 tasks
eli-r-ph
pushed a commit
that referenced
this pull request
Oct 10, 2026
* feat(asgi): add error tracking middleware * chore(asgi): type exception capture metadata * fix(asgi): make tracing header trust explicit * refactor(asgi): expose request properties terminology (cherry picked from commit 1c6a47a)
eli-r-ph
pushed a commit
that referenced
this pull request
Oct 10, 2026
* feat(asgi): add error tracking middleware * chore(asgi): type exception capture metadata * fix(asgi): make tracing header trust explicit * refactor(asgi): expose request properties terminology (cherry picked from commit 1c6a47a)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
💡 Motivation and Context
Python users running FastAPI, Starlette, Litestar, or raw ASGI applications currently have no framework integration that automatically establishes PostHog request context and captures unhandled request exceptions. This adds dependency-free ASGI middleware that works directly with the ASGI protocol.
The middleware instruments HTTP and WebSocket scopes, adds request properties without collecting bodies or query strings, supports sync or async filters and extra properties, captures escaping exceptions once, and preserves normal ASGI propagation. Lifespan and custom scope types pass through untouched. Client-provided PostHog distinct/session tracing headers are ignored by default and can be enabled explicitly with
trust_tracing_headers=True; they are analytics context and must never be treated as authentication or authorization.The integration uses the SDK-internal typed metadata channel from #898 and follows the canonical exception event metadata specification. Escaping ASGI failures emit
$exception_level: error,$exception_source: asgi.middleware, and an outermost mechanism withtype: middleware,handled: false,synthetic: false, andexception_id: 0.💚 How did you test it?
uv run --extra test pytest -q --timeout=30— 4492 passed, 16 skipped, 48 subtestsuv run ruff format --check .uv run ruff check .uv run --extra dev mypy --no-site-packages --config-file mypy.ini . | uv run --extra dev mypy-baseline filteruv run --extra dev make public_api_checkuv run python -W error -c "import posthog"Tests assert request/context isolation, safe request properties, explicit tracing-header trust, filters, WebSockets, exception propagation, typed integration metadata, and final canonical event properties from a real client.
📝 Checklist
If releasing new changes
sampo addto generate a changeset fileA valid
.sampo/changesets/asgi-error-tracking.mdchangeset was added directly.🤖 Agent context
Autonomy: Human-driven (agent-assisted)
Implemented by the Pi coding agent in Cockpit. The implementation uses raw ASGI rather than depending on FastAPI or Starlette, omits query strings and bodies for privacy, makes client-controlled tracing identity opt-in, and lets handled framework responses pass without reporting them as exceptions. Human review is required.