Установка Prometheus + Alertmanager + node_exporter на Linux

В двух словах, Prometheus — система мониторинга, обладающая возможностями тонкой настройки метрик. Она будет полезна для отслеживания состояния работы сервисов на низком уровне.

Данная инструкция позволит установить prometheus как на системы RPM (Red Hat, CentOS), так и deb (Debian, Ubuntu). Помимо Prometheus мы установим Alertmanager для возможности отправлять тревоги и node_exporter для мониторинга сервера Linux.

Подготовка сервера

Настроим некоторые параметры сервера, необходимые для правильно работы системы.

Дополнительные пакеты

Установим пакеты, которые нам понадобятся для работы:

  • wget — для загрузки файлов.
  • tar — для распаковки архивов.

В зависимости от системы, команды будут немного отличаться.

а) Для Linux Deb (Debian / Ubuntu):

apt update

apt install wget tar

б) Для Linux RPM (Rocky / CentOS):

yum install wget tar

Время

Для отображения событий в правильное время, необходимо настроить его синхронизацию. Для этого установим chrony:

а) если на системе CentOS / Red Hat :

yum install chrony

systemctl enable chronyd

systemctl start chronyd

б) если на системе Ubuntu / Debian :

apt install chrony

systemctl enable chrony

systemctl start chrony

Брандмауэр

На фаерволе, при его использовании, необходимо открыть порты:

  • TCP 9090 — http для сервера прометеус.
  • TCP 9093 — http для алерт менеджера.
  • TCP и UDP 9094 — для алерт менеджера.
  • TCP 9100 — для node_exporter.

а) с помощью firewalld:

firewall-cmd —permanent —add-port=9090/tcp —add-port=9093/tcp —add-port=9094/{tcp,udp} —add-port=9100/tcp

firewall-cmd —reload

б) с помощью iptables:

iptables -I INPUT -p tcp —match multiport —dports 9090,9093,9094,9100 -j ACCEPT

iptables -I INPUT -p udp —dport 9094 -j ACCEPT

Сохраняем правила с помощью iptables-persistent:

apt install iptables-persistent

netfilter-persistent save

в) с помощью ufw:

ufw allow 9090,9093,9094,9100/tcp

ufw allow 9094/udp

ufw reload

SELinux

По умолчанию, SELinux работает в операционный системах на базе Red Hat. Проверяем, работает ли она в нашей системе:

getenforce

Если мы получаем в ответ:

Enforcing

… необходимо отключить его командами:

setenforce 0

sed -i ‘s/^SELINUX=.*/SELINUX=disabled/g’ /etc/selinux/config

* если же мы получим ответ The program ‘getenforce’ is currently not installed , то SELinux не установлен в системе.

Prometheus

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

Загрузка

Переходим на официальную страницу загрузки и копируем ссылку на пакет для Linux (желательно, использовать версию LTS):

Копируем ссылку на prometheus

… и используем ее для загрузки пакета на Linux:

wget https://github.com/prometheus/prometheus/releases/download/v2.53.4/prometheus-2.53.4.linux-amd64.tar.gz

* если система вернет ошибку, необходимо установить пакет wget.

Установка (копирование файлов)

После того, как мы скачали архив prometheus, необходимо его распаковать и скопировать содержимое по разным каталогам.

Для начала создаем каталоги, в которые скопируем файлы для prometheus:

mkdir /etc/prometheus /var/lib/prometheus

Распакуем наш архив:

tar -zxf prometheus-*.linux-amd64.tar.gz

… и перейдем в каталог с распакованными файлами:

cd prometheus-*.linux-amd64

Распределяем файлы по каталогам:

cp prometheus promtool /usr/local/bin/

cp prometheus.yml /etc/prometheus

Выходим из каталога и удаляем исходник:

cd .. && rm -rf prometheus-*.linux-amd64/ && rm -f prometheus-*.linux-amd64.tar.gz

Назначение прав

Создаем пользователя, от которого будем запускать систему мониторинга:

