В данной статье я расскажу про установку и первоначальную настройка Prometheus + Alertmanager на CentOS 8.
Статей на эту тему в Интернет предостаточно, но как обычно в них есть опечатки, в результате чего некоторые вещи оказываются неработоспособными.
Исходные данные: CentOS 8.3
Задача: Установить Prometheus, Alertmanager и node_exporter, а так же произвести базовую настройку всех компонентов.
1. Первым делом на сервере должна быть настроена синхронизация времени по NTP
На самом деле на CentOS 8 при базовой установке для синхронизации времени ставится chronyd, нам лишь нужно убедиться, что он запущен и время синхронизируется:
# systemctl status chronyd
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2021-05-13 20:07:52 +05; 3h 4min ago
Docs: man:chronyd(8)
man:chrony.conf(5)
Main PID: 782 (chronyd)
Tasks: 1 (limit: 4930)
Memory: 1.3M
CGroup: /system.slice/chronyd.service
└─782 /usr/sbin/chronyd
Смотрим текущий статус синхронизации часов:
timedatectl status
Результат:
Local time: Thu 2021-05-13 23:14:25 +05
Universal time: Thu 2021-05-13 18:14:25 UTC
RTC time: Thu 2021-05-13 18:14:22
Time zone: Asia/Yekaterinburg (+05, +0500)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
Мы видим, что все синхронно.
2. Теперь разберемся с настройкой firewall
Для работы всех компонентов нужно открыть несколько портов:
На CentOS 8 используется firewalld, поэтому откроем нужные порты используя firewall-cmd, вначале проверим активную зону:
# firewall-cmd --get-active-zones public interfaces: enp0s3
Теперь добавим в public-зону нужные порты:
firewall-cmd --permanent --zone=public --add-port=9090/tcp --add-port=9093/tcp --add-port=9094/{tcp,udp} --add-port=9100/tcp
firewall-cmd --reload
Проверим настройки:
# firewall-cmd --permanent --zone=public --list-all public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client ssh ports: 9090/tcp 9093/tcp 9094/tcp 9094/udp 9100/tcp protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
3. Далее нам нужно проверить SELinux и отключить его
Конечно это не самый правильный вариант, но практика показывает, что для серверов в локальной сети это вполне допустимо.
Проверим включен ли SELinux:
getenforce
Результат:
Enforcing
То есть SELinux включен. Отключаем:
setenforce 0
И внесем правки в файл настроек, чтобы при рестарте сервера он отключился:
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
4. Теперь пришло время установить Prometheus
Тут нас ждет множество шагов т.к. у Prometheus нет репозитария пакетов и все придется делать руками — это скачать архив с бинарниками, создать пользователя, создать нужные каталоги и unit-файл для systemd и прочее.
Идем на официальную страницу и копируем ссылку на архив tar.gz для Linux архитектуры amd64.
На текущий момент доступна версия 2.28 и нам нужен файл prometheus-2.28.0.linux-amd64.tar.gz
wget https://github.com/prometheus/prometheus/releases/download/v2.28.0/prometheus-2.28.0.linux-amd64.tar.gz
Далее я приведу набор команд для создания пользователя от имени которого будет работать сервис, создание вспомогательных каталогов, распаковка скачанного архива, копированию бинарных файлов в нужные каталоги и прочее. Все эти команды нужно выполнить под пользователем root.
useradd --no-create-home --shell /bin/bash prometheus
usermod --home /var/lib/prometheus prometheus
mkdir /etc/prometheus
mkdir /var/lib/prometheus
tar -zxf prometheus-*.linux-amd64.tar.gz
cd prometheus-*.linux-amd64
yes | cp prometheus promtool /usr/local/bin/
cp -r console_libraries consoles prometheus.yml /etc/prometheus
chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
chown prometheus:prometheus /usr/local/bin/{prometheus,promtool}
echo "PROMETHEUS_OPTS=\"--storage.tsdb.retention.time=7d --storage.tsdb.retention.size=50GB\"" > /etc/default/prometheus
chown prometheus:prometheus /etc/default/prometheus
cd ~
Обратите внимание файл /etc/default/prometheus с опциями —storage.tsdb.retention.time и —storage.tsdb.retention.size. Первая опция говорит, что нужно удалять старые данные старше 7 дней, а вторая задает удаление по размеру хранимых данных. Я задал 7 дней или 50 Гигабайт. Вам нужно выставить свои значения. Более подробно об этих настройках можно прочитать в официальной документации.
Теперь попробуем запустить Prometheus в консоле (интерактивно):
su - prometheus -c "/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"
В консоле вы должны увидеть запуск Prometheus примерно с таким выводом:
level=info ts=2021-05-13T18:52:23.621Z caller=main.go:388 msg="No time or size retention was set so using the default time retention" duration=15d level=info ts=2021-05-13T18:52:23.621Z caller=main.go:426 msg="Starting Prometheus" version="(version=2.28.0, branch=HEAD, revision=ff58416a0b0224bab1f38f949f7d7c2a0f658940)" level=info ts=2021-05-13T18:52:23.621Z caller=main.go:431 build_context="(go=go1.16.5, user=root@32b9079a2740, date=20210621-15:45:36)" level=info ts=2021-05-13T18:52:23.621Z caller=main.go:432 host_details="(Linux 4.18.0-240.el8.x86_64 #1 SMP Fri Sep 25 19:48:47 UTC 2020 x86_64 centos8.localdomain (none))" level=info ts=2021-05-13T18:52:23.621Z caller=main.go:433 fd_limits="(soft=1024, hard=262144)" level=info ts=2021-05-13T18:52:23.621Z caller=main.go:434 vm_limits="(soft=unlimited, hard=unlimited)" level=info ts=2021-05-13T18:52:23.622Z caller=web.go:540 component=web msg="Start listening for connections" address=0.0.0.0:9090 level=info ts=2021-05-13T18:52:23.624Z caller=main.go:803 msg="Starting TSDB ..." level=info ts=2021-05-13T18:52:23.628Z caller=head.go:741 component=tsdb msg="Replaying on-disk memory mappable chunks if any" level=info ts=2021-05-13T18:52:23.628Z caller=head.go:755 component=tsdb msg="On-disk memory mappable chunks replay completed" duration=2.735µs level=info ts=2021-05-13T18:52:23.628Z caller=head.go:761 component=tsdb msg="Replaying WAL, this may take a while" level=info ts=2021-05-13T18:52:23.632Z caller=tls_config.go:191 component=web msg="TLS is disabled." http2=false level=info ts=2021-05-13T18:52:23.632Z caller=head.go:813 component=tsdb msg="WAL segment loaded" segment=0 maxSegment=0 level=info ts=2021-05-13T18:52:23.632Z caller=head.go:818 component=tsdb msg="WAL replay completed" checkpoint_replay_duration=26.835µs wal_replay_duration=4.47535ms total_replay_duration=4.526302ms level=info ts=2021-05-13T18:52:23.636Z caller=main.go:828 fs_type=XFS_SUPER_MAGIC level=info ts=2021-05-13T18:52:23.636Z caller=main.go:831 msg="TSDB started" level=info ts=2021-05-13T18:52:23.636Z caller=main.go:957 msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml level=info ts=2021-05-13T18:52:23.780Z caller=main.go:988 msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml totalDuration=144.524274ms remote_storage=2.175µs web_handler=342ns query_engine=1.032µs scrape=143.965324ms scrape_sd=78.146µs notify=19.165µs notify_sd=12.808µs rules=1.004µs level=info ts=2021-05-13T18:52:23.780Z caller=main.go:775 msg="Server is ready to receive web requests."
Строка «Server is ready to receive web requests.» говорит, что все успешно запустилось и можно открыть Web-браузер по адресу http://IP-адрес-сервера:9090
Теперь нажимаем Ctrl+C для остановки процесса и настроим автозапуск Prometheus.
Для начала поменяем shell у пользователя prometheus, ведь теперь он ему не нужен:
usermod --shell /bin/false prometheus
Теперь создадим unit-фaйл для systemd:
cat << EOF > /etc/systemd/system/prometheus.service [Unit] Description=Prometheus Service After=network.target [Service] EnvironmentFile=-/etc/default/prometheus 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 \\ \$PROMETHEUS_OPTS ExecReload=/bin/kill -HUP \$MAINPID Restart=on-failure [Install] WantedBy=multi-user.target EOF
Перезагрузим конфигурацию systemd и запустим Prometheus:
systemctl daemon-reload systemctl enable --now prometheus
Проверим факт запуска:
# systemctl status prometheus
● prometheus.service - Prometheus Service
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2021-05-16 21:13:18 +05; 4min 10s ago
Main PID: 7925 (prometheus)
Tasks: 7 (limit: 4956)
Memory: 53.1M
CGroup: /system.slice/prometheus.service
└─7925 /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 >
# netstat -ltupn | grep prometheus tcp6 0 0 :::9090 :::* LISTEN 39210/prometheus
5. Теперь пришло время установить Alertmanager
И опять нас ждет множество шагов. Я постараюсь писать уже не так подробно, ведь действия будут схожи с установкой Prometheus.
wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
useradd --no-create-home --shell /bin/false alertmanager
usermod --home /var/lib/alertmanager alertmanager
mkdir /etc/alertmanager
mkdir /var/lib/alertmanager
tar -zxf alertmanager-*.linux-amd64.tar.gz
cd alertmanager-*.linux-amd64
yes | cp alertmanager amtool /usr/local/bin/
cp alertmanager.yml /etc/alertmanager
chown -R alertmanager:alertmanager /etc/alertmanager /var/lib/alertmanager
chown alertmanager:alertmanager /usr/local/bin/{alertmanager,amtool}
cd ~
cat << EOF > /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/alertmanager \\
\$ALERTMANAGER_OPTS
ExecReload=/bin/kill -HUP \$MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
echo "ALERTMANAGER_OPTS=\"\"" > /etc/default/alertmanager
chown alertmanager:alertmanager /etc/default/alertmanager
systemctl daemon-reload
systemctl enable --now alertmanager
После этих действий у нас должен запуститься Alertmanager в виде службы, проверим:
# systemctl status alertmanager
● alertmanager.service - Alertmanager Service
Loaded: loaded (/etc/systemd/system/alertmanager.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2021-05-14 00:29:24 +05; 8s ago
Main PID: 39473 (alertmanager)
Tasks: 6 (limit: 4930)
Memory: 10.6M
CGroup: /system.slice/alertmanager.service
└─39473 /usr/local/bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/var/lib/prometheus/alertmanager
# netstat -ltupn | grep alertmanager tcp6 0 0 :::9093 :::* LISTEN 39473/alertmanager tcp6 0 0 :::9094 :::* LISTEN 39473/alertmanager udp6 0 0 :::9094 :::* 39473/alertmanager
Открываем Web-браузер по адресу http://IP-адрес-сервера:9093 и перед нами должна появиться консоль Alertmanager
6. Далее нам нужно установить node_exporter
node_exporter — это уже сборщик метрик с операционной системы, его можно установить на все сервера в компании и настроить Prometheus на сбор данных с этого экспортера.
Если Вы будите устанавливать node_exporter на другие сервера, то необходимо открыть порт 9100/tcp, чтобы Prometheus смог подключиться к node_exporter.
Я так же постараюсь быть кратким и приведу лишь набор необходимых для установки команд и немного комментариев.
wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz useradd --no-create-home --shell /bin/false nodeusr tar -zxf node_exporter-*.linux-amd64.tar.gz cd node_exporter-*.linux-amd64 cp node_exporter /usr/local/bin/ chown nodeusr:nodeusr /usr/local/bin/node_exporter cd ~ cat << EOF > /etc/systemd/system/node_exporter.service [Unit] Description=Node Exporter Service After=network.target [Service] EnvironmentFile=-/etc/default/node_exporter User=nodeusr Group=nodeusr Type=simple ExecStart=/usr/local/bin/node_exporter \$NODE_EXPORTER_OPTS ExecReload=/bin/kill -HUP \$MAINPID Restart=on-failure [Install] WantedBy=multi-user.target EOF echo "NODE_EXPORTER_OPTS=\"\"" > /etc/default/node_exporter chown nodeusr:nodeusr /etc/default/node_exporter systemctl daemon-reload systemctl enable --now node_exporter
После этих действий у нас должен запуститься node_exporter в виде службы, проверим:
# systemctl status node_exporter
● node_exporter.service - Node Exporter Service
Loaded: loaded (/etc/systemd/system/node_exporter.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2021-05-16 21:22:06 +05; 706ms ago
Main PID: 8055 (node_exporter)
Tasks: 3 (limit: 4956)
Memory: 8.6M
CGroup: /system.slice/node_exporter.service
└─8055 /usr/local/bin/node_exporter
# netstat -ltupn | grep node_exporter tcp6 0 0 :::9100 :::* LISTEN 39693/node_exporter
Открываем Web-браузер по адресу http://IP-адрес-сервера:9100/metrics и перед нами должны появиться метрики, собранные node_exporter
6. Теперь настроим сбор метрик с node_exporter в Prometheus
Открываем файл конфигураций Prometheus — /etc/prometheus/prometheus.yml и в разделе scrape_configs добавляем job_name: ‘node_exporter_clients’ с нашими серверами:
...
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['192.168.10.10:9090']
- job_name: 'node_exporter_clients'
scrape_interval: 60s
static_configs:
- targets: ['192.168.10.11:9100','192.168.10.12:9100','192.168.10.13:9100']
Это кусочек моего конфига с моими IP адресами, у Вас же они будут свои.
Скажу лишь, что job_name: ‘prometheus’ с адресом 192.168.10.10:9090 — это сам сервер с Prometheus
Ниже идет job_name: ‘node_exporter_clients’ у которого в targets перечислен список серверов с установленным node_exporter.
Для применения настроек нужно перезапустить Prometheus:
systemctl restart prometheus
После этого в Web-интерфейсе Prometheus в разделе Status -> Targets мы сможем увидеть наши сервера:
7. Теперь настроим в Prometheus алармы
Создадим простой файл с правилом:
cat << EOF > /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
EOF
Проверим наше правило на корректность с помощью promtool:
/usr/local/bin/promtool check rules /etc/prometheus/alert_rules.yml
Результат:
Checking /etc/prometheus/alert_rules.yml SUCCESS: 1 rules found
Все корректно, двигаемся дальше.
Далее подключим правило в конфигурацию Prometheus, в файле /etc/prometheus/prometheus.yml в секции rule_files: добавьте
... rule_files: # - "first_rules.yml" # - "second_rules.yml" - "alert_rules.yml" ...
Перезапустим Prometheus:
systemctl restart prometheus
Наше правило появилось в разделе Status -> Rules
Так же мы можем увидеть его на странице Alerts
Теперь остановим на одном сервере node_exporter и посмотрим состояние аларма:
8. И последнее, что мы настроим — это отправку аларма на почту (email)
Для этого нам потребуется немного настроить Alertmanager.
Откроем файл /etc/alertmanager/alertmanager.yml и добавим несколько настроек.
В секцию global добавим настройку smtp_from (если данной секции нет, то создайте ее):
global: smtp_from: [email protected] ...
Таким образом мы будем отправлять сообщения от имени [email protected] (у Вас будет другой email).
Далее секцию 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
Напомню, что имя события InstanceDown было описано выше в файле /etc/prometheus/alert_rules.yml
Далее добавим в конфиг еще один ресивер (send_email) с описанием почтового сервера через который будем отправлять алармы (я буду отправлять через почту для домена на yandex.ru):
receivers: ... - name: send_email email_configs: - to: [email protected] send_resolved: true smarthost: smtp.yandex.ru:587 auth_username: [email protected] auth_password: XXXXXXXXX require_tls: true
Мы будем отправлять алармы на ящик [email protected]
Перезапустим Alertmanager:
systemctl restart alertmanager
Теперь нам нужно настроить связку Prometheus с Alertmanager, для этого открываем конфигурационный файл Prometheus — /etc/prometheus/prometheus.yml
Приведем секцию alerting к виду:
alerting:
alertmanagers:
- static_configs:
- targets:
- 127.0.0.1:9093
Перезапустим Prometheus:
systemctl restart prometheus
Через некоторое время в Alertmanager появится наш алерт:
И мы получим на почту сообщение примерно как на скрине ниже:
На этом все, в следующей статье про Prometheus и Alertmanager мы научимся осуществлять мониторинг нагрузки на CPU, использование RAM и диска, а так же попробуем настроить мониторинг Linux-служб на примере nginx.
Если у Вас возникли вопросы или Вы хотите, чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, PostgreSQL) на протяжении последних 24 лет.








Cпасибо, очень помогла Ваша статья!