"""Sentry connector (ported from integration_scripts.connectors.sentry). Provides: - sentry_client: global client instance - get_client(): initialize raven.Client with DSN from config.SENTRY - send_response_to_sentry(resp, message): capture message with extra context """ from __future__ import annotations from typing import Any, Optional import raven # type: ignore import config sentry_client: Optional[Any] = None def get_client() -> Any: """Initialize and return the Sentry client. Mirrors legacy behavior: if config.SENTRY is None, an empty client is still initialized with DSN=None. """ global sentry_client sentry_client = raven.Client(config.SENTRY) return sentry_client def send_response_to_sentry(resp: Any, message: str) -> None: """Send a response object context to Sentry as a message. Expects `resp` to have attributes: message, errors, status. """ # global sentry_client # noqa: F841 if not sentry_client: return sentry_client.captureMessage( message=message, stack=True, extra={ "message": getattr(resp, "message", None), "errors": getattr(resp, "errors", None), "status": getattr(resp, "status", None), }, )