Устанавливаем Prometheus с помощью Docker на Ubuntu 14.04

Prometheus – это система мониторинга и база данных временных рядов с открытым исходным кодом. Prometheus может все. Представляет собой организованный набор инструментов, который предлагает метрики для хранения, агрегации, визуализации и оповещения. За каждую задачу отвечает отдельная часть Prometheus, которые могут запускаться как по отдельности так и вместе.

Docker же позволяет вам “упаковать”  приложение со всем его окружением и зависимостями в контейнер, чтобы им было проще управлять и изолировать, а также можно было перенести на любую другую Linux-систему.  Если вы хотите узнать больше, то в помощь вам статья Экосистема Docker: введение в общие компоненты.

В этом мануале я расскажу вам, как установить три ключевых компонента для использования Prometheus на Docker. Это:

Сервер, который считывает метрики и сохраняет их в темпоральной (time series) базе данных

Node_exporter, который собирает данные о состоянии сервера

Grafana – это наш визуализатор наших будущих метрик

В экосистеме Prometheus есть еще много чего, но нам пока хватит и этих 3 компонентов.

Что нужно?

Чтобы у вас все получилось, вам понадобятся:

Мини-хостинг(сервер) с Ubuntu 14.04

Пользователь с sudo доступом (подробнее об этом вы найдете здесь)

Установленный Docker. Как установить и использовать Docker Compose в Ubuntu 14.04

Шаг 1 – Установка Prometheus

В этом разделе я объясню как установить основной сервер Prometheus с помощью Docker.  Прежде чем продолжать, убедитесь, что вы установили Docker (статью смотри выше, если пропустили).  Сервер Prometheus является центральным элементом экосистемы Prometheus, и именно он отвечает за сбор и хранение метрик, а также  за обработку запросов и генерацию предупреждений.

Образы контейнеров Docker  для всех компонентов Prometheus размещаются в  организации prom в Docker Hub. Если вы запустите образ prom/prometheus без каких-либо дополнительных параметров, то у вас запустится сервер Prometheus  с настройками по умолчанию и находятся они по адресу  /etc/prometheus/prometheus.yml. Он также будет использовать Docker-хранилище, которое установлено внутри каталога /prometheus и нужно оно для хранения собранных метрик. Такое хранилище Docker создает при первом запуске контейнера. Данные внутри него сохраняются только между перезагрузками одного и того же контейнера.

Нам нужно изменить файл конфигурации, и существует 2 способа это сделать.  Первый способ –  наш конфигурационный файл может быть передан в контейнер из файловой системы хост-компьютера просто как том данных Docker. Второй – вы можете создать производный контейнер со своим собственным файлом конфигурации. Здесь мы выберем первый способ.

Также существует несколько способов хранения метрик. В нашем случае нам достаточно Docker-хранилища данных по умолчанию. В качестве альтернативы вы можете создать контейнер объема данных, если вам это конечно необходимо.

Для начала,  создайте минимальный конфигурационный файл Prometheus  ~ / prometheus.yml:

$ nano ~/prometheus.yml

Добавьте в файл следующее содержимое (замените your_server_ip на свой IP-адрес Droplet):

~/prometheus.yml

# A scrape configuration scraping a Node Exporter and the Prometheus server
# itself.
scrape_configs:
# Scrape Prometheus itself every 5 seconds.
– job_name: ‘prometheus’
scrape_interval: 5s
target_groups:
– targets: [‘localhost:9090’]
# Scrape the Node Exporter every 5 seconds.
– job_name: ‘node’
scrape_interval: 5s
target_groups:
– targets: [‘your_server_ip:9100′]

Этот пример конфигурации собирает метрики  о самом себе(о Prometheus), а также о Node Exporter, который мы установим позже.  Если Prometheus и может подключаться к самому себе в своем контейнере с помощью localhost, то с Node Exporter такого не прокатит. Здесь уже нужно будет использовать внешний IP-адрес вашего сервера,  так как Node Exporter будет запускаться в отдельном контейнере с отдельным пространством имен сети.

Запускайте  Docker контейнер Prometheus с внешним файлом конфигурации:

