InfluxDB + ранний Grafana: строим операционный дашборд поверх collectd и Zabbix
Подключаем InfluxDB как time-series хранилище к collectd и Zabbix, поверх - Grafana. Графики наконец выглядят как инструмент, а не как артефакт 2005 года.
InfluxDB активно развивается в 2013 году как time-series БД, Grafana складывается как дашборд-инструмент поверх неё и Graphite
На Zabbix мы переехали летом. Мониторинг работает, триггеры срабатывают, алерты приходят. Но графики в Zabbix - это всегда был отдельный разговор. Встроенная визуализация делает своё дело: показывает нужную метрику за нужный период. Но только одну метрику на одном графике, в одном интерфейсе, который заточен под оператора мониторинга, а не под разговор с клиентом или дежурного инженера за 3 ночи.
Хотелось сделать что-то вроде операционного дашборда: несколько ключевых метрик на одном экране, понятный масштаб, возможность быстро провалиться в деталь. Cacti смотрели - слишком тяжело настраивать и визуально не лучше. Graphite интересен, но требует отдельного стека с Carbon и Whisper, и у его интерфейса своя специфика.
В итоге наткнулись на связку InfluxDB + Grafana.
Что это такое
InfluxDB - молодая time-series база данных, написанная на Go. Данные хранятся в виде временных рядов с тегами, HTTP API для записи и чтения, SQL-подобный язык запросов. Нет сложной инсталляции: один бинарник, конфиг, запустили. Для наших задач - принимать метрики с collectd и хранить их в виде, удобном для визуализации - подходит хорошо.
Grafana - веб-интерфейс для построения дашбордов. Умеет работать с InfluxDB и Graphite как с источниками данных. Дашборды - это JSON, их можно хранить в git и переносить между серверами. Интерфейс заметно современнее Zabbix: несколько графиков на одной странице, изменение временного окна перетаскиванием, масштабирование кликом.
Оба проекта активно разрабатываются, и это чувствуется: периодически что-то меняется между версиями, документация не всегда успевает. Но для внутреннего инструмента это терпимо.
Схема, которую подняли
collectd на каждом сервере собирает системные метрики: CPU, память, диск, сеть. У collectd есть плагин write_http - он умеет отдавать данные в формате JSON по HTTP. InfluxDB принимает этот формат нативно, то есть collectd пишет напрямую в InfluxDB без промежуточного агрегатора.
Для метрик из Zabbix сделали немного по-другому: написали небольшой скрипт, который через Zabbix API периодически тянет нужные метрики и кладёт в InfluxDB. Это не идеал - было бы чище настроить export напрямую из Zabbix, но готового модуля нет, а дублировать агенты не хотелось. Скрипт пока справляется.
Grafana поднята как отдельный nginx-сайт, смотрит в InfluxDB как в data source. Первый дашборд собрали за пару часов: CPU load average, потребление памяти, сетевой трафик по интерфейсам, дисковый I/O - всё на одном экране, временное окно по умолчанию последние 6 часов.
Что сразу понравилось
Временное окно. В Zabbix чтобы сдвинуть период надо ввести даты. В Grafana - потащил за нижнюю ось или выбрал из стандартных вариантов в верхнем углу. На дежурстве это реально быстрее.
Несколько метрик на одном графике. Смотреть CPU и memory на одной шкале не всегда нужно, но сравнить load average трёх серверов на одном панели - очень удобно при расследовании. В Zabbix это либо не делается, либо через костыли с custom screens.
JSON-дашборды. Сохранили первый рабочий дашборд в git. Если поднимать такую же инсталляцию для другого клиента - основа уже есть, только поменять имена хостов в запросах.
Внешний вид. Это звучит несерьёзно, но когда показываешь клиенту на сопровождении состояние его инфраструктуры, разница между графиком из Zabbix и графиком из Grafana видна сразу. Не в том смысле что данные другие - в том смысле что один выглядит как рабочий инструмент, другой как утилита из 2005 года.
Где пока не всё гладко
InfluxDB молодой продукт, и это означает что API и формат данных между релизами могут поменяться без особых предупреждений. Один раз уже словили несовместимость между версией которую использовали и плагином write_http в collectd - пришлось разбираться с форматом JSON вручную.
Retention policy - по умолчанию данные хранятся бесконечно. Для демостенда на несколько серверов это не проблема, но если собирать метрики с плотностью раз в 10 секунд с десятков хостов, размер базы начнёт расти заметно. Настроили retention на 90 дней для детальных данных и downsampling до часового разрешения для архива - InfluxDB это умеет через continuous queries.
Алертинга в Grafana пока нет. Дашборд - только визуализация. Алерты по-прежнему через Zabbix, Grafana - только для наблюдения. Это не минус, это просто разные инструменты для разных задач.
Где сейчас
Поднято на одном клиенте, смотрим в режиме пилота. Собираем метрики примерно с двадцати хостов - смешанный Linux-парк с несколькими Windows-серверами (там collectd не встаёт нативно, для них используем написанный скрипт через Performance Counters и тот же HTTP API). Дашборды живут в git, менять и дополнять удобно.
Zabbix никуда не делся - он по-прежнему делает мониторинг доступности и отправляет алерты. InfluxDB + Grafana - это слой визуализации метрик поверх того что уже есть, не замена. Пока выглядит как рабочая схема, будем смотреть как ведёт себя под реальной нагрузкой.