src/Backend/src/api/sentry.py (47 lines of code) (raw):

import logging import typing import sentry_sdk from sentry_sdk.envelope import Envelope from sentry_sdk.integrations import logging as sentry_logging from sentry_sdk.integrations.aiohttp import AioHttpIntegration from sentry_sdk.integrations.asyncio import AsyncioIntegration from sentry_sdk.integrations.grpc import GRPCIntegration from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration from api import typings class _OfflineTransport(sentry_sdk.Transport): def capture_event(self, event: typing.Any) -> None: # Assume we originally logged the event as an exception with exc_info=True, # so the info should already be logged, no need to do anything here pass def capture_envelope(self, envelope: Envelope) -> None: logging.debug( "Sentry envelope", extra={"envelope": {"headers": envelope.headers, "items": envelope.items}}, ) OfflineTransport = _OfflineTransport() def setup(settings: typings.Settings) -> None: transport = None dsn = settings.get("sentry_dsn") if dsn: logging.info("Initialising Sentry with DSN") else: logging.info("Initialising Sentry with custom transport") transport = OfflineTransport _sentry_logging = sentry_logging.LoggingIntegration( level=logging.INFO, # Capture info and above as breadcrumbs event_level=logging.ERROR, # Send errors as events ) sentry_sdk.init( dsn=dsn, environment=settings.get("project_id"), release=settings.get("git_sha"), default_integrations=True, auto_enabling_integrations=False, integrations=[ _sentry_logging, AioHttpIntegration(), AsyncioIntegration(), GRPCIntegration(), SqlalchemyIntegration(), ], in_app_include=["api."], transport=transport, )