Sentry — сервис отслеживания ошибок: перехватывает необработанные исключения в работающем приложении и присылает их разработчику вместе со стектрейсом, значениями переменных, данными запроса и пользователем, у которого это случилось.
Разница с логами принципиальна. Лог — это поток строк, в котором ошибку надо найти. Sentry сам ловит исключение, группирует одинаковые в одну проблему со счётчиком, показывает, когда она появилась и сколько людей задела. Вместо «пользователь пишет, что не работает» — «KeyError: 'email' в checkout.py:88, 412 раз за час, началось после релиза 2.3.1».
- Ошибки — необработанные исключения с полным стектрейсом и локальными переменными на каждом кадре.
- Группировка — тысяча одинаковых падений сворачивается в одну запись (issue) со счётчиком и списком затронутых пользователей.
- Контекст — URL и параметры запроса, версия релиза, окружение, id пользователя, «хлебные крошки» (что происходило до падения).
- Трейсинг — распределённые трассировки и время шагов запроса: похоже на APM, дополняет трейсы.
- Регрессии — если закрытая проблема появилась снова, Sentry заведёт её заново и пометит как регрессию.
pip install "sentry-sdk"Инициализация — как можно раньше при старте приложения:
import sentry_sdk
sentry_sdk.init(
dsn="https://<ключ>@<организация>.ingest.sentry.io/<проект>",
environment="production", # разделить прод и стейдж
release="myapp@2.3.1", # привязать ошибку к версии
traces_sample_rate=0.1, # доля запросов под трейсинг: 0.1 = 10%
send_default_pii=False, # НЕ слать IP и заголовки пользователя
)dsn— адрес проекта в Sentry, единственный обязательный параметр. Живёт в переменных окружения, не в коде.environment— иначе ошибки со стейджа смешаются с боевыми.release— без него не будет ответа на главный вопрос «после какого релиза началось».traces_sample_rate—1.0на проде дорого и шумно; берут 0.05–0.2.send_default_pii— включает сбор персональных данных (IP, заголовки, тело запроса). По умолчанию выключен, и включать его надо осознанно.
Фреймворки подхватываются автоматически: Django, FastAPI, Flask, Starlette, Celery и другие — SDK сам находит установленную библиотеку и вешает свои обработчики. Отдельно настраивать перехват исключений во view не нужно.
Иногда ошибку хочется отправить самому — например, поймал исключение, обработал, но знать о нём всё равно надо:
import sentry_sdk
try:
списать_деньги(order)
except PlatformError as e:
order.status = "retry"
sentry_sdk.capture_exception(e) # обработали, но зафиксировали
sentry_sdk.capture_message("странный формат ответа банка", level="warning")
sentry_sdk.set_user({"id": user.id}) # кто это был
sentry_sdk.set_tag("тариф", "premium") # по чему потом фильтроватьДля своих измерений времени — sentry_sdk.start_transaction() и sentry_sdk.start_span().
Шум убивает пользу. Если в Sentry летит всё подряд, на уведомления перестают смотреть, и настоящая авария теряется. Ожидаемые ошибки (валидация формы, 404) надо отфильтровывать через ignore_errors или before_send.
Утечка персональных данных. В стектрейс попадают локальные переменные — а там пароль из формы, токен, номер карты. Чувствительные значения вычищают в before_send, а send_default_pii оставляют выключенным. Это ещё и требование закона о персональных данных.
Sentry не заменяет метрики. Он показывает факт падения, но не расскажет, что сервис отвечает за 3 секунды, не падая. Для этого нужны метрики. Здоровая связка: метрики — «что-то не так», трейсы — «на каком шаге», логи и Sentry — «почему именно».
Метрики (Prometheus) → «латентность выросла в 3 раза в 14:20»
Трейсы → «медленный шаг — запрос к платёжному сервису»
Sentry / логи → «TimeoutError в payments.py:64, 812 раз»
- Наблюдаемость — метрики, логи, трейсы — общая теория: три источника сигналов и как они дополняют друг друга;
- Prometheus и Grafana — метрики и дашборды, вторая половина связки;
- logging — стандартное логирование Python, из которого Sentry умеет забирать записи;
- Развертывание проекта — куда прописывать DSN и
releaseпри выкатке; - Веб-безопасность — почему нельзя отправлять наружу персональные данные и секреты.