diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /third_party/python/sentry-sdk/sentry_sdk/integrations/serverless.py | |
parent | Initial commit. (diff) | |
download | firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/python/sentry-sdk/sentry_sdk/integrations/serverless.py')
-rw-r--r-- | third_party/python/sentry-sdk/sentry_sdk/integrations/serverless.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/third_party/python/sentry-sdk/sentry_sdk/integrations/serverless.py b/third_party/python/sentry-sdk/sentry_sdk/integrations/serverless.py new file mode 100644 index 0000000000..6dd90b43d0 --- /dev/null +++ b/third_party/python/sentry-sdk/sentry_sdk/integrations/serverless.py @@ -0,0 +1,87 @@ +import functools +import sys + +from sentry_sdk.hub import Hub +from sentry_sdk.utils import event_from_exception +from sentry_sdk._compat import reraise + + +from sentry_sdk._types import MYPY + +if MYPY: + from typing import Any + from typing import Callable + from typing import TypeVar + from typing import Union + from typing import Optional + + from typing import overload + + F = TypeVar("F", bound=Callable[..., Any]) + +else: + + def overload(x): + # type: (F) -> F + return x + + +@overload +def serverless_function(f, flush=True): + # type: (F, bool) -> F + pass + + +@overload # noqa +def serverless_function(f=None, flush=True): + # type: (None, bool) -> Callable[[F], F] + pass + + +def serverless_function(f=None, flush=True): # noqa + # type: (Optional[F], bool) -> Union[F, Callable[[F], F]] + def wrapper(f): + # type: (F) -> F + @functools.wraps(f) + def inner(*args, **kwargs): + # type: (*Any, **Any) -> Any + with Hub(Hub.current) as hub: + with hub.configure_scope() as scope: + scope.clear_breadcrumbs() + + try: + return f(*args, **kwargs) + except Exception: + _capture_and_reraise() + finally: + if flush: + _flush_client() + + return inner # type: ignore + + if f is None: + return wrapper + else: + return wrapper(f) + + +def _capture_and_reraise(): + # type: () -> None + exc_info = sys.exc_info() + hub = Hub.current + if hub is not None and hub.client is not None: + event, hint = event_from_exception( + exc_info, + client_options=hub.client.options, + mechanism={"type": "serverless", "handled": False}, + ) + hub.capture_event(event, hint=hint) + + reraise(*exc_info) + + +def _flush_client(): + # type: () -> None + hub = Hub.current + if hub is not None: + hub.flush() |