Устанавливаем связку из Prometheus и Grafana
21 января 2019
Если вы давно читаете этот блог, то можете помнить некоторые старые посты, посвященные мониторингу. В частности, была рассмотрена связка из Graphite, StatsD и CollectD, а также, несколько поверхностно, сервис Datadog. Однако мир не стоит на месте. Приходят новые технологии, некоторые из которых даже оказываются лучше своих предшественников. В качестве таких новых технологий можно привести в пример связку из Prometheus и Grafana.
Немного матчасти
Для начала давайте бегло познакомимся со всеми действующими лицами.
Prometheus является открытой (Apache 2.0) time series СУБД, написанной на языке Go и изначально разработанной в компании SoundCloud. Другими словами, эта штука хранит ваши метрики. Интересной особенностью Prometheus является то, что он сам тянет метрики с заданного множества сервисов (делает pull). За счет этого у Prometheus не могут забиться какие-то там очереди или вроде того, а значит мониторинг никогда не станет узким местом системы. Также проект интересен тем, что он принципиально не предлагает какого-либо горизонтального масштабирования или high availability. Дескать, третье тысячелетие на дворе — в случае чего просто возьмите машину помощнее, не выпендривайтесь.
Node Exporter — сервис, задача которого заключается в экспорте информации о машине в формате, понятном Prometheus’у. Вообще, для Prometheus написано множество готовых exporter’ов практически под все существующие системы — всякие там веб-серверы, СУБД, очереди сообщений, и так далее. В рамках этой заметки мы будем использовать только Node Exporter, поскольку он в любом случае вам понадобится. Настройка других exporter’ов вряд ли будет сильно отличаться.
Grafana представляет собой открытый (Apache 2.0) веб-фронтенд к различным time series СУБД, таким, как Graphite, InfluxDB, и, само собой разумеется, Prometheus. В общем, Grafana рисует для вас красивые графики, используя информацию из Prometheus. Характерно, что у Prometheus есть и собственный веб-интерфейс. Однако он предельно минималистичен и довольно неудобен. Поэтому даже сами разработчики Prometheus рекомендуют использовать Grafana.
Думаю, теперь мы готовы перейти и к практике. Все описанные далее шаги были произведены на Ubuntu Linux 18.04 LTS. Если вы используете какое-то другое окружение, отличия вряд ли будут большими.
Важно! Настройки, связанные с безопасностью, в рамках этого поста не рассматриваются. За информацией о том, как настроить фаервол, поднять Nginx для какой-нибудь аутентификации, а также прикрутить TLS, обращайтесь к соответствующим более ранним заметкам. Обращаю ваше внимание на то, что по умолчанию Prometheus слушает все сетевые интерфейсы без какой-либо аутентификации и шифрования. Grafana имеет кое-какую аутентификацию, но также слушает все интерфейсы и не имеет шифрования.
Устанавливаем Node Exporter
Начнем с Node Exporter, чтобы сразу добавить его в Prometheus, как только до него дойдет очередь. В общем, чтобы не прыгать от настройки одного компонента к настройке другого. Готовые пакеты для Ubuntu есть, но они несколько отстают от апстрима. Поэтому ставить будем руками. Благо, это Go — вся программа представляет собой один бинарник.
Говорим:
# Последнюю версию пакета ищем здесь:
# https://github.com/prometheus/node_exporter/releases
wget https://github.com/.../node_exporter-0.17.0.linux-amd64.tar.gz
tar -xvzf node_exporter-0.17.0.linux-amd64.tar.gz
sudo cp node_exporter-0.17.0.linux-amd64/node_exporter /usr/local/bin/
Создаем /etc/systemd/system/node_exporter.service:
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=default.target
Запускаем демона:
sudo systemctl start node_exporter
sudo systemctl status node_exporter
sudo systemctl enable node_exporter
Проверяем, что метрики отдаются:
Готово! Только попробуйте сказать, что это было сложно :)
Запускаем Prometheus
Выполняем следующие команды:
# Свежий пакет находим здесь:
# https://github.com/prometheus/prometheus/releases
wget https://github.com/.../prometheus-2.6.0.linux-amd64.tar.gz
tar -xvzf prometheus-2.6.0.linux-amd64.tar.gz
sudo cp prometheus-2.6.0.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.6.0.linux-amd64/promtool /usr/local/bin/
sudo mkdir /etc/prometheus
sudo cp -r prometheus-2.6.0.linux-amd64/consoles/ \
/etc/prometheus/consoles
sudo cp -r prometheus-2.6.0.linux-amd64/console_libraries/ \
/etc/prometheus/console_libraries
sudo cp prometheus-2.6.0.linux-amd64/prometheus.yml \
/etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus
sudo mkdir /var/lib/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus
Правим /etc/prometheus/prometheus.yml, указывая, где искать Node Exporter:
# Важно! В YAML запрещено использовать табуляцию.
# Все отступы - это два пробела.
scrape_configs:
- job_name: 'prometheus'
# ... тут все оставляем как было ...
- job_name: 'node_localhost'
static_configs:
- targets: ['localhost:9100']
Создаем /etc/systemd/system/prometheus.service:
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
[Install]
WantedBy=default.target
Запускаем Prometheus:
sudo systemctl start prometheus
sudo systemctl status prometheus
sudo systemctl enable prometheus
Проверяем, что Prometheus отдает свои собственные метрики:
Простенький веб-интерфейс, который я упоминал выше, живет на том же порту.
Поднимаем Grafana
Grafana будем ставить из deb-пакета:
# https://grafana.com/grafana/download
wget https://dl.grafana.com/oss/release/grafana_5.4.2_amd64.deb
sudo apt install ./grafana_5.4.2_amd64.deb
sudo systemctl start grafana-server
sudo systemctl status grafana-server
sudo systemctl enable grafana-server
Далее идем на порт 3000 с логином и паролем admin
. Grafana сразу предложит сменить пароль. Дальше проходим незамысловатые диалоги, и добавляем Prometheus в качестве источника данных.
Настройка дашбордов с нуля может быть довольно трудоемким делом. К счастью, у Grafana есть каталог готовых дашбордов практически на все случаи жизни. Мне, например, понравился вот такой готовый дашборд для Node Exporter. Для его установки идем в диалог Import Dashboard. Только диалог довольно хитро спрятан в интерфейсе. У меня он открывается по следующей ссылке:
Далее копируем JSON с сайта и получаем красивую картинку вроде такой:
Интерфейс у Grafana поначалу кажется немного странным. По-видимому, это связано с тем, что в интерфейсе максимум места отведено под графики. Таким образом, большинство элементов управления представляют собой небольшие иконки, в которых первое время трудно ориентироваться. Но к интерфейсу быстро привыкаешь. Оглянуться не успеете, как вы начнете мастерски заполнять дашборды десятками кастомных графиков!
Заключение
Конечно же, данное кратенькое введение не претендует на полноту. Например, Prometheus позволяет настраивать еще и алерты, умеет интегрироваться с Kubernetes, через так называемые адаптеры данные из Prometheus можно складывать в аналитические базы данных (ClickHouse, ну или в PostgreSQL хотя бы), есть собственный язык запросов PromQL, в котором даже есть джоины, а метрики можно не только pull’ить, но и отправлять push’ем через Push Gateways.
Также нелишним будет знать некоторые особенности устройства Prometheus. В частности, по умолчанию все данные хранятся в течение 15 дней, метрики собираются раз в 15 секунд, а одна метрика в среднем занимает два байта на сэмпл. Обладая этой информацией, и зная количество метрик, можно прикинуть, сколько дискового пространства вам понадобится для их хранения. Следует также принять во внимание, что сторадж Prometheus не позиционируется, как супер надежный. Если вдруг у вас очень ценные метрики, рекомендуется сохранять их куда-то еще через адаптеры.
За дополнительной информацией рекомендуется обращаться к официальной документации. Подробности устройства стораджа описаны здесь. Если же вам очень нужна система, чтобы как Prometheus, только распределенная, обратите внимание на проект Thanos.
Дополнение: Вас также могут заинтересовать статьи Пишем метрики в Prometheus на языке Go и Агрегация логов в распределенных системах с Go и Loki.
Метки: Linux, Оптимизация, СУБД.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.