2024-10-14 12:19:30 +03:00
|
|
|
|
import logging
|
|
|
|
|
|
|
2024-02-16 12:34:39 +03:00
|
|
|
|
import sentry_sdk
|
|
|
|
|
|
from sentry_sdk.integrations.ariadne import AriadneIntegration
|
2025-09-25 08:48:36 +03:00
|
|
|
|
from sentry_sdk.integrations.logging import LoggingIntegration
|
2024-02-16 12:34:39 +03:00
|
|
|
|
from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration
|
|
|
|
|
|
from sentry_sdk.integrations.starlette import StarletteIntegration
|
2024-08-09 09:37:06 +03:00
|
|
|
|
|
2024-04-09 19:50:27 +03:00
|
|
|
|
from settings import GLITCHTIP_DSN
|
2024-02-16 12:34:39 +03:00
|
|
|
|
|
2024-08-26 21:18:33 +03:00
|
|
|
|
logger = logging.getLogger(__name__)
|
2024-02-16 12:34:39 +03:00
|
|
|
|
|
2024-10-14 12:19:30 +03:00
|
|
|
|
|
2025-06-02 02:56:11 +03:00
|
|
|
|
def start_sentry() -> None:
|
2025-09-25 08:48:36 +03:00
|
|
|
|
"""🔍 Инициализация Sentry/GlitchTip с дублированием логов"""
|
2024-02-16 12:34:39 +03:00
|
|
|
|
try:
|
2025-08-17 17:56:31 +03:00
|
|
|
|
logger.info("[utils.sentry] Sentry init started...")
|
2025-09-25 08:48:36 +03:00
|
|
|
|
|
2025-09-27 13:51:15 +03:00
|
|
|
|
# 🔍 Проверяем наличие DSN
|
|
|
|
|
|
if not GLITCHTIP_DSN:
|
|
|
|
|
|
logger.warning("[utils.sentry] GLITCHTIP_DSN не установлен, пропускаем инициализацию Sentry")
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
logger.info(f"[utils.sentry] Используем DSN: {GLITCHTIP_DSN[:50]}...")
|
|
|
|
|
|
|
2025-09-25 08:48:36 +03:00
|
|
|
|
# 🧾 Настройка 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
|
|
|
|
|
|
|
2024-02-16 12:34:39 +03:00
|
|
|
|
sentry_sdk.init(
|
2024-08-26 21:18:33 +03:00
|
|
|
|
dsn=GLITCHTIP_DSN,
|
|
|
|
|
|
traces_sample_rate=1.0, # Захват 100% транзакций
|
|
|
|
|
|
profiles_sample_rate=1.0, # Профилирование 100% транзакций
|
2024-02-16 12:34:39 +03:00
|
|
|
|
enable_tracing=True,
|
2025-09-25 08:48:36 +03:00
|
|
|
|
before_send=before_send, # 🔍 Фильтрация спама авторизации
|
|
|
|
|
|
integrations=[
|
|
|
|
|
|
sentry_logging, # 🔍 Дублирование логов
|
|
|
|
|
|
StarletteIntegration(),
|
|
|
|
|
|
AriadneIntegration(),
|
|
|
|
|
|
SqlalchemyIntegration(),
|
|
|
|
|
|
],
|
2024-08-26 21:18:33 +03:00
|
|
|
|
send_default_pii=True, # Отправка информации о пользователе (PII)
|
2024-02-16 12:34:39 +03:00
|
|
|
|
)
|
2025-08-17 17:56:31 +03:00
|
|
|
|
logger.info("[utils.sentry] Sentry initialized successfully.")
|
2025-09-27 13:51:15 +03:00
|
|
|
|
|
2025-06-02 02:56:11 +03:00
|
|
|
|
except (sentry_sdk.utils.BadDsn, ImportError, ValueError, TypeError) as _e:
|
2025-08-17 17:56:31 +03:00
|
|
|
|
logger.warning("[utils.sentry] Failed to initialize Sentry", exc_info=True)
|