useradd —no-create-home —shell /bin/false prometheus

* мы создали пользователя prometheus без домашней директории и без возможности входа в консоль сервера.

Задаем владельца для каталогов, которые мы создали на предыдущем шаге:

chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus

Задаем владельца для скопированных файлов:

chown prometheus:prometheus /usr/local/bin/{prometheus,promtool}

Запуск и проверка

Запускаем prometheus от одноименного пользователя:

sudo -u prometheus /usr/local/bin/prometheus —config.file /etc/prometheus/prometheus.yml —storage.tsdb.path /var/lib/prometheus/

… мы увидим лог запуска — в конце «Server is ready to receive web requests»:

level=info ts=2019-08-07T07:39:06.849Z caller=main.go:621 msg=» Server is ready to receive web requests. »

Открываем веб-браузер и переходим по адресу http://<IP-адрес сервера>:9090 — загрузится консоль Prometheus:

Веб консоль Prometheus

Установка завершена.

Автозапуск

Мы установили наш сервер мониторинга, но его необходимо запускать вручную, что совсем не подходит для серверных задач. Для настройки автоматического старта Prometheus мы создадим новый юнит в systemd.

Возвращаемся к консоли сервера и прерываем работу Prometheus с помощью комбинации Ctrl + C. Создаем файл prometheus.service:

vi /etc/systemd/system/prometheus.service

[Unit]
Description=Prometheus Service
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.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/
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Разрешаем автозапуск:

systemctl enable prometheus

Запускаем службу:

systemctl start prometheus

… и проверяем, что она запустилась корректно:

systemctl status prometheus

Alertmanager

Alertmanager нужен для сортировки и группировки событий. Он устанавливается по такому же принципу, что и prometheus.

Загрузка

На той же официальной странице загрузки копируем ссылку на Alertmanager для Linux:

Копируем ссылку на alertmanager

Теперь используем ссылку для загрузки alertmanager:

wget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz

Установка

Создаем каталоги для alertmanager:

mkdir -p /etc/alertmanager /var/lib/prometheus/alertmanager

Распакуем наш архив:

tar -zxf alertmanager-*.linux-amd64.tar.gz

… и перейдем в каталог с распакованными файлами:

cd alertmanager-*.linux-amd64

Распределяем файлы по каталогам:

cp alertmanager amtool /usr/local/bin/

cp alertmanager.yml /etc/alertmanager

Выходим из каталога и удаляем исходник:

cd .. && rm -rf alertmanager-*.linux-amd64/

Назначение прав

Создаем пользователя, от которого будем запускать alertmanager:

useradd —no-create-home —shell /bin/false alertmanager

* мы создали пользователя alertmanager без домашней директории и без возможности входа в консоль сервера.

Задаем владельца для каталогов, которые мы создали на предыдущем шаге:

chown -R alertmanager:alertmanager /etc/alertmanager /var/lib/prometheus/alertmanager

Задаем владельца для скопированных файлов:

chown alertmanager:alertmanager /usr/local/bin/{alertmanager,amtool}

Автозапуск

Создаем файл alertmanager.service в systemd:

vi /etc/systemd/system/alertmanager.service

[Unit]
Description=Alertmanager Service
After=network.target

[Service]
EnvironmentFile=-/etc/default/alertmanager
User=alertmanager
Group=alertmanager
Type=simple
ExecStart=/usr/local/bin/alertmanager
—config.file=/etc/alertmanager/alertmanager.yml
—storage.path=/var/lib/prometheus/alertmanager
—cluster.advertise-address=0.0.0.0:9093
$ALERTMANAGER_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Разрешаем автозапуск:

systemctl enable alertmanager

Запускаем службу:

systemctl start alertmanager

Открываем веб-браузер и переходим по адресу http://<IP-адрес сервера>:9093 — загрузится консоль alertmanager:

Веб консоль Alertmanager

Установка завершена.

node_exporter

