Краткое введение в Graphite

Что такое Graphite

Graphite — это приложение, которое здорово делает три вещи:

  1. принимает данные мониторинга от сторонних агентов,
  2. сохраняет их в базу, и
  3. показывает эти данные в виде графиков и дашбордов через веб-приложение

Изнутри Graphite состоит из трёх относительно независимых компонентов:

  1. Carbon — сервис, который принимает данные от других;
  2. Whisper — циклическая база данных;
  3. Graphite-web — веб-интерфейс с графиками, свистелками и прочими полезностями.

Установка

Есть много способов, как заполучить Graphite себе на хост. Но самый простой, как это обычно бывает, — через пакетный менеджер:  apt-get install graphite-web graphite-carbon.

Только просто установкой отделаться не получиться. Чтобы Graphite запустился, нужно еще поколдовать над конфигурацией:

  1. Создать базу данных для Graphite-web
  2. Настроить Carbon
  3. Установить и настроить веб-сервер.

Создаём базу данных для Graphite-web

Так как Graphite-web — полноценное веб-приложение с аутентификацией, пользователями и прочими сохраняемыми бесполезностями, ему нужна собственная база данных. Подойдёт MySQL, PostgreSQL, или SQLite. SQLite включён по умолчанию, так что можно избавить себя от ковыряния в конфигурационных файлах и остановиться на нём.

У Графита есть   syncdb команда, которая создаст базу, но скорее одной командой не обойдёшься. Ведь создадим-то мы базу под своим аккаунтом, а работать с ней будет веб-сервер через свой собственный, и наверняка с правами только на чтение. Можно поступить рабоче-крестьянски и просто дать права на запись всем подряд. В итоге мы имеем такую команду, которая всё сделает:

Настраиваем Carbon

Carbon состоит из нескольких мелких демонов, каждый из которых решает собственный кусок большой задачи. Чтобы Карбон мог просто получать данные и просто передавать из дальше, хватит одного: carbon-cache.

Сначала его нужно включить. Это легко устроить, заменив false на true в   /etc/default/graphite-carbon:

Затем демона нужно запустить (слышал бы меня сейчас кто-нибудь из впечатлительных родственников):

Карбон должен восстать.

Устанавливаем и настраиваем веб-сервер

В Graphite-app нет собственного веб-сервера, так что придётся кого-нибудь установить. Apache с WSGI модулем вполне подойдёт (без WSGI Django-приложение запустить будет проблематично):

По-умолчанию Apache устанавливается с лучшим из приложений — «It works!», которое мы, как трезвые и прагматичные люди, должны заменить на что-нибудь более практичное. Например, Graphite. К счастью, сделать это достаточно легко:

Смотрим данные

Если боги программирования не скривились от частого упоминания слова «демон» и не забанили 127.0.0.1, то на нём будет висеть такой замечательный сайтик:

graphite-default

С левой стороны будет дерево со сгруппированными источниками данных. Графит собирает метрики и с самого себя, так что даже после чистой установки там уже будет что-то. Ну или не сразу, а через пару минут. Если кликнуть на пару-тройку элементов дерева, то получится вот такая абстрактная красота:

graphite-web

Кроме индивидуальных графиков есть еще страница дашбордов, на которую можно накидать полезностей, сохранить, и вывести на отдельный монитор или проектор:

graphite-dashboard

Что вообще круто, у Графита есть Render URL API. Это значит, что можно собрать специальный URL с именем источника данных, цветами, датами, и получить PNG, PDF или SVG график в ответ. Можно и что-нибудь более текстовое запросить, например JSON или CSV. Усредненный URL будет похож на что-нибудь вроде  http://127.0.0.1/render?target=collectd.*.cpu-*.cpu-system .

Наконец, в Graphite-web есть концепция событий.  Если ваши релизы выходят одновременно с новыми багами и утечками памяти, то релиз — это событие, которое можно зарегистрировать (даже программно) в Графите, и увидеть в виде вертикальной черты на том же графике состояния памяти. Под событие, в общем-то, подходит всё, что душе угодно. Была бы дата. Коммиты, исключения, рассылки писем «у нас завтра распродажа» — всё сойдёт.

Скармливаем данные

