Фильтрация обработанных исключений из логов Sentry
Задача
Sentry – отличный инструмент для оперативного выявления ошибок в задеплоеном на сервере приложении. Он поддерживает множество языков программирования и фреймворков, имеет бесплатный и платные тарифы, а также может быть развернут самостоятельно. Однако, при отладке своего нового проекта RSS Reader я столкнулся с тем, что обработанные в коде исключения регистрируются как события (Issues) в логах Sentry, что для меня оказалось нежелательным поведением. Кроме того, что эти события сбивают с толку, они ещё и расходуют ограниченную квоту в бесплатном тарифе.
Обратите внимание на тэги handled: yes
и logger: ...
на скриншоте:
Это означает, что "ошибка" сгенерирована логгером и уже обработана в коде, который в моём случае выглядит вот так:
try:
response = requests.get(url, timeout=5.0)
except Exception as exc:
logger.exception(f"Failed to get content from {url}", exc_info=exc)
raise CantGetPageInfoFromURL
Как следует из документации Sentry SDK, перед непосредственной отправкой данных о событии на сервер, вызывается callback-функция, переданная в качестве параметра before_send
при инициализации Sentry SDK в проекте.
Предлагаемая реализация
Ниже приведён пример реализации такой функции, которая отфильтрует все "ошибки", сгенерированные логгером и обработанные исключения:
if SENTRY_DSN := env.str("SENTRY_DSN", None):
import sentry_sdk
def before_send(event: dict, hint: dict) -> dict | None:
# Фильтруем ошибки, зарегистрированные логгером
if "logger" in event:
return None
# Фильтруем обработанные в коде исключения
if exceptions := event.get("exception", {}).get("values", []):
if exceptions[-1].get("mechanism", {}).get("handled"):
return None
return event
sentry_sdk.init(
dsn=SENTRY_DSN,
traces_sample_rate=0.5,
before_send=before_send,
)
Параметр event
функции before_send
содержит подробнейшую информацию о произошедшем событии (см. ссылки на документацию в конце поста), так что при необходимости можно настроить ещё более тонкую фильтрацию передаваемых на сервер событий, или даже модифицировать данные перед их передачей.
Надеюсь, это решение поможет и вам использовать Sentry в своём проекте оптимальным образом!
Справочные материалы
- Документация Sentry SDK для Python:
- Sentry: мониторинг и отслеживание ошибок – хороший пост с разделом про деплой self-hosted варианта Sentry.
Отправить сообщение
С помощью формы ниже, вы можете связаться с автором сайта. Пожалуйста, укажите ваш ник в Телеграме или e-mail, чтобы я смог вам ответить!