Для получения метрик от операционной системы, установим и настроим node_exporter на тот же сервер прометеуса (и на все клиентские компьютеры). Процесс установки такой же, как у Prometheus и Alertmanager.

Если мы устанавливаем node_exporter на клиента, необходимо проверить наличие брандмауэра и, при необходимости, открыть tcp-порт 9100.

Загрузка

Заходим на страницу загрузки и копируем ссылку на node_exporter:

Копируем ссылку на node_exporter

* обратите внимание, что для некоторых приложений есть свои готовые экспортеры.

Теперь используем ссылку для загрузки node_exporter:

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

Установка

Распакуем скачанный архив:

tar -zxf node_exporter-*.linux-amd64.tar.gz

… и перейдем в каталог с распакованными файлами:

cd node_exporter-*.linux-amd64

Копируем исполняемый файл в bin:

cp node_exporter /usr/local/bin/

Выходим из каталога и удаляем исходник:

cd .. && rm -rf node_exporter-*.linux-amd64/ && rm -f node_exporter-*.linux-amd64.tar.gz

Назначение прав

Создаем пользователя nodeusr:

useradd —no-create-home —shell /bin/false nodeusr

Задаем владельца для исполняемого файла:

chown -R nodeusr:nodeusr /usr/local/bin/node_exporter

Автозапуск

Создаем файл node_exporter.service в systemd:

vi /etc/systemd/system/node_exporter.service

[Unit]
Description=Node Exporter Service
After=network.target

[Service]
User=nodeusr
Group=nodeusr
Type=simple
ExecStart=/usr/local/bin/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Разрешаем автозапуск:

systemctl enable node_exporter

Запускаем службу:

systemctl start node_exporter

Открываем веб-браузер и переходим по адресу http://<IP-адрес сервера или клиента>:9100/metrics — мы увидим метрики, собранные node_exporter:

Метрики, собранные node_exporter

Установка завершена.

Отображение метрик с node_exporter в консоли prometheus

Открываем конфигурационный файл prometheus:

vi /etc/prometheus/prometheus.yml

В разделе scrape_configs добавим:

scrape_configs:

— job_name: ‘node_exporter_clients’
scrape_interval: 5s
static_configs:
— targets:
— 192.168.0.14:9100
— 192.168.0.15:9100

* в данном примере мы добавили клиента с IP-адресом 192.168.0.14 , рабочее название для группы клиентов node_exporter_clients . Для примера, мы также добавили клиента 192.168.0.15 — чтобы продемонстрировать, что несколько клиентов добавляется через запятую.

Чтобы настройка вступила в действие, перезагружаем наш сервис prometheus:

systemctl restart prometheus

Заходим в веб-консоль prometheus и переходим в раздел Status Targets :

Переходим в раздел Status - Targets

… в открывшемся окне мы должны увидеть нашу группу хостов и сам компьютер с установленной node_exporter:

Группа хостов с установленной node_exporter

* статус также должен быть UP .

Отображение тревог

Создадим простое правило, реагирующее на недоступность клиента.

Создаем файл с правилом:

vi /etc/prometheus/alert.rules.yml

groups:
— name: alert.rules
rules:
— alert: InstanceDown
expr: up == 0
for: 1m
labels:
severity: critical
annotations:
description: ‘{{ $labels.instance }} of job {{ $labels.job }} has been down
for more than 1 minute.’
summary: Instance {{ $labels.instance }} down

Теперь подключим наше правило в конфигурационном файле prometheus:

vi /etc/prometheus/prometheus.yml


rule_files:
# — «first_rules.yml»
# — «second_rules.yml»
— «alert.rules.yml»

* в данном примере мы добавили наш файл alert.rules.yml в секцию rule_files . Закомментированные файлы first_rules.yml и second_rules.yml уже были в файле в качестве примера.

Перезапускаем сервис:

systemctl restart prometheus

Открываем веб-консоль прометеуса и переходим в раздел Alerts . Если мы добавим клиента и попробуем его отключить для примера, мы увидим тревогу:

