2014-05-04

О Graphite

Graphite — это мой любимый, на текущий момент, инструмент для мониторинга. Когда-то давно я писал подобную штуку самостоятельно, со сбором счетчиков интерфейсов свичей по SNMP на Perl, сбором и аггрегацией данных в Firebird, рисованием красивых графиков на PHP. Потом немного баловался с RRDTool. Имел дело с Munin. (С Ganglia дела не имел).


Велосипеды, это, конечно, хорошо. Но вот как раз систем сбора, анализа и визуализации так называемых time series, сейчас навалом. Есть даже монстры, работающие поверх HBase, — OpenTSDB. Так что велосипедить нет никакого смысла.

RRD (Round Robin Database) — это лишь система хранения и визуализации, лишь часть полноценного мониторинга. Тем не менее, RRD часто используется как бэкенд в этих самых системах мониторинга. Подтверждаю, хранить это дело в реляционных БД — весьма хлопотно, а RRD — вещь. Однако Graphite изобрел свой собственный движок хранения time series — Whisper. Он очень похож на RRD, но полностью написан на Python и позволяет сохранять нерегулярные апдейты. Как и в RRD, отчеты хранятся и аггрегируются в файлах фиксированного размера. Точность хранения (временной интервал между отчетами) и время (количество отчетов) задается при создании файла. В Graphite это настраивается в файле storage-schemas.conf.


В отличие от Munin, у Graphite — внятная, понятная и человеческая архитектура. Ну и написан он полностью на православном Python. Есть демон Carbon. Он слушает TCP сокет, имеет кэш данных и сохраняет данные в Whisper файлы. В него надо слать данные. Есть веб-морда (на Django), которая запрашивает данные у Carbon и рисует красивые графики.


В общем, нет никакой необходимости в специальных агентах для сбора и отправки данных. Нужно просто придумать хорошее уникальное имя для ваших данных (путь от общего к частному, включая имена хостов, разделенный точками), для каждой метрики. И слать данные вместе с таймстампом через TCP соединение. Из любого вашего любимого языка, который умеет TCP, слать что-то вроде:
 unique.prefix.host.metric0 12345 1399137594  
 unique.prefix.host.metric1 67890 1399137594  

Набор данных, периодичность и точность полностью задаются клиентом. Хотя точность и длительность хранения определяется настройками Whisper, как было сказано ранее.

Однако, и тут нет нужды велосипедить, ибо есть Diamond (да, тоже аллотроп углерода). Это мощнейший демон по сбору всякоразной информации о локалхосте и отсылки данных в Graphite, statsd и прочие демоны сбора. У него куча разных плугинов и собирать он может все, что угодно. Он тоже написан на православном Python, а значит, очень легко расширяем. Например, добавив лишь один метод к src/collectors/postgres.py можно мониторить что-нибудь хитрое в PostgreSQL.



Итак, у нас собираются и складываются данные. С ними надо что-то делать. Если в Munin у нас, чаще всего, есть только те графики, наличием которых озаботились авторы плугина сборки данных, то в Graphite графики — это полная свобода (и забота) пользователя. В веб интерфейсе вы указываете, какие значения выводить на этом графике, и какие графики должны быть показаны на дашбоарде. При этом вы можете всячески издеваться над исходными данными: складывать разные метрики, перемножать, даже брать производные (что нужно, например, чтобы получить график трафика из счетчика интерфейса). Набор функций — потрясающий. Ну а если нужно смотреть график где-то еще, можно запросить его через HTTP API.


Вообще-то, дефолтная веб мордочка у Graphite — довольно страшненькая и весьма интуитивно непонятная. Но есть альтернативы. Попробуем Grafana. Технически это JS приложение, работающее в браузере. Для получения данных оно использует то же Django приложение Graphite, только нужно разрешить яваскрипту доступ к другому домену (это называется CORS). Вот только для сохранения настроенных графиков и дашбоардов Grafana зачем-то использует Elasticsearch, а не какой-нибудь простой PostgreSQL. Ну а красота — вполне различима.


Если кого интересует масштабируемость, то такое тоже возможно. Данные от клиентов могут быть распределены по нескольким Carbon серверам, а веб приложение может запрашивать графики с нескольких бэкендов.

З.Ы. Есть хорошая инструкция, как это все быстро настроить под Ubuntu. (Впрочем, релиз Graphite, работающий в Django 1.6, еще не вышел, хотя исправления в репозитории уже есть).