diff --git a/sentry_sdk/consts.py b/sentry_sdk/consts.py index 6e63b9a549..7c4e2ff2fc 100644 --- a/sentry_sdk/consts.py +++ b/sentry_sdk/consts.py @@ -84,6 +84,7 @@ class CompressionAlgo(Enum): "before_send_metric": Optional[Callable[[Metric, Hint], Optional[Metric]]], "trace_lifecycle": Optional[Literal["static", "stream"]], "ignore_spans": Optional[IgnoreSpansConfig], + "suppress_asgi_chained_exceptions": Optional[bool], }, total=False, ) diff --git a/sentry_sdk/integrations/asgi.py b/sentry_sdk/integrations/asgi.py index da87f8b2fb..2294781f05 100644 --- a/sentry_sdk/integrations/asgi.py +++ b/sentry_sdk/integrations/asgi.py @@ -4,6 +4,7 @@ Based on Tom Christie's `sentry-asgi `. """ +import sys import asyncio import inspect from copy import deepcopy @@ -37,6 +38,8 @@ logger, transaction_from_function, _get_installed_modules, + reraise, + capture_internal_exceptions, ) from typing import TYPE_CHECKING @@ -187,8 +190,19 @@ async def _run_app( return await self.app(scope, receive, send) except Exception as exc: - self._capture_lifespan_exception(exc) - raise exc from None + suppress_chained_exceptions = ( + sentry_sdk.get_client() + .options.get("_experiments", {}) + .get("suppress_asgi_chained_exceptions", True) + ) + if suppress_chained_exceptions: + self._capture_lifespan_exception(exc) + raise exc from None + + exc_info = sys.exc_info() + with capture_internal_exceptions(): + self._capture_lifespan_exception(exc) + reraise(*exc_info) client = sentry_sdk.get_client() span_streaming = has_span_streaming_enabled(client.options) @@ -323,8 +337,19 @@ async def _sentry_wrapped_send( scope, receive, _sentry_wrapped_send ) except Exception as exc: - self._capture_request_exception(exc) - raise exc from None + suppress_chained_exceptions = ( + sentry_sdk.get_client() + .options.get("_experiments", {}) + .get("suppress_asgi_chained_exceptions", True) + ) + if suppress_chained_exceptions: + self._capture_request_exception(exc) + raise exc from None + + exc_info = sys.exc_info() + with capture_internal_exceptions(): + self._capture_request_exception(exc) + reraise(*exc_info) finally: _asgi_middleware_applied.set(False)