О Graphite
2014-05-04
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, еще не вышел, хотя исправления в репозитории уже есть).