cyberflow_gravatar

Cyberflow

I am linux system administrator.


Navigation
» Home
» Categories
» Code
» XML Feed

send kapacitor alert to Icinga 2

08 Dec 2017 » monitoring

Сталкнулся с необходимостью мониторить метрики собираймые с хостов при помощи 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