import logging import sentry_sdk from sentry_sdk.integrations.ariadne import AriadneIntegration from sentry_sdk.integrations.logging import LoggingIntegration from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration from sentry_sdk.integrations.starlette import StarletteIntegration from settings import GLITCHTIP_DSN logger = logging.getLogger(__name__) def start_sentry() -> None: """🔍 Инициализация Sentry/GlitchTip с дублированием логов""" try: logger.info("[utils.sentry] Sentry init started...") # 🔍 Проверяем наличие DSN if not GLITCHTIP_DSN: logger.warning("[utils.sentry] GLITCHTIP_DSN не установлен, пропускаем инициализацию Sentry") return logger.info(f"[utils.sentry] Используем DSN: {GLITCHTIP_DSN[:50]}...") # 🧾 Настройка LoggingIntegration для дублирования логов # level=logging.WARNING - отправляем в GlitchTip только WARNING и выше # event_level=logging.ERROR - создаем события только для ERROR и выше sentry_logging = LoggingIntegration( level=logging.WARNING, # Захватываем WARNING+ в breadcrumbs event_level=logging.ERROR, # Создаем события только для ERROR+ ) # 🔍 Настраиваем фильтрацию через before_send callback def before_send(event, hint): """Фильтрует события перед отправкой в Sentry""" if "logentry" in event and "message" in event["logentry"]: message = event["logentry"]["message"] auth_spam_phrases = [ "Требуется авторизация", "AuthorizationError", "load_drafts", "GetUserDocuments", "GetDrafts", "decorated_function", ] if any(phrase in message for phrase in auth_spam_phrases): return None # Блокируем отправку return event sentry_sdk.init( dsn=GLITCHTIP_DSN, traces_sample_rate=1.0, # Захват 100% транзакций profiles_sample_rate=1.0, # Профилирование 100% транзакций enable_tracing=True, before_send=before_send, # 🔍 Фильтрация спама авторизации integrations=[ sentry_logging, # 🔍 Дублирование логов StarletteIntegration(), AriadneIntegration(), SqlalchemyIntegration(), ], send_default_pii=True, # Отправка информации о пользователе (PII) ) logger.info("[utils.sentry] Sentry initialized successfully.") # 🧪 Отправляем тестовое событие для проверки работы GlitchTip try: sentry_sdk.capture_message("🧪 GlitchTip test message - система инициализирована", level="info") logger.info("[utils.sentry] Тестовое сообщение отправлено в GlitchTip") except Exception as test_e: logger.warning(f"[utils.sentry] Не удалось отправить тестовое сообщение: {test_e}") except (sentry_sdk.utils.BadDsn, ImportError, ValueError, TypeError) as _e: logger.warning("[utils.sentry] Failed to initialize Sentry", exc_info=True)