docker run -d -p 9090:9090 -v ~/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus -config.file=/etc/prometheus/prometheus.yml -storage.local.path=/prometheus -storage.local.memory-chunks=10000

При первом запуске этой команды он вытащит образ Docker из Docker Hub.

Эта команда довольно длинная и содержит много параметров командной строки. Давайте я вам объясню все поподробней:

Опция -d запускает контейнер Prometheus в отключенном режиме, это означает, что контейнер будет запущен в фоновом режиме и не будет завершен нажатием CTRL + C.

Опция –p 9090: 9090 предоставляет доступ к веб-порту Prometheus (9090) и делает его доступным через внешний IP-адрес хост-системы.

Опция -v […] монтирует конфигурационный файл prometheus.yml из файловой системы хоста в папку в контейнера, где ее с нетерпением ) ждет Prometheus  (/etc/prometheus/prometheus.yml).

Параметр -config.file ставится в соответствии с расположением конфигурационного файла Prometheus внутри контейнера.

Наконец, опция -storage.local.memory-chunks изменяет использование памяти Prometheus на очень маленькую оперативную память хост-системы (всего 512 Мбайт) и небольшое количество хранимых временных рядов(чуть меньше 1000). Он говорит Prometheus хранить только 10000 фрагментов в памяти (примерно 10 кусков на серию) вместо значения по умолчанию – 1048576.  Больше информации об этом.

Вы можете вывести все работающие контейнеры Docker, используя следующую команду:

$ docker ps

Если все манипуляции с Prometheus вы сделали правильно, то к этому моменту вы увидете что-то такое:

Output of `docker ps`
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a89ac39911e prom/prometheus “/bin/prometheus -con” 2 hours ago Up 2 hours 0.0.0.0:9090->9090/tcp stoic_pike

Используя  идентификатор контейнера, показанный на выходе docker ps, вы можете просмотреть журналы запущенного сервера Prometheus с помощью следующей команды:

$ docker logs container_id

В моем примере команда будет выглядеть так:

$ docker logs 6a89ac39911e

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

$ docker inspect container_id

В результате будет выведена информация о конфигурации вашего контейнера, включая пути любых смонтированных томов Docker.

Найдите раздел, который выглядит примерно так:

Output of `docker inspect`

“Mounts”: [
{
“Source”: “/home/sammy/prometheus.yml”,
“Destination”: “/etc/prometheus/prometheus.yml”,
“Mode”: “”,
“RW”: true
},
{
“Name”: “821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c”,
“Source”: “/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data”,
“Destination”: “/prometheus”,
“Driver”: “local”,
“Mode”: “”,
“RW”: true
}
],

В этом примере метрики хранятся в /var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data в главной системе.  Этот каталог был автоматически создан Docker при первом запуске контейнера Prometheus. Он отображается в каталоге /prometheus в контейнере. Данные в этом каталоге сохраняются между перезапусками одного и того же контейнера. Если вам нужно  смонтировать существующий каталог для хранения данных метрик., то читайте «Как работать с томами данных Docker» .

Теперь вы можете обратиться к серверу Prometheus по адресу http: // your_server_ip: 9090/. Убедитесь, что он собирает метрики о себе, идите на  http: // your_server_ip: 9090/status и определите конечную точку http: // localhost: 9090/metrics в разделе Targets. Столбец состояния для этой цели должен показывать состояние цели как HEALTHY. А конечная точка http: // localhost: 9100 / metrics (Node Exporter) должна по-прежнему отображаться как UNHEALTHY, так как узел-экспортер (Node Exporter) еще не запущен:

The Node Exporter target should be shown as UNHEALTHY

 

Итак, теперь у вас Prometheus работает как контейнер Docker, используя при этом конфигурационный файл ~ / prometheus.yml, который находится в файловой хост-системе. А все метрики хранятся в контейнере в каталоге /prometheus. 

Шаг 2 –   Настройка Node Exporter

В этом разделе мы установим Prometheus Node Exporter. Node Exporter – это сервер, предоставляющий Prometheus  метрики о хост-машине (узле), на которой он запущен. Сюда входят показатели о файловых системах машины, сетевых устройствах, использовании процессора, использовании памяти и т. д.

