Sentry + Telegram-алерты: что прилетает оператору и когда
Какие настройки включают obs-канал, какие события туда падают, как тестировать без боевых падений, почему alerter «ленивый» и пересоздаётся после изменения настроек.
Когда что-то падает в job-раннере, в worker'е или в worker pipeline'е обновлений — оператор должен узнать об этом до клиента. У wl-installer для этого ровно два канала: Sentry (для разработчика) и Telegram (для дежурного). Оба опциональны, оба настраиваются через /admin/settings, оба не требуют переcборки бинарника.
Канальная реализация живёт в api/internal/obs/lazy.go: LazyAlerter держит инстансы клиентов в кеше и пересоздаёт их, как только оператор тронул соответствующие настройки. Это сделано через onWrite-хук settings.Handlers — поэтому изменения подхватываются мгновенно, без рестарта.
Какие ключи в platform_settings
- obs.sentry.dsn — DSN проекта Sentry (зашифровано)
- obs.sentry.environment — production / staging (plaintext)
- obs.telegram.bot_token — токен бота (зашифровано)
- obs.telegram.chat_id — ID чата или канала (plaintext, начинается с -100… для каналов)
Какие события уходят в каналы
Сейчас алерт фиксируется на финальных провалах job'ов: deploy.provision (новый тенант не поднялся), deploy.update (rolling update упал и сделал rollback), deploy.update_domains (Caddy reload или DNS-pre-check провалился). На каждое — короткое сообщение в Telegram и event в Sentry с deployment_id + последним stderr.
Не уходят алерты на обычные клиентские 4xx, на ретраи job'ов (пока счётчик попыток не исчерпан) и на действия через /admin (они и так в audit_log).
Как проверить, что канал работает
Самый чистый способ — заведомо невалидный токен провайдера в hetzner.token и попытка создать тестовый заказ. Provision-job упадёт на этапе createServer, провал попадёт в job_runs, OnFailure-хук дёрнет alerter — алерт прилетит в Telegram, ошибка в Sentry. Дальше токен можно вернуть.
Telegram-бот должен быть добавлен в чат/канал; для каналов он должен иметь право «Post Messages». При первом вызове, если chat_id неверный, alerter залогирует ошибку, но не упадёт.
Ленивая инициализация — зачем
До первого реального события клиенты Sentry и Telegram не создаются. Это важно для двух кейсов: (1) свежий деплой без заполненных obs.* — приложение поднимается без падений; (2) оператор меняет токен в /admin/settings — старый клиент дропается, следующий вызов создаёт нового с новыми credentials.
Хук onWrite на settings.Handlers (handlers.go → WithRefresh) фиксирует факт изменения и вызывает alerter.Refresh(), который и обнуляет кеш.
Хотите развернуть свой тенант на wl-installer?
Аренда: 5 минут от заказа до боевого URL. Покупка с исходниками: 1–5 рабочих дней.