Graphite не занимается сбором метрик самостоятельно. Принять и сохранить — это да, легко. Но собирать должны другие.

«Других», впрочем, пруд пруди.

Источники данных

Во-первых, наш старый друг и товарищ, collectd, может писать собранные данные прямиком в Графит через write_graphite плагин. Есть и другие агенты, например,  Carbonator Windows Service или ssc serv.

Во-вторых, Carbon может подключиться к AMQP-совместимой очереди сообщений, вроде RabbitMQ или ActiveMQ, и получать данные оттуда.

Наконец, данные в Графит можно отправить напрямую через космос командную строку, например, через netcat:

Пре/пост обработка данных

Пытливый ум может задаться вопросом: «а с какого Рузвельта им пришлось создавать отдельный Carbon-сервис, если с задачей взять-и-сохранить данные справилась бы и сама база?». Оказывается, Карбон умеет больше, чем просто носить данные из угла в угол.

Carbon может перенаправлять отдельные куски данных другим получателям, таким образом распределяя нагрузку или даже создавая копии самого себя про запас.

К тому же он может и обработать входящие данные прежде, чем положить их в базу. Например, 4х ядерный процессор моего Dell порождает аж 8 потоков метрик (Hyper-Threading, туды его в качель). А мне, может, хватило бы и одного усреднённого показателя загрузки. Карбон может устроить.

Я мог бы продолжить про возможность переписывать имена метрик на лету, или хранить списки разрешённых/запрещенных потоков данных, но смысл моего послания, наверное, уже понятен — Carbon нужен людям.

Хранение данных

Все данные, что стекаются в Карбон, после фильтрации, агрегирования и переименований оседает в базе данных — Whisper. На самом деле, можно выбрать другую базу, например Ceres, InfluxDB, или что-нибудь более живучее, построенное поверх Cassandra или HBase, но Whisper идёт в комплекте.

Whisper очень, очень, очень похож на RRDtool. Те же файлы-хранилища, тот же фиксированный размер, и даже концепция архивов похожа. Только медленнее всё. Поэтому, как и с Carbon, его можно спросить: «зачем ты существуешь?».

Ну, Whisper умеет сохранять данные через нерегулярные промежутки времени, с rrdtool — нет. На сегодняшний день это, кажется, единственная причина.

Как и rrdtool, Whisper умеет сохранять данные по архивам с разными временными рамками и разной точностью. В rrdtool определение архива включало и какой промежуток времени он покрывает, и как именно агрегировать в нём данные (например,  RRA:AVERAGE:0.5:10:60 ). А в Whisper время и агрегация — разные вещи: первое идёт в storage-schemas.conf файл, а второе — в storage-aggregation.conf.

storage-schemas.conf обладает прекрасным в своей простоте синтаксисом. Вот пример всего одной из его потенциально многочисленных секций:

storage-aggregation.conf тоже вполне ничего:

xFilesFactor = 0.5 , кстати означает ровно то же самое, что и параметр  xff в rrdtool. Если помните, в циклическом архиве тоже мелькала странная дробная цифра ( RRA:AVERAGE:0.5...), которая переводилась как «если больше половины суммируемых значений в выборке не определены — результат тоже не определен». Это и есть xFilesFactor.

Мораль

Graphite — это программа, которая принимает, хранит и рисует временные ряды данных. Ровно как и rrdtool. Но на самом деле эти приложения сильно отличаются. Они пытаются решить общую задачу, но подходят к ней с разных сторон и с разным масштабом.

Чем особенно приятен Graphite, так это тем, что практически все компоненты в нём можно заменить на альтернативные. Не нравится graphite-web? Понимаю и не осуждаю. Вот, можно попробовать вместо него Grafana. Whisper не достаточно хорошо масштабируется? Не проблема, вот InfluxDB или кто-нибудь ещё. Это прекрасное качество для софта. Он работает хорошо прямо из коробки, но при этом его легко сделать ещё лучше своими руками.  И Render URL API, это просто нечто!

2 комментария для “Краткое введение в Graphite

  1. Пашк? Я так понимаю, что во фразе «Изнутри Карбон состоит из трёх относительно независимых компонентов:» что-то не так. 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *