REPOSITORY / ScuroNeko/Laniakea

Wiki

KNOWLEDGE REPOSITORY
1
Sentry Integration RU
ScuroNeko edited this page 2026-07-09 18:13:22 +03:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Sentry Integration RU

English version: Sentry-Integration

Это краткая русскоязычная версия страницы про интеграцию с Sentry. Полная и наиболее актуальная страница: Sentry-Integration.

Идея

Laniakea намеренно не поставляет готовую интеграцию с Sentry. Точка расширения уже есть — интерфейс Observer (см. Error-Handling): в него прилетают все классифицированные ошибки из handler'ов, сцен, runner'ов и policy-проверок вместе с контекстом (plugin, handler kind, chat/user ID, update ID). Вызов observer'а panic-safe, так что упавший экспортёр не уронит бота.

Тегирование и фильтрация шума — вещи специфичные под конкретный бот, поэтому такой код лучше держать у себя, а не тянуть sentry-go в зависимости библиотеки.

Что отправлять

  • OnError — срабатывает на каждую ошибку из центрального потока handler/scene. Пропускай IsUserError(err) — это ожидаемые ошибки, уже показанные пользователю, а не баги.
  • OnPolicyChecked — срабатывает на каждую policy-проверку, включая обычные отказы "не разрешено". В Sentry стоит слать только Internal-ошибки (неправильная конфигурация, упавший запрос к API).
  • OnPollingRetry — сам по себе не инцидент, но полезен как breadcrumb перед реальной ошибкой.

Пример

Полный листинг — на странице Sentry-Integration. Кратко: реализуешь laniakea.Observer, у большинства методов пустое тело, а OnError/OnPolicyChecked/OnPollingRetry вызывают sentry.CaptureException(...) через sentry.GetHubFromContext(ctx), добавляя теги (plugin, handler_kind, handler_name, update_type) и chat_id/from_id/update_id в scope.SetContext(...).

Подключение

sentry.Init(sentry.ClientOptions{Dsn: dsn})
defer sentry.Flush(2 * time.Second)

bot.SetObserver(observability.SentryObserver{})

SetObserver(...) полностью заменяет observer (см. Bot-Options-and-Configuration). Если нужно несколько получателей (Sentry + метрики + логирование), пиши небольшой fan-out Observer, оборачивая вызов каждого дочернего observer'а своим recover(), чтобы паника в одном не блокировала остальных для того же события.

Что читать дальше