Группа хостов с установленной node_exporter

Отправка уведомлений

Теперь настроим связку с алерт менеджером для отправки уведомлений на почту и телеграм-чат.

Уведомления на почту

Настроим alertmanager:

vi /etc/alertmanager/alertmanager.yml

В секцию global добавим:

global:

smtp_from: monitoring@remontka.com

* при отсутствии секции global необходимо ее добавить.
** мы будем отправлять сообщения от email monitoring@remontka.com .

Приведем секцию route к виду:

route:
group_by: [‘alertname’, ‘instance’, ‘severity’]
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: ‘web.hook’

routes:
— receiver: send_email
match:
alertname: InstanceDown

* в данном примере нами был добавлен маршрут, который отлавливает событие InstanceDown и запускает ресивер send_email .

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

receivers:

— name: send_email
email_configs:
— to: alert@remontka.com
smarthost: localhost:25
require_tls: false

* в данном примере мы отправляем сообщение на почтовый ящик alert@remontka.com с локального сервера. Обратите внимание, что для отправки почты наружу у нас должен быть корректно настроенный почтовый сервер (в противном случае, почта может попадать в СПАМ).

Перезапустим сервис для алерт менеджера:

systemctl restart alertmanager

Теперь настроим связку prometheus с alertmanager — открываем конфигурационный файл сервера мониторинга:

vi /etc/prometheus/prometheus.yml

Приведем секцию alerting к виду:

alerting:
alertmanagers:
— static_configs:
— targets:
— 192.168.0.14:9093

* где 192.168.0.14 — IP-адрес сервера, на котором у нас стоит alertmanager.

Перезапускаем сервис:

systemctl restart prometheus

Немного ждем и заходим на веб интерфейс алерт менеджера — мы должны увидеть тревогу:

Событие в алерт менеджере

… а на почтовый ящик должно прийти письмо с тревогой.

Отправка уведомлений в телеграм

Открываем телеграм и ищем пользователя @BotFather :

Ищем @BotFather в телеграме

Переходим в чат с найденным BotFather и запускаем бота:

Запускаем BotFather

Создаем бота, последовательно введя команду /newbot и отвечая на запросы мастера. Например:

/newbot

remontka_prometheus

DmoskPrometheusBot

* где:

  • /newbot — команда для создания нового телеграм бота.
  • remontka_prometheus — имя бота.
  • DmoskPrometheusBot — имя учетной записи бота. Обязательно должно быть Bot на конце.

В результате мы должны получить сообщение на подобие:

Done! Congratulations on your new bot. You will find it at t.me/DmoskPrometheusBot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you’ve finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
1234567890:ABCDEFGHIYKLMNOPI8e48SeTHIGfzD8W4E
Keep your token secure and store it safely, it can be used by anyone to control your bot.

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

* где 1234567890:ABCDEFGHIYKLMNOPI8e48SeTHIGfzD8W4E — токен бота. Его храним в безопасном месте.

Открываем телеграм чат или канал и добавляем созданного бота, чтобы он мог отправлять сообщения.

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

curl https://api.telegram.org/bot<BotID>/sendMessage?chat_id=<ChannelName>&text=<Text>

Настройка бота закончена.

Настроим alertmanager:

vi /etc/alertmanager/alertmanager.yml

Приведем секцию route к виду:

route:
group_by: [‘alertname’, ‘instance’, ‘severity’]
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: ‘web.hook’

routes:
— receiver: telegram

* в данном примере нами был добавлен маршрут, который отлавливает событие InstanceDown и запускает ресивер send_email .

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

receivers:

— name: telegram
telegram_configs:
— chat_id: <ID чата>
bot_token: «<Полученыый токен для бота>»
api_url: «https://api.telegram.org»
send_resolved: true
parse_mode: »

* в данном примере мы отправляем сообщение в чат по его ID. В качестве данного идентификатора нужно использовать либо имя через знак @ (@remontkaChatGroup), либо идентификационный номер через — (-123456789).