Конечно запуск Node Exporter на Docker довольно проблематичен, поскольку его цель – выявить метрики о хосте, на котором он запущен. Если мы запустим его на Docker без дополнительных параметров, то он будет собирать метрики только о среде контейнера Docker, а нам они совсем не нужны. Нам нужны метрики среды нашей хост-системы. Именно поэтому нужно запускать Node Exporter непосредственно на хост-системе за пределами Docker.

Запускаем Node Exporter  на порту 9100 используя Docker:

$ docker run -d -p 9100:9100 -v “/proc:/host/proc” -v “/sys:/host/sys” -v “/:/rootfs” –net=”host” prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/proc -collector.filesystem.ignored-mount-points “^/(sys|proc|dev|host|etc)($|/)”

Следующие флаги Docker и Node Exporter используются, чтобы обеспечить разумную аппроксимацию для метрик узла:

В Linux, Node Exporter собирает большинство своих показателей из /proc и /sys.  Эти файловые системы монтируются с хоста в контейнер в качестве каталога /host, при помощи флага -v.

С помощью флагов -collector.procfs и –collector.sysfs мы говорит Node Exporter, чтобы он искал файловые системы /proc и /sys в нестандартном расположении.

Чтобы сообщить о метриках файловой системы хоста, мы также монтируем всю корневую (/) файловую систему в контейнер (в / rootfs), при помощи флага -v.

Используйте флаг -collector.filesystem.ignored-mount-points для узла Node Exporter, чтобы игнорировать любые другие файловые системы в контейнере, которые не принадлежат хост-системе.

Используя флаг –net = host , мы помещаем контейнер в тот же сетевой стек, что и хост, поэтому чтение из таких файлов, как /proc/net/dev, даст те же результаты, что и на хосте.

Сервер Prometheus должен теперь автоматически начать сбор метрик узла Node Exporter. Идите на страницу состояния вашего сервера Prometheus по адресу http: // your_server_ip: 9090/status и убедитесь, что  http: // your_server_ip: 9100/metrics показывает состояние HEALTHY:

The Node Exporter target should be shown as HEALTHY

Шаг 3 – Настройка Grafana

Дело за графикой. И в этом нам поможет Grafana. Это очень хороший  и удобный дашборд для отображения метрик. Grafana хранит метаданные панели мониторинга (например, какие панели мониторинга существуют и какие диаграммы должны отображаться) в настраиваемой базе данных на основе SQL.  Grafana поддерживает использование локальной базы данных SQLite3 с файловой поддержкой, а также внешних серверов баз данных, таких как MySQL или PostgreSQL. В этом руководстве мы будем использовать базу данных SQLite3, поддерживаемую томом данных Docker. Для большей информации – «Как и когда использовать Sqlite» .

Запустите Grafana как контейнер Docker с паролем администратора (admin_password):

docker run -d -p 3000:3000 -e “GF_SECURITY_ADMIN_PASSWORD=admin_password” -v ~/grafana_db:/var/lib/grafana grafana/grafana

Эта команда  загрузит образ  Grafana Docker из Docker Hub, создаст новый том Docker и поместит его в ~/grafana_db на хост-системе и в /var/lib/grafana в файловой системе контейнера.  В контейнере Grafana автоматически создаст и инициализирует свою базу данных SQLite3, а располагаться она будет по адресу /var/lib/grafana/grafana.db.

Флаг -e позволяет передавать переменные среды процессу, запущенному внутри контейнера Docker. Здесь мы используем этот флаг, чтобы установить новую переменную окружения GF_SECURITY_ADMIN_PASSWORD,  переопределив тем самым пароль администратора по умолчанию.

Чтобы убедиться, что Grafana работает правильно, перейдите по адресу http: // your_server_ip: 3000 /. Имя пользователя администратора – admin, а пароль – тот, который вы выбрали при запуске контейнера Docker чуть выше.

Log in to Grafana with your chosen password

После входа в систему вы должны увидеть главную страницу:

Grafana main view

Как работать с Grafana я уже показывать не буду, но если есть желание, то читайте документацию. Ну а эта Документация Prometheus Grafana покажет вам, как использовать Grafana уже в сочетании с Prometheus.