Сталкнулся с необходимостью мониторить метрики собираймые с хостов при помощи telegraf.
Описание задачи
Есть хост с icinga2 занимающийся мониторингом разного и рассылающий алерты соответствующим людям. Так же есть метрики с хостов, собираемые telegraf, хранящиеся в influxdb. Нужно реагировать на метрики и присылать алерты с incinga2.
Реагирование на метрики
Можно насти разные подходы для процуссинга метрик с хоста, но разработчики influxdb имеют специализированный engine для этой задачи. Дополнительно он решает вопрос реагирования на пики между активными проверками. А этот вопрос обязательно возникнет, если выбрать подход опроса influxdb активными проверками со стороны icinga2. Таким образом мы вибираем подход в котором данные с хостов процессятся в kapacitor.
Настройка kapacitor-а
Kapacitor имеет таски, в которых описывается что и как должно мониторится. Кроме стандартных <>= можно настроить собственную систему Anomaly Detection. Тут я не буду вдаваться во все подробности. Нас интересует только тот момент, что каждая таска имеет в конфигурации блок alert
. Там можно настроить передачу события в обработчик алертов. В kapacitor представленно много уже готовых обработчиков, таких как email, HipChat, Slack, Telegram, PagerDuty, etc. но, к сожалению, нет ни одного, способного нативно отправить событие в icinga2. Но разработчики предусмотрели обработчик exec, который может выполнить программу на локальной машине. Его мы и будем использовать.
Так же отмечу, что для моих нужд оказалось проще и практичнее использовать topic. Topic
- это объект kapacitor в который разные таски могут присылать свои события и на этот топик подписывается обработчик этого топика, который одинакого опрабатывает все события в этом топике. Другими словами - если у нас есть несколько метрик для мониторинга, скажем Disk, CPU, Memory. Нам достаточно описать таски для всех и отправлять все события в один топик metric_events
и подключив всего один обработчик пересылать все события в icinga2.
Пример описания таски с использованием топика:
stream
|from()
.measurement('cpu')
.groupBy(*)
|alert()
.warn(lambda: "usage_idle" < 20)
.crit(lambda: "usage_idle" < 10)
.topic('metric_events')
Пример описания топика:
kind: exec
options:
prog: "/path/to/plugin/alert_to_icinga2.py"
args:
- "-u"
- "user"
- "-P"
- "password"
Сам же плагин для отправки событий в [icinga2] можно найти по ссылке https://github.com/cyberflow/kapacitor_alert_to_icinga2.git