Prometheus
Что такое prometheus?
Если совсем просто:
Zabbix - это как большой комбайн. Он сам умеет все: собирать данные с серверов, хранить их в базе, рисовать графики, отправлять уведомления, следить за доступностью. Поставил и работает из коробки.
Prometheus - это как конструктор LEGO. Он собирает только цифры (метрики) и хранит их. А чтобы рисовать графики или отправлять уведомления, нужно прикрутить отдельные детали (Grafana для графиков, Alertmanager для алертов).
Зачем нужен Prometheus, если есть Zabbix?
Потому что они заточены под разные задачи:
Zabbix лучше для:
- Мониторинга железа и сетей: серверы, коммутаторы, принтеры, температура, загрузка CPU. Все это он умеет щупать по стандартным протоколам (SNMP, IPMI, SSH).
- Когда у нас 500 виртуалок и нужно просто следить, чтобы они были живы.
- Готовое решение. Поставил, потыкал в веб-морде, настроил - работает.
Prometheus лучше для:
- Динамических сред (Docker, Kubernetes). Когда контейнеры постоянно создаются и умирают. Prometheus сам находит новые цели для мониторинга - это его суперсила.
- Приложений и микросервисов. Когда приложение само отдает свои метрики (сколько запросов, ошибок, время ответа) в специальном формате. Zabbix так тоже может, но Prometheus создан именно для этого.
- Сбора огромного количества метрик. Prometheus очень эффективно хранит и обрабатывает миллионы временных рядов.
Установка prometheus сервера
Заходим на официальный сайт prometheus, переходим в раздел Download. Выбираем версию и под какую операционную систему.


В моем случае, я сразу решил загрузить на сервер, по этому скопировал ссылку и вставил в wget.
wget https://github.com/prometheus/prometheus/releases/download/v3.14.0/prometheus-3.14.0.linux-amd64.tar.gz

Создадим директорию для временных файлов:
mkdir /tmp/prometheus
Распакуем загруженный архив во временную директорию.
tar -xzvf prometheus-3.14.0.linux-amd64.tar.gz -C /tmp/prometheus

Переходим во временную директорию с извлеченным архивом.
cd /tmp/prometheus/prometheus-3.14.0.linux-amd64
В этом архиве нам нужны только 2 файла:
prometheus.yml и бинарник prometheus.
Переносим бинарник в системную директорию:
sudo mv prometheus /usr/bin/
Создадим директорию под конфигурационный файл prometheus.yml в /etc/
sudo mkdir -p /etc/prometheus
Создадим директорию под локальную базу данных tsdb
sudo mkdir -p /var/lib/prometheus/data
Теперь, чтобы разграничить права и сделать это секьюрно, создадим отдельного пользователя.
sudo useradd -rs /bin/false prometheus
Даем права пользователю prometheus на файлы:
sudo chown -R prometheus:prometheus /var/lib/prometheus
sudo chown prometheus:prometheus /usr/bin/prometheus

Для запуска бинарника, создадим службу, которая будет запускать его.
Создадим конфиг кастомной службы:
sudo vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
Restart=on-failure
ExecStart=/usr/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/data --storage.tsdb.retention.time=15d --web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
Ничего тут менять не нужно, если вы делаете все по инструкции. Если у Вас свои взгляды и пути, то незабудьте поменять в конфиге тоже. Данную службу настроил так, чтобы при добавление нового хоста для сбора метрик, не нужно было всю службу перезапускать, достаточно сделать reload за вместо restart, но об этом чуть позже.

--web.enable-lifecycle и для чего он нужен? Это флаг, который включает горячее управление Prometheus через HTTP-запросы (API) без перезапуска всего сервиса (без systemctl restart). Когда этот флаг НЕ указан (выключен), то при любом изменении конфигурации (prometheus.yml) вам приходится делать жесткий рестарт сервиса:Минусы жесткого рестарта:
- В течение 10-30 секунд Prometheus не собирает метрики (образуется дыра в графиках).
- Все активные соединения с удаленными storage (если есть) обрываются.
- Если у вас много правил (alert rules), они пересчитываются заново.
--web.enable-lifecycle), вы можете перечитать конфигурацию на лету командой:Плюсы:
- Сервер продолжает собирать метрики без остановки.
- Новые цели (targets) в prometheus.yml добавляются мгновенно.
- Вы можете править файл конфига и применять его за 1 секунду без простоев.
Перенесем конфиг в системную директорию:
sudo mv prometheus.yml /etc/prometheus/
Отредактируем файл. Удаляем все комментарии.

Приводим в такой вид:
global:
scrape_interval: 10s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]

Сохраняем и накидываем права.
sudo chown -R prometheus:prometheus /etc/prometheus
Перезапускаем демона, так как создали новую службу.
sudo systemctl daemon-reload
Включаем и добавляем в автозагрузку одной командой.
sudo systemctl enable --now prometheus
Теперь заходим http://IP_СЕРВЕРА:9090


Отлично, наш сервер работает прекрасно и он сам с себя собирает метрики.

Наш сервер prometheus развернут, теперь настроим своего рода агентов node_exporter, которые будут собирать метрики, а потом настроим сервер prometheus, чтобы он делал scrape (соскрести) этих метрик.
Установка клиента node_exporter
Возвращаемся на официальный сайт prometheus и находим node_expoerter.

Выбираем версию для загрузки.

Я скопировал ссылку и загрузил сразу на сервер через wget.
Создаем временную директорию:
mkdir /tmp/node
Извлекаем содержимое архива во временную директорию:
tar -xzvf node_exporter-1.12.1.linux-amd64.tar.gz -C /tmp/node
переходим в нее
cd /tmp/node/node_exporter-1.12.1.linux-amd64
перенесем бинарный файл node_exporter в системную директорию
sudo mv node_exporter /usr/bin/
создадим специального пользователя node_exporter по аналогии, как с prometheus для запуска службы с node_exporter
sudo useradd -rs /bin/false node_exporter
накинем права для запуска
sudo chown node_exporter:node_exporter /usr/bin/node_exporter

Создадим кастомную службу, которая будет запускать node_exporter:
sudo vim /etc/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
Restart=on-failure
ExecStart=/usr/bin/node_exporter
[Install]
WantedBy=multi-user.target
После изменения или создании службы обязательно перезапускаем демона:
sudo systemctl daemon-reload
Запускаем нашу созданную службу и добавляем ее в автозагрузку одной командой:
sudo systemctl enable --now node_exporter

Теперь перейдем в браузер и посмотрим, собирает ли метрики, хотя уже по службе видно, но все же)


Метрики собираются, теперь нужно настроить prometheus, чтобы он собирал в себя эти метрики.
Возвращаемся на сервер prometheus и настраиваем конфиг со сбора.
sudo vim /etc/prometheus/prometheus.yml
global:
scrape_interval: 10s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: "AstraLinux-servers"
static_configs:
- targets:
- 192.168.31.248:9100
Итак, тут указываем глобальные настройки, чтобы каждые 10 секунд производился сбор метрик scrape (соскрести)
Далее создаем правила для скрапинга (сбора метрик). Добавляем первое правила для сбора метрик с сервера prometheus с localhost по порту 9090.
Вторым правилом добавим сбор метрик с сервера где развернули node_exporter.
В один job можно указать несколько машин, на примере как в targets job prometheus, через запятую указать еще один сервер, а можно просто указать сервер и порт, как в job AstraLinux-servers.

Сохраняем конфиг и перезапускаем службу. Так как службу создавали с возможностью частичного перезапуска, то выполним reload, а если вы создавали по своему, то скорее вам нужно будет использовать restart, но при таком подходе нужно будет подождать несколько секунд, а при reload все мгновенно подтянется.
sudo systemctl reload prometheus

Добавим еще один сервер, по аналогичному действию.

Добавим в конфиг prometheus новую ноду сервера. Добавим в существующий job.

Я уже рассказывал, что в job prometheus можно через запятую добавлять в targets несколько машин, но можно и как новая строка добавлять.
Перезагружаем службу.
sudo systemctl reload prometheus


Как видим, в одном job AstraLinux-servers два сервера. Так мы можем разграничить сервера. Отлично, сбор метрик реализован, а теперь давайте сделаем вывод на графану.
Настраиваем Prometheus + Grafana
Возвращаемся в графану. Слева находим «Подключения» → «Добавление нового подключения»

Выбираем prometheus


Указываем ip адрес и порт сервера prometheus

Так как у меня сервер prometheus развернут на сервере где графана, то я указываю localhost.

Больше ничего не нужно, нажимаем Сохранить и протестировать.

Если все хорошо, то увидим данное сообщение:

Осталось только вывести результаты на графану. Для этого будем использовать заряженный (готовый) дашборд, который принимает источник в виде prometheus метрик и отрисовывает готовые бублики.
Находим импорт дашборда.

Откроется вот такая панель

Нам предлагают на ней импортировать стандартные дашборды из их своего рода магазина. Для этого переходим по ссылке, как я сделал выше на картинке.

Нас интересует поиск, вбиваем в него - «node exporter» - это специальный дашборд заточенный под node prometheus.

Когда нашли, открываем его и справа есть его ID, можно загрузить готовый json и вставить его в нашу графану при импорте или просто вставить ID. Загрузка json очень удобна, когда у вас нет доступа в интернет, а графана есть с prometheus. В моем случае я просто скопирую ID дашборда и вставлю его в импорте.


У нас сразу прописывается имя дашборда и куда он создастся. Можем это изменить.

Получился вот такой результат.

Можем быстро переключаться в каждом job на любую ноду.

При желании можно отредактировать любой элемент или добавить новый или же переделать под себя дашборд и убрать лишнее. Но для редактирования нужно понимание языка запросов PromQL. Вот выдержка по нему с просторов интернета:

Можно немного изменить вид отображения под новый стиль графаны.

Вот что получилось

Я не владею языком запросов PromQL по этому показать построение графиков не смогу. Но с развитием нейросетей я думаю порог входа в него ниже некуда.
Мониторинг докер контейнеров с помощью prometheus и графаны
Теперь разберем ситуацию, допустим у меня есть сервер на котором крутятся важные докер контейнеры (не будем сейчас разговаривать про kubernetes, просто представим ситуацию).
Я хочу отслеживать нагрузку и их состояние. Существует еще один контейнер cadvisor, который будет мониторить и стучать на них в графану. Снова немного выдержки с просторов интернета.
Загружаем контейнер cAdvisor:
docker run -d --name=cadvisor --restart=always --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro --publish=8080:8080 --privileged gcr.io/cadvisor/cadvisor:latest
Создадим его на порту 8080.

Добавляем в конфиг prometheus данный контейнер с портом.
sudo vim /etc/prometheus/prometheus.yml
global:
scrape_interval: 10s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: "AstraLinux-servers"
static_configs:
- targets:
- 192.168.31.248:9100
- 192.168.31.81:9100
- job_name: "docker-cadvisor"
static_configs:
- targets: ["192.168.31.248:8080"]

Перезапускаем службу:
sudo systemctl reload prometheus

Отлично, метрики с docker-cadvisor собираются, теперь он будет стукачить на все контейнеры))

Снова идем в магазин готовых дашбордов и ищем Docker monitoring, копируем его ID.

Вставляем ID в импорт дашбордов.

Дашборд сразу предлагает выбрать источник метрик, выбираем наш prometheus.


Но что-то он некорректно отрисовывает, по этому я буду использовать другой дашборд: 14282 (Cadvisor exporter)


Как видим, он отрисовывает данные лучше.

Тут сразу видно какие контейнеры, их данные и графики. Есть аналогичные дашборды по типу postgres exporter (9628/14114).
Я постарался довести базу по работу с prometheus. Надеюсь донес материал доступным и понятным языком. Встретимся в следующей части цикла.