Prometheus — это набор инструментов с открытым исходным кодом, написанный на языке программирования Golang и представляющий собой полноценную систему мониторинга и оповещения.
Изначально продукт был создан SoundCloud, однако сейчас поддерживается сообществом разработчиков независимо от какой-либо компании.
Prometheus состоит из следующих компонентов:
Главный сервер
Библиотеки для управления кодом приложения
Система выполнения заданий
Менеджер оповещений
Экспортер данных для внешних вспомогательных инструментов (HAProxy, StatsD, Graphite)
Все эти компоненты нужны для выполнения трех основных операций, на которых основывается Prometheus:
Сбор. Опрашивать внешние службы, собирая данные для будущих метрик
Обработка. Выполнять правила, на основе которых обрабатываются полученные данные
Вывод. Сохранять полученные результаты в базу данных для последующей визуализации в виде метрик
В этом руководстве мы разберемся, как установить Prometheus, сконфигурировать правила обработки данных и подключить инструмент визуализации.
Для развертывания системы мониторинга можно воспользоваться выделенным или облачным сервером Timeweb Cloud, с которого Prometheus будет опрашивать работающее приложение, получая и обрабатывая данные о его состоянии.
Впоследствии эти данные можно будет удаленно анализировать через панель управления в виде визуальных метрик.
Конкретно в этом примере будет использоваться дистрибутив Ubuntu 22.04, запущенный в облачном сервере с 2 ядрами процессора и 4 гигабайтами оперативной памяти.
Так как Prometheus написан на Golang, он распространяется в виде одного исполняемого файла, который можно скачать либо со страницы загрузок на официальном сайте, либо со страницы релизов репозитория GitHub.
Вне зависимости от выбранного источника вы увидите список tar.gz
-архивов с разными названиями.
В каждом отдельном архиве лежит сборка (с указанием версии Prometheus) под конкретную операционную систему и архитектуру процессора. То есть схема обозначения следующая:
prometheus-ВЕРСИЯ.СИСТЕМА-АРХИТЕКТУРА.tar.gz
По названию СИСТЕМЫ понятно, для какой операционной системы предназначен архив. При этом darwin — это ядро macOS.
Обратите внимание, что на странице релизов в GitHub есть дополнительная кнопка «Show all 38 assets». С помощью нее вы сможете увидеть полный список сборок под все возможные операционные системы и архитектуры процессоров.
В отличие от GitHub, на официальном сайте есть удобный фильтр для поиска необходимой конфигурации.
Выбираем нужную сборку и скачиваем ее. Для загрузки можно воспользоваться стандартной утилитой wget
, указав ссылку на нужный архив:
sudo wget https://github.com/prometheus/prometheus/releases/download/v2.45.3/prometheus-2.45.3.linux-amd64.tar.gz
Обратите внимание, что в этом примере использовался сборка Prometheus версии «2.49.1 / 2024-01-15».
Скачанный архив нужно извлечь. Это можно сделать с помощью стандартной утилиты tar
:
sudo tar -xzf prometheus*.tar.gz
Архив, из которого выполнялась распаковка, теперь можно удалить:
sudo rm prometheus*.tar.gz
Благодаря звездочке *
можно указать на архив без ввода его полного имени.
По итогу мы получим новую директорию prometheus
, внутри которой будет лежать 2 исполняемых файла, 2 папки с файлами конфигурации и 1 главный конфигурационный файл:
prometheus
(исполняемый файл)
promtool
(исполняемый файл)
consoles
(папка)
console_libraries
(папка)
prometheus.yml
(файл)
Перейдем в распакованную директорию:
cd prometheus*/
Благодаря приписке */
можно указать на распакованный архив без ввода полного имени каталога.
Для доступа к Prometheus рекомендуется создать отдельную пользовательскую группу, после чего добавить в нее нового системного пользователя с ограниченными правами доступа — это снизит риск несанкционированного доступа.
Создаем группу prometheus
:
sudo groupadd --system prometheus
Добавляем в нее пользователя с аналогичным именем — prometheus
:
sudo useradd -s /sbin/nologin --system -g prometheus prometheus
В дальнейшем для этого пользователя мы назначим соответствующие права доступа к директориям Prometheus.
Прежде всего нужно переместить исполняемые файлы в системную директорию, специально предназначенную для них:
sudo mv prometheus /usr/local/bin
sudo mv promtool /usr/local/bin
Теперь установим специальные привилегии для ранее созданного пользователя:
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
Далее нужно будет переместить папки с конфигурационными файлами в отдельные конфигурационные директории для Prometheus. Поэтому мы сперва создадим их:
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
А далее переместим сами папки:
sudo mv consoles /etc/prometheus
sudo mv console_libraries /etc/prometheus
Каталог /var/lib/prometheus
пригодится позже.
Точно так же скопируем основной конфигурационный файл:
sudo mv prometheus.yml /etc/prometheus
И не забудем про права доступа:
sudo chown prometheus:prometheus /etc/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus/consoles
sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries
sudo chown -R prometheus:prometheus /var/lib/prometheus
Основным файлом конфигурации в Prometheus является prometheus.yml
— в нем прописываются настройки объектов мониторинга, периодичность сбора данных, условия для системы уведомлений, а также методы обработки и хранения информации.
Конфигурационный файл предназначен для настройки двух базовых функций Prometheus:
HTTP-запрос к указанным целям (target) мониторинга, результатом которого являются свежие данные от внешних систем
Обработка собранных данных на основании некоторых заранее описанных правил (rules), после которой либо отправляются предупреждения (если что-то не так), либо новые данные попадают в конечные метрики (если все впорядке)
Соответственно, конфигурация Prometheus базируется на двух типах файлов:
Файл конфигурации
Файлы правил
Давайте напишем самый простой конфигурационный файл prometheus.yml
, который будет иметь только одну объявленную цель для сбора данных — непосредственно сервер Prometheus.
Сперва откроем файл:
sudo nano /etc/prometheus/prometheus.yml
Далее удалим его стандартное содержимое и добавим новый текст:
global:
scrape_interval: 15s # интервал сбора и очистки данных с целей
evaluation_interval: 15s # интервал вычисления правил сбора
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: prometheus # имя задания, которое будет собирать данные
static_configs: # целевые адреса целей в рамках указанного задания
- targets: ['localhost:9090']
Заранее проверить корректность конфигурационного файла можно с помощью утилиты promtool
:
promtool check config /etc/prometheus/prometheus.yml
Самое главное — соблюдать количество отступов (табуляции) и понимать отношения (иерархию) ПОДпараметров и НАДпараметров.
В файле конфигурации есть 3 основных блока:
global
. Устанавливает глобальные настройки для сервера Prometheus. Опция scrape_interval
указывает на частоту сбора данных с указанных целей, а evaluation_interval
— на частоту обработки собранных данных на основе прописанных правил.
rule_files
. Содержит список файлов, в которых прописаны правила оценки данных.
scrape_configs
. Описывает ресурсы, которые должен отслеживать Prometheus. Этот блок делиться на задания (jobs
), в рамках которых указывается список целей для сбора данных — IP адреса и порты.
Важно то, что Prometheus может предоставлять HTTP-данные о самом себе как о полноценной цели.
Поэтому в описанной конфигурации в качестве примера указано только одно задание с именем prometheus
, которое собирает информацию о состоянии сервера Prometheus.
В настройках этого задания в качестве целевого адреса указан IP и порт Prometheus. Проще говоря, Prometheus будет опрашивать сам себя.
Чтобы Prometheus работал без перебоев, мы воспользуемся системной утилитой Systemd. Она будет управлять процессом Prometheus как фоновой службой, которая будет автоматически запускаться при старте системы и перезагружаться при аварийном завершении процесса.
Для этого мы создадим отдельный конфигурационный файл в специальной директории Systemd, который будет описывать настройки службы Prometheus:
sudo nano /etc/systemd/system/prometheus.service
Файл наполним следующим содержимым:
[Unit]
Description=Background service of Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
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=multi-user.target
Разберем несколько важных параметров из этого файла:
В параметре User
нужно ранее созданного пользователя prometheus
.
В параметре Group
указывается название основной группы пользователей, которым разрешен доступ. В нашем случае это prometheus
.
Важно указать значение WorkingDirectory
для корректной работы команды запуска процесса.
Опция ExecStart
содержит команду запуска приложения. В этом файле она содержит символы обратного слэша \
, которые нужны для корректной многострочной. С помощью флагов указываются пути до конфигурационного файла и ранее созданных директорий Prometheus.
После сохранения файла необходимо перезагрузить Systemd, чтобы применить внесенные изменения:
sudo systemctl daemon-reload
Далее мы укажем Systemd запускать службу Prometheus при каждом старте системы:
sudo systemctl enable prometheus
После чего запустим службу вручную:
sudo systemctl start prometheus
Убедиться, что служба корректно работает, можно, узнав ее статус:
sudo systemctl status prometheus
Если Prometheus работает корректно, то среди консольного вывода будет параметр о положительном статусе службы:
Active: active (running)
Основной веб-интерфейс программы открывается в браузере по адресу вашего сервера с указанием 9090 порта. То есть схема адреса Prometheus выглядит так:
http://IP-адрес-сервера:9090
Например, это может быть http://90.156.208.243:9090
.
Поэтому важно разрешить доступ по 9090 порту в вашем брандмауэре. Это делается так:
sudo ufw allow 9090/tcp
Стандартный интерфейс Prometheus крайне неинформативен и неудобен. Его стоит использовать только во время первичной конфигурации программы, чтобы убедиться в корректности работы программы.
Поэтому данные, собранные Prometheus, передаются внешним приложениям для аналитики и интерактивной визуализации показателей и графиков.
Grafana — одно из таких многоплатформенных веб-приложений с открытым исходным кодом, которое предоставляет гибко настраиваемые диаграммы и графики для визуального анализа данных.
Пример приложения Grafana (источник: официальный сайт)
У Timeweb Cloud есть отдельная инструкция о том, как установить и настроить Grafana. В этой статье мы кратко рассмотрим установку Grafana с использованием уже готовой доски для отображения метрик.
Обратите внимание, что для загрузки Grafana необходимо использовать зарубежный IP-адрес либо выполнять загрузку через «зеркало».
С российского IP-адреса загрузить Grafana не получится. Поэтому в этой инструкции мы будем использовать зеркало от компании Tencent.
Мы сперва загружаем необходимую версию Grafana:
wget https://mirrors.cloud.tencent.com/grafana/apt/pool/main/g/grafana-enterprise/grafana-enterprise_10.2.3_amd64.deb
Как видно, в этой инструкции используется версия 10.2.3 для архитектуры amd64.
Далее устанавливаем ряд зависимостей, которые нужны для работы Grafana:
apt install adduser libfontconfig1 musl -y
На данном этапе возможна ошибка со «сломанными пакетами». Поэтому на всякий случай нужно выполнить исправление:
sudo apt --fix-broken install
После этого устанавливаем ранее загруженный пакет Grafana через пакетный менеджер dpkg
:
dpkg -i grafana-enterprise_*_amd64.deb
Служба Grafana должна запуститься автоматически после завершения установки. Однако на всякий случай запустим ее вручную:
sudo systemctl start grafana-server
Также лучше добавить Grafana в список автозагрузки при старте системы:
sudo systemctl enable grafana-server
Состояние запущенной службы Grafana можно узнать так:
sudo systemctl status grafana-server
Если Grafana работает корректно, то среди консольного вывода будет параметр о положительном статусе службы:
Active: active (running)
Grafana работает на 3000 порту. Соответственно, схема адреса Grafana выглядит так:
http://IP-адрес-сервера:3000
Например, это может быть http://90.156.208.243:3000
.
Во время первичного входа в качестве логина и пароля вводится слово «admin». В дальнейшем данные для входа рекомендуется заменить.
После входа в панель управления нужно:
Открыть страницу Connections
Перейти во вкладку Data Sources
Нажать на кнопку добавления новых источников — Add Data Source.
Появится список возможных источников. Нас интересует Prometheus, поэтому выбираем его.
Оказавшись на странице настройки подключения Grafana к Prometheus, указываем адрес и порт сервера, а все остальное оставляем как есть. В нашем случае это localhost (либо адрес вашего сервера) и стандартный порт 9090.
Кликаем на Save and Test.
В Grafana можно использовать разнообразные доски для отображения метрик. На официальном сайте Grafana есть небольшое руководство, рассматривающее создание собственной доски.
Мы же воспользуемся готовой доской, которую можно найти на официальном сайте Prometheus. Она собирает стандартные данные из системы мониторинга.
Чтобы автоматически добавить эту доску через панель управления Grafana, нужно:
Открыть страницу Dashboards
Нажать на кнопку New
Из выпадающего списка выбрать New dashboard
Нажать на кнопку Import dashboard
Ввести идентификатор доски, который указан на странице официального сайта. Это 3662
Нажать на кнопку Load
Вас перекинет на страницу настроек доски. Даем ей имя и выбираем ранее созданный источник данных — Prometheus.
После заполнения информации жмем Import.
В некоторых случаях возможны проблемы с доступом к серверам Prometheus в момент добавления доски через ID. В этом случае следует воспользоваться JSON-файлом.
Для этого на веб-странице доски (на официальном сайте Prometheus) нужно нажать на кнопку Download JSON (вместо копирования ID), после чего начнется загрузка файла.
Содержимое файла необходимо вставить на странице добавления доски в отдельное поле для JSON и нажать кнопку Load. После этого аналогичным образом заполнить информацию о доске и выбрать источник данных.
Теперь, когда у вас есть готовая доска для отображения данных из Prometheus, вы можете настроить ее визуализацию через интерфейс панели управления Grafana.
Экспортеры — это программы-модули, которые собирают данные из внешних служб (MySQL, Nginx, Apache) и периодически отправляют их на основной сервер Prometheus.
Экспортеры написаны на языке программирования Golang. Самым основным экспортером является Node_exporter — он собирает самые общие данные о состоянии сервера Prometheus.
Давайте установим его через APT:
sudo apt install prometheus-node-exporter
Более свежие версии экспортера рекомендуется брать из официального репозитория Github.
Соответственно, если вы скачали экспортер с GitHub, его сперва нужно распаковать:
sudo tar -xvf node_exporter*amd64.tar.gz
А далее скопировать исполняемые файлы экспортера в каталог /usr/local/bin
:
cp node_exporter-*amd64/node_exporter /usr/local/bin
Обратите внимание, что ручное создание службы нужно только в том случае, если Node_exporter был загружен в виде архива с GitHub. Установка через APT автоматически создает конфигурацию для Systemd.
Экспортер должен быть запущен в виде отдельной службы точно также, как и сервер Prometheus.
Поэтому создадим для него конфигурацию в Systemd:
sudo systemctl edit --full --force node_exporter.service
Содержимое будет следующим:
[Unit]
Description= Service of Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
Обратите внимание, что в параметре User
указывается ранее созданный пользователь prometheus
.
Выполняем перезагрузку конфигураций служб:
sudo systemctl daemon-reload
И явно запускаем созданную только что созданную службу:
sudo systemctl start node_exporter
Вы можете убедиться в корректности работы экспортера открыв его через браузер. Введите в адресную строку адрес вашего сервера с указанием стандартного для Node_exporter порта (9100) и пути /metrics
.
Например, это может быть http://90.156.208.243:9100/metrics
— примерно по такому адресу экспортер будет возвращать данные для метрик.
Prometheus нужно явно указать, с каких экспортеров требуется собирать информацию.
Это делается в основном конфигурационном файле в блоке scrape_configs
, через добавление нового задания (jobs
).
Поэтому нам нужно будет открыть файл prometheus.yml
:
sudo nano /etc/prometheus/prometheus.yml
И дописать туда следующие настройки:
...
- job_name: 'prometheus_node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100'] # указываем адрес сервера и порт, на котором запущена служба Node_exporter
Конкретно для этого задания мы указали интервал сбора данных в 5 секунд, в отличие от глобально установленных 15 секунд.
Полный конфигурационный файл выглядит так:
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
- job_name: 'prometheus_node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
Будьте внимательны — YAML-файлы имеют строгие правила форматирования, поэтому лишние или недостающие отступы будут приводить к ошибке запуска.
Осталось только перезапустить службу Prometheus для обновления настроек:
sudo systemctl restart prometheus
Данные, собранные Node_exporter, можно передавать в Grafana для визуального вывода в виде метрик — абсолютно также, как это делается с данными от сервера Prometheus.
Аналогично, нужно импортировать уже готовую доску, которая доступна на официальном сайте Grafana. Для этого:
Откройте страницу с досками (Dashboards) в панели управления Grafana
Нажмите на кнопку New
Из выпадающего списка выбрать New dashboard
Нажмите кнопку Import dashboard
Введите идентификатор доски, который указан на сайте Grafana — 1860
Нажмите на кнопку Load
Далее все так же, как и с подключением доски для Prometheus:
Даете имя доске
Выбираете в качестве источника данных Prometheus
Кликаете на кнопку Import
Открывшуюся доску можно настроить по своему усмотрению.
Как уже упоминалось ранее, в некоторых случаях возможны проблемы с доступом к серверам Prometheus в момент добавления доски через ID. В этом случае используется JSON-файл, доступный на официальном сайте Prometheus на странице доски.
Содержимое файла необходимо вставить на странице добавления доски в специальное поле для JSON и нажать кнопку Load, после чего заполнить данные о доске.
Включение системы мониторинга Prometheus в проект включает в себя несколько этапов:
Загрузка, распаковка и ручная установка Prometheus с официального репозитория GitHub (или сайта)
Написание базового конфигурационного файла Prometheus
Установка и подключение системы визуализации данных Grafana. Тем не менее, во многих случаях достаточно использовать базовый функционал визуализации Prometheus
Добавление готовой (или создание новой) доски Grafana для отображения метрик
Подключение и настройка экспортеров данных. Базовым экспортером можно считать Node_exporter