Как работает интеграция с Sentry для отслеживания ошибок?
Что проверяют
Понимаете ли вы, что происходит между исключением в коде и карточкой ошибки в интерфейсе Sentry, а не только умеете вставить sentry_sdk.init. Следом обычно спрашивают, как не утечь персональными данными, как не разориться на трассировке и почему из короткого скрипта события не доходят.
Как отвечать
Путь события выглядит так:
- перехват:
sentry_sdk.initставит хук наsys.excepthookи потоки, а интеграции оборачивают обработчики Django, Flask, FastAPI, Celery. Для установленных фреймворков они включаются автоматически, явно их передают ради настройки; - сбор: к исключению добавляются стек с локальными переменными, breadcrumbs (последние логи, SQL-запросы, HTTP-вызовы), теги, пользователь,
releaseиenvironment; - фильтрация: хук
before_sendпозволяет вырезать секреты или отбросить событие целиком.send_default_piiпо умолчанию выключен, и включать его стоит осознанно; - отправка: событие кладётся в очередь, фоновый поток отправляет его HTTP-запросом по адресу из DSN. В DSN лежат публичный ключ, хост и id проекта, это не секрет уровня пароля, но светить его зря не нужно;
- на сервере: события группируются в issue по отпечатку стека, а по
releaseвидно, в какой версии ошибка появилась и не вернулась ли.
Логи: LoggingIntegration по умолчанию превращает записи от INFO в breadcrumbs, а от ERROR в события. logger.exception(...) отдаёт в Sentry полный стек.
В асинхронном коде контекст разделяется через contextvars, поэтому теги одного запроса не попадают в другой. В SDK 2.x push_scope и configure_scope объявлены устаревшими, вместо них sentry_sdk.new_scope() и sentry_sdk.isolation_scope().
Где спотыкаются
Ставят traces_sample_rate=1.0 в проде, как в примере из документации. На живом трафике это огромный поток транзакций и перерасход квоты. В проде берут небольшую долю или функцию traces_sampler.
Не вызывают sentry_sdk.flush() в коротких скриптах и serverless-функциях. Процесс завершается раньше, чем фоновый поток успел отправить событие.
Ловят исключение и пишут logger.error(str(e)). Стек теряется, а в Sentry прилетает строка без контекста и с плохой группировкой.