Перезапустим сервис для алерт менеджера:

systemctl restart alertmanager

Проверим, что служба запущена:

systemctl status alertmanager

Теперь настроим связку prometheus с alertmanager — открываем конфигурационный файл сервера мониторинга:

vi /etc/prometheus/prometheus.yml

Приведем секцию alerting к виду:

alerting:
alertmanagers:
— static_configs:
— targets:
— 192.168.0.14:9093

* где 192.168.0.14 — IP-адрес сервера, на котором у нас стоит alertmanager.

Перезапускаем сервис:

systemctl restart prometheus

Мониторинг служб Linux

Для мониторинга сервисов с помощью Prometheus мы настроим сбор метрик и отображение тревог.

Сбор метрие с помощью node_exporter

Открываем сервис, созданный для node_exporter:

vi /etc/systemd/system/node_exporter.service

… и добавим к ExecStart:


ExecStart=/usr/local/bin/node_exporter —collector.systemd

* данная опция указывает экспортеру мониторить состояние каждой службы.

При необходимости, мы можем либо мониторить отдельные службы, добавив опцию collector.systemd.unit-whitelist :

ExecStart=/usr/local/bin/node_exporter —collector.systemd —collector.systemd.unit-whitelist=»(chronyd|mariadb|nginx).service»

* в данном примере будут мониториться только сервисы chronyd , mariadb и nginx .

… либо наоборот — мониторить все службы, кроме отдельно взятых:

ExecStart=/usr/local/bin/node_exporter —collector.systemd —collector.systemd.unit-blacklist=»(auditd|dbus|kdump).service»

* при такой настройке мы запретим мониторинг сервисов auditd , dbus и kdump .

Чтобы применить настройки, перечитываем конфиг systemd:

systemctl daemon-reload

Перезапускаем node_exporter:

systemctl restart node_exporter

Отображение тревог

Настроим мониторинг для службы NGINX.

Создаем файл с правилом:

vi /etc/prometheus/services.rules.yml

groups:
— name: services.rules
rules:
— alert: nginx_service
expr: node_systemd_unit_state{name=»nginx.service»,state=»active»} == 0
for: 1s
annotations:
summary: «Instance {{ $labels.instance }} is down»
description: «{{ $labels.instance }} of job {{ $labels.job }} is down.»

Подключим файл с описанием правил в конфигурационном файле prometheus:

vi /etc/prometheus/prometheus.yml


rule_files:
# — «first_rules.yml»
# — «second_rules.yml»
— «alert.rules.yml»
— «services.rules.yml»

* в данном примере мы добавили наш файл services.rules.yml к уже ранее добавленному alert.rules.yml в секцию rule_files .

Перезапускаем prometheus:

systemctl restart prometheus

Для проверки, остановим наш сервис:

systemctl stop nginx

В консоли Prometheus в разделе Alerts мы должны увидеть тревогу:

Тревога при падении сервиса

Проксирование через NGINX

Если у нас есть обратный прокси на базе NGINX и мы хотим через него отправлять запросы на Prometheus, нам понадобится дополнительная настройка.

Мы рассмотрим 2 варианта:

  1. Когда запросы проксируются на основе виртуального домена.
  2. Когда запросы идут на основе добавления адреса к URL.

Виртуальные домены

server {
listen 80;
server_name prometheus.remontka.com;

location / {
proxy_pass http://127.0.0.1:9090;
proxy_redirect off;
proxy_http_version 1.1;

proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection «upgrade»;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto http;
}
}

Читайте также

Другие полезные инструкции:

1. Создание графиков в Grafana на основе данных из Prometheus .

2. Примеры запросов к метрикам Prometheus .

3. Установка и настройка Pushgateway для Prometheus .

4. Prometheus + Grafana + Alertmanager в Docker .

5. Шпаргалка по установке и настройке различных Prometheus exporter на Linux .

EnglishRussianUkrainian