fix(dedupe): Track seen exceptions via attribute instead of ContextVar - #7533
ericapisani wants to merge 6 commits into
Conversation
Codecov Results 📊✅ 66097 passed | ⏭️ 2999 skipped | Total: 69096 | Pass Rate: 95.66% | Execution Time: 188m 32s 📊 Comparison with Base Branch
All tests are passing successfully. ✅ Patch coverage is 100.00%. Project has 2074 uncovered lines. Coverage diff@@ Coverage Diff @@
## master #PR +/-##
==========================================
- Coverage 90.28% 90.09% -0.19%
==========================================
Files 193 179 -14
Lines 25729 20923 -4806
Branches 9496 7522 -1974
==========================================
+ Hits 23228 18849 -4379
- Misses 2501 2074 -427
- Partials 1432 1180 -252Generated by Codecov Action |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 900ad90. Configure here.
| else: | ||
| with capture_internal_exceptions(): | ||
| exc._handled_by_sentry = True | ||
| return event |
There was a problem hiding this comment.
Dropped events still mark exceptions handled
Medium Severity
The _handled_by_sentry flag is set in the event processor, which runs before before_send. If before_send then drops the event, the flag stays set, so a later capture of the same exception instance is discarded by DedupeIntegration even though Sentry never received the first one. This reintroduces the previously fixed dropped-event dedupe bug.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 900ad90. Configure here.


Replace DedupeIntegration's weakref/ContextVar-based "last seen"
tracking with a
_handled_by_sentryflag set directly on theexception. This avoids the contextvar leaking across async contexts
and removes the need for
reset_last_seen(), which the client usedto call after
before_senddropped an exception.Add a regression test for the case where the same exception instance
is re-raised (e.g. Django re-raising in middleware after a view
already handled it) to confirm it's still deduped correctly.
Fixes PY-2381
Fixes #6094