# Шаблон конфигурации Alertmanager. Боевой файл собирается на хосте при деплое # (`envsubst` в deploy-metrics.yml) и в репозиторий не попадает — токен бота и # идентификатор чата живут в окружении хоста, а не в git. # # ПОЧЕМУ TELEGRAM НАПРЯМУЮ, А НЕ ЧЕРЕЗ БЭКЕНД МЕРЫ. У МЕРЫ уже есть рабочий путь # доставки (вебхук GlitchTip → бот), и соблазн переиспользовать его велик. Но тогда # сообщение о том, что лёг Poincare, шло бы через сервис НА Poincare. Алерт обязан # уметь уйти без участия хоста, про который он написан. # # Telegram с Beget работает — проверено серией замеров 25.08: TLS-рукопожатие # 18 из 20, getMe 4 из 4. Ломается только длинный long-poll (30 с), а отправка # сообщения — короткий запрос. global: resolve_timeout: 5m route: receiver: telegram # Группируем по алерту и хосту: пятнадцать контейнеров одного хоста, упавших # разом, — это одно событие, а не пятнадцать сообщений. group_by: ["alertname", "host"] group_wait: 45s group_interval: 5m # Повтор раз в 6 часов. Чаще — приучает игнорировать, реже — можно проспать. repeat_interval: 6h routes: # Watchdog не должен смешиваться с настоящими алертами и не должен молчать: # это «сторож сторожа», он горит всегда и подтверждает, что канал доставки жив. - receiver: telegram-heartbeat matchers: - alertname = "Watchdog" group_wait: 0s group_interval: 12h repeat_interval: 12h # Критичное — без задержки на группировку. - receiver: telegram matchers: - severity = "critical" group_wait: 10s repeat_interval: 3h inhibit_rules: # Если хост целиком недоступен, не сыпать отдельно про каждый его сервис. - source_matchers: [alertname = "HostAgentDown"] target_matchers: [severity =~ "warning|critical"] equal: ["host"] receivers: - name: telegram telegram_configs: - bot_token: "${METRICS_TELEGRAM_BOT_TOKEN}" chat_id: ${METRICS_TELEGRAM_CHAT_ID} ${METRICS_TELEGRAM_TOPIC_LINE} api_url: "https://api.telegram.org" parse_mode: HTML send_resolved: true message: | {{ if eq .Status "firing" }}🔴{{ else }}🟢{{ end }} {{ .CommonLabels.alertname }}{{ if .CommonLabels.host }} · {{ .CommonLabels.host }}{{ end }} {{ range .Alerts }} {{ .Annotations.summary }} {{ if .Annotations.description }}{{ .Annotations.description }}{{ end }} {{ end }} - name: telegram-heartbeat telegram_configs: - bot_token: "${METRICS_TELEGRAM_BOT_TOKEN}" chat_id: ${METRICS_TELEGRAM_CHAT_ID} ${METRICS_TELEGRAM_TOPIC_LINE} api_url: "https://api.telegram.org" parse_mode: HTML send_resolved: false message: | ⚪ Мониторинг жив — сторож отчитался, канал доставки работает. Если это сообщение перестало приходить дважды подряд, замолчал сам мониторинг.