Статьи → Сервера → Часть 7. Prometheus
Сервера Актуальная

Часть 7. Prometheus

Andrew ⚡ Администратор
(обновлено 23.09.2026)
99 v1.0

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, но об этом чуть позже.

P.s.: Ретеншен 15 дней для 30 серверов - золотая середина, чтобы база не распухала.

prometheus.service

Что такое --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/

Отредактируем файл. Удаляем все комментарии.

prometheus.yml

Приводим в такой вид:

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

prometheus проверка

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

сбор метрик

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


Установка клиента node_exporter

Возвращаемся на официальный сайт prometheus и находим node_expoerter.

загрузка node_exporter

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

выбираем версию

Я скопировал ссылку и загрузил сразу на сервер через wget.

wget https://github.com/prometheus/node_exporter/releases/download/v1.12.1/node_exporter-1.12.1.linux-amd64.tar.gz

Создаем временную директорию:

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.

конфиг prometheus

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

sudo systemctl reload prometheus

проверка сборки метрик

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

добавляем еще один сервер

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

добавляем новый сервер в prometheus.yml

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

Перезагружаем службу.

sudo systemctl reload prometheus

перезапускаем службу

добавление метрик нового сервера

Как видим, в одном job AstraLinux-servers два сервера. Так мы можем разграничить сервера. Отлично, сбор метрик реализован, а теперь давайте сделаем вывод на графану.


Настраиваем Prometheus + Grafana

Возвращаемся в графану. Слева находим «Подключения» → «Добавление нового подключения»

создаем новое соединение

Выбираем prometheus

добавляем соединение prometheus

добавляем новый источник

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

настраиваем соединение

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

указываю localhost

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

нажимаем сохранить и протестировать

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

успешное подключение

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

Находим импорт дашборда.

импорт дашборда

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

импорт дашборда

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

магазин дашбордов

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

ищем node_exporter

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

копируем id дашборда

вставляем id дашборда

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

импорт дашборда

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

рабочий дашборд с prometheus

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

выбор ноды

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

PromQL (Prometheus Query Language) — это язык запросов, созданный специально для работы с временными рядами в системе мониторинга Prometheus. С его помощью можно извлекать метрики, выполнять над ними сложные вычисления, агрегировать данные, строить графики и настраивать оповещения (алертинг)

редактировании элемента

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

изменения бублика

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

измененный дашборд

Я не владею языком запросов PromQL по этому показать построение графиков не смогу. Но с развитием нейросетей я думаю порог входа в него ниже некуда. 


Мониторинг докер контейнеров с помощью prometheus и графаны

Теперь разберем ситуацию, допустим у меня есть сервер на котором крутятся важные докер контейнеры (не будем сейчас разговаривать про kubernetes, просто представим ситуацию).

Я хочу отслеживать нагрузку и их состояние. Существует еще один контейнер cadvisor, который будет мониторить и стучать на них в графану. Снова немного выдержки с просторов интернета.

cAdvisor (Container Advisor) — это инструмент с открытым исходным кодом, разработанный компанией Google для мониторинга контейнеров. Его основная задача — собирать, агрегировать и предоставлять детальную информацию о том, как контейнеры используют системные ресурсы.

Загружаем контейнер 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

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

ищем дашборд docker monitoring

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

импорт дашборда

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

выбираем источник

готовый дашборд docker monitoring

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

ищем дашборд cadvisor exporter

используем дашборд cadvisor exporter

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

дашборд докера

Тут сразу видно какие контейнеры, их данные и графики. Есть аналогичные дашборды по типу postgres exporter (9628/14114).

Я постарался довести базу по работу с prometheus. Надеюсь донес материал доступным и понятным языком. Встретимся в следующей части цикла.

0
Andrew

DevOps Engineer

1 50 статей
Комментарии (0)
Войдите, чтобы оставить комментарий

Пока нет комментариев. Будьте первым!