Что такое Graphite
Graphite — это приложение, которое здорово делает три вещи:
- принимает данные мониторинга от сторонних агентов,
- сохраняет их в базу, и
- показывает эти данные в виде графиков и дашбордов через веб-приложение
Изнутри Graphite состоит из трёх относительно независимых компонентов:
- Carbon — сервис, который принимает данные от других;
- Whisper — циклическая база данных;
- Graphite-web — веб-интерфейс с графиками, свистелками и прочими полезностями.
Установка
Есть много способов, как заполучить Graphite себе на хост. Но самый простой, как это обычно бывает, — через пакетный менеджер: apt-get install graphite-web graphite-carbon.
Только просто установкой отделаться не получиться. Чтобы Graphite запустился, нужно еще поколдовать над конфигурацией:
- Создать базу данных для Graphite-web
- Настроить Carbon
- Установить и настроить веб-сервер.
Создаём базу данных для Graphite-web
Так как Graphite-web — полноценное веб-приложение с аутентификацией, пользователями и прочими сохраняемыми бесполезностями, ему нужна собственная база данных. Подойдёт MySQL, PostgreSQL, или SQLite. SQLite включён по умолчанию, так что можно избавить себя от ковыряния в конфигурационных файлах и остановиться на нём.
У Графита есть syncdb команда, которая создаст базу, но скорее одной командой не обойдёшься. Ведь создадим-то мы базу под своим аккаунтом, а работать с ней будет веб-сервер через свой собственный, и наверняка с правами только на чтение. Можно поступить рабоче-крестьянски и просто дать права на запись всем подряд. В итоге мы имеем такую команду, которая всё сделает:
1 2 |
graphite-manage syncdb chmod a+w /var/lib/graphite/graphite.db |
Настраиваем Carbon
Carbon состоит из нескольких мелких демонов, каждый из которых решает собственный кусок большой задачи. Чтобы Карбон мог просто получать данные и просто передавать из дальше, хватит одного: carbon-cache.
Сначала его нужно включить. Это легко устроить, заменив false на true в /etc/default/graphite-carbon:
1 |
CARBON_CACHE_ENABLED=true |
Затем демона нужно запустить (слышал бы меня сейчас кто-нибудь из впечатлительных родственников):
1 |
service carbon-cache start |
Карбон должен восстать.
Устанавливаем и настраиваем веб-сервер
В Graphite-app нет собственного веб-сервера, так что придётся кого-нибудь установить. Apache с WSGI модулем вполне подойдёт (без WSGI Django-приложение запустить будет проблематично):
1 |
apt-get install apache2 libapache2-mod-wsgi |
По-умолчанию Apache устанавливается с лучшим из приложений — «It works!», которое мы, как трезвые и прагматичные люди, должны заменить на что-нибудь более практичное. Например, Graphite. К счастью, сделать это достаточно легко:
1 2 3 4 |
a2dissite 000-default ln -s /usr/share/graphite-web/apache2-graphite.conf /etc/apache2/sites-available a2ensite apache2-graphite service apache2 restart |
Смотрим данные
Если боги программирования не скривились от частого упоминания слова «демон» и не забанили 127.0.0.1, то на нём будет висеть такой замечательный сайтик:
С левой стороны будет дерево со сгруппированными источниками данных. Графит собирает метрики и с самого себя, так что даже после чистой установки там уже будет что-то. Ну или не сразу, а через пару минут. Если кликнуть на пару-тройку элементов дерева, то получится вот такая абстрактная красота:
Кроме индивидуальных графиков есть еще страница дашбордов, на которую можно накидать полезностей, сохранить, и вывести на отдельный монитор или проектор:
Что вообще круто, у Графита есть 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:
1 |
echo "hostname.cpu.cpu-total 100 `date +%s`" | nc -q0 127.0.0.1 2003 |
Пре/пост обработка данных
Пытливый ум может задаться вопросом: «а с какого Рузвельта им пришлось создавать отдельный 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 обладает прекрасным в своей простоте синтаксисом. Вот пример всего одной из его потенциально многочисленных секций:
1 2 3 |
[cpu_readings] pattern = ^collectd\.hostname\.cpu-*\.*$ retentions = 10s:2d,1m:31d,1h:5y |
storage-aggregation.conf тоже вполне ничего:
1 2 3 4 |
[cpu_sum] pattern = collectd\.hostname\.cpu-*\.*$ xFilesFactor = 0.5 aggregationMethod = sum |
xFilesFactor = 0.5 , кстати означает ровно то же самое, что и параметр xff в rrdtool. Если помните, в циклическом архиве тоже мелькала странная дробная цифра ( RRA:AVERAGE:0.5...), которая переводилась как «если больше половины суммируемых значений в выборке не определены — результат тоже не определен». Это и есть xFilesFactor.
Мораль
Graphite — это программа, которая принимает, хранит и рисует временные ряды данных. Ровно как и rrdtool. Но на самом деле эти приложения сильно отличаются. Они пытаются решить общую задачу, но подходят к ней с разных сторон и с разным масштабом.
Чем особенно приятен Graphite, так это тем, что практически все компоненты в нём можно заменить на альтернативные. Не нравится graphite-web? Понимаю и не осуждаю. Вот, можно попробовать вместо него Grafana. Whisper не достаточно хорошо масштабируется? Не проблема, вот InfluxDB или кто-нибудь ещё. Это прекрасное качество для софта. Он работает хорошо прямо из коробки, но при этом его легко сделать ещё лучше своими руками. И Render URL API, это просто нечто!
Пашк? Я так понимаю, что во фразе «Изнутри Карбон состоит из трёх относительно независимых компонентов:» что-то не так. 🙂
С точки зрения химии эта фраза вообще абсурд. Но да, есть косяк. Спасибо.