Фильтрация обработанных исключений из логов Sentry

Задача

Sentry – отличный инструмент для оперативного выявления ошибок в задеплоеном на сервере приложении. Он поддерживает множество языков программирования и фреймворков, имеет бесплатный и платные тарифы, а также может быть развернут самостоятельно. Однако, при отладке своего нового проекта RSS Reader я столкнулся с тем, что обработанные в коде исключения регистрируются как события (Issues) в логах Sentry, что для меня оказалось нежелательным поведением. Кроме того, что эти события сбивают с толку, они ещё и расходуют ограниченную квоту в бесплатном тарифе.

Обратите внимание на тэги handled: yes и logger: ... на скриншоте:

Screenshot 1

Это означает, что "ошибка" сгенерирована логгером и уже обработана в коде, который в моём случае выглядит вот так:

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 в своём проекте оптимальным образом!

Справочные материалы

Отправить сообщение

С помощью формы ниже, вы можете связаться с автором сайта. Пожалуйста, укажите ваш ник в Телеграме или e-mail, чтобы я смог вам ответить!