From 85f0e60cd9d0f9078b3fae56dbf6c6be406b22c4 Mon Sep 17 00:00:00 2001 From: ryder777777 Date: Thu, 22 Oct 2026 13:30:44 +0000 Subject: [PATCH] fix(dedupe): Mark active session as crashed when deduplicating unhandled exceptions --- sentry_sdk/integrations/dedupe.py | 17 ++++++++++++++ tests/integrations/flask/test_flask.py | 31 ++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/sentry_sdk/integrations/dedupe.py b/sentry_sdk/integrations/dedupe.py index a0e9014666..fe7f66f3a2 100644 --- a/sentry_sdk/integrations/dedupe.py +++ b/sentry_sdk/integrations/dedupe.py @@ -42,6 +42,23 @@ def processor(event: "Event", hint: "Optional[Hint]") -> "Optional[Event]": exc = exc_info[1] if last_seen is exc: + exceptions = (event.get("exception") or {}).get("values") or () + for error in exceptions: + mechanism = ( + error.get("mechanism") if isinstance(error, dict) else None + ) + if ( + isinstance(mechanism, dict) + and mechanism.get("handled") is False + ): + session = ( + sentry_sdk.get_isolation_scope()._session + or sentry_sdk.get_current_scope()._session + ) + if session is not None: + session.update(status="crashed") + break + logger.info("DedupeIntegration dropped duplicated error event %s", exc) return None diff --git a/tests/integrations/flask/test_flask.py b/tests/integrations/flask/test_flask.py index 498f74d82e..4de3649da5 100644 --- a/tests/integrations/flask/test_flask.py +++ b/tests/integrations/flask/test_flask.py @@ -397,6 +397,37 @@ def index(): assert session["attrs"]["release"] == "demo-release" +def test_flask_session_tracking_log_then_reraise(sentry_init, capture_envelopes, app): + sentry_init( + integrations=[flask_sentry.FlaskIntegration()], + release="demo-release", + ) + + @app.route("/") + def index(): + try: + raise ValueError("db down") + except ValueError: + logging.exception("failed to load") + raise + + envelopes = capture_envelopes() + + with app.test_client() as client: + with pytest.raises(ValueError): + client.get("/") + + sentry_sdk.flush() + + session_envelopes = [ + e for e in envelopes if any(item.type == "sessions" for item in e.items) + ] + assert len(session_envelopes) == 1 + aggregates = session_envelopes[0].items[0].payload.json["aggregates"] + assert sum(agg.get("crashed", 0) for agg in aggregates) == 1 + assert sum(agg.get("errored", 0) for agg in aggregates) == 0 + + @pytest.mark.parametrize("data", [{}, []], ids=["empty-dict", "empty-list"]) def test_flask_empty_json_request(sentry_init, capture_events, app, data): sentry_init(integrations=[flask_sentry.FlaskIntegration()])