Alertmanager - это инструмент для обработки оповещений, который устраняет дубликаты, группирует и отправляет оповещения соответствующему получателю.
Установка Alertmanager
Добавляем пользователя
1
| $ sudo useradd -M -s /bin/false alertmanager
|
Создаем каталоги
1
| $ sudo mkdir /etc/alertmanager /var/lib/prometheus/alertmanager
|
Скачиваем Alertmanager в каталог /tmp
1
2
| $ wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz -P /tmp
$ cd /tmp
|
Распаковываем и копируем в системные каталоги
1
2
3
4
5
6
| $ tar -zxpvf alertmanager-0.21.0.linux-amd64.tar.gz
$ cd alertmanager-0.21.0.linux-amd64
$ sudo cp alertmanager amtool /usr/local/bin/
$ sudo cp alertmanager.yml /etc/alertmanager
$ sudo chown -R alertmanager:alertmanager /etc/alertmanager /var/lib/prometheus/alertmanager
$ sudo chown alertmanager:alertmanager /usr/local/bin/{alertmanager,amtool}
|
Создаем Systemd Unit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| $ sudo nano /etc/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager Service
After=network.target prometheus.service
[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 \
$ALERTMANAGER_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
Restart=always
[Install]
WantedBy=multi-user.target
|
Добавляем в автозагрузку, запускаем сервис, проверяем статус
1
2
3
| $ sudo systemctl daemon-reload
$ sudo systemctl enable --now alertmanager
$ sudo systemctl status alertmanager
|
Проверяем, доступен ли порт 9093
1
| $ ss -tunlp | grep 9093
|
Настройка авторизации
Устанавливаем утилиту dnf-utils
1
| $ sudo dnf -y install dnf-utils
|
Добавляем репозиторий Nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $ sudo nano /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
|
По умолчанию будет использоваться стабильная версия. Если нужна основная версия (mainline
), переключаемся
1
| $ sudo dnf config-manager --set-enabled nginx-mainline
|
Устанавливаем Nginx
1
| $ sudo dnf -y install nginx
|
Отключаем дефолтный конфиг
1
2
| $ cd /etc/nginx/conf.d/
$ sudo mv default.conf default.conf.disable
|
Создаем конфиг alertmanager.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| $ sudo nano alertmanager.conf
server {
listen 19093;
listen [::]:19093;
server_name _;
location / {
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:9093/;
proxy_set_header Host $host;
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 $scheme;
auth_basic "AlertManager";
auth_basic_user_file /etc/nginx/alertmanager.htpasswd;
}
}
|
Перезагружаем Nginx, проверяем статус
1
2
| $ sudo systemctl restart nginx
$ sudo systemctl status nginx
|
Редактируем Systemd Unit Alertmanager
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| $ sudo nano /etc/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager Service
After=network.target prometheus.service
[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 \
--web.external-url=http://localhost:19093 \
--web.route-prefix=/ \
$ALERTMANAGER_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
Restart=always
[Install]
WantedBy=multi-user.target
|
Перезапускаем сервис
1
2
3
| $ sudo systemctl daemon-reload
$ sudo systemctl restart alertmanager
$ sudo systemctl status alertmanager
|
Генерируем пароль для авторизации
1
2
3
4
| $ sudo htpasswd -c /etc/nginx/alertmanager.htpasswd myalertuser
New password: passwor
Re-type new password: password
Adding password for user myalertuser
|
Открываем порт 19093
1
2
3
| $ sudo firewall-cmd --add-port=19093/tcp --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
|
Настройка SELinux
1
2
3
4
5
6
7
| $ cd /tmp
$ sudo grep nginx /var/log/audit/audit.log | grep denied | audit2allow -m nginxlocalconf > nginxlocalconf.te
$ sudo grep nginx /var/log/audit/audit.log | grep denied | audit2allow -M nginxlocalconf
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i nginxlocalconf.pp
$ sudo semodule -i nginxlocalconf.pp
|
Интеграция с Prometheus
Создаем каталог, где будут лежать правила
1
| $ sudo mkdir /etc/prometheus/rules.d/
|
Создадим файлы с правилами оповещения для Prometheus
1
| $ sudo nano /etc/prometheus/rules.d/alert.rules.yml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| groups:
- name: Instance.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'
- name: Endpoint.rules
rules:
- alert: EndpointDown
expr: probe_success == 0
for: 10s
labels:
severity: critical
annotations:
summary: 'Endpoint { {$labels.instance} } down'
|
Фигурные скобки { {
и } }
следует писать без пробела между ними. Движок сайта некорректно их обрабатывает.
1
| $ sudo nano /etc/prometheus/rules.d/system.rules.yml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| groups:
# Диск забит
- name: Disk-usage
rules:
- alert: 'Low data disk space'
expr: ceil(((node_filesystem_size_bytes{mountpoint!="/boot"} - node_filesystem_free_bytes{mountpoint!="/boot"}) / node_filesystem_size_bytes{mountpoint!="/boot"} * 100)) > 95
labels:
severity: "critical"
annotations:
title: "Disk Usage"
description: 'Partition : { {$labels.mountpoint} }'
summary: "Disk usage is { {humanize $value} }% "
host: " { {$labels.instance} } "
# Память забита
- name: Memory-usage
rules:
- alert: 'High memory usage'
expr: ceil((((node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / node_memory_MemTotal_bytes) * 100)) > 80
labels:
severity: "critical"
annotations:
title: "Memory Usage"
description: 'Memory usage threshold set to 80%.'
summary: "Memory usage is { {humanize $value} }%"
host: "{ {$labels.instance} }"
# Процессор загружен
- name: CPU-Hight-Load
rules:
- alert: HighSystemLoad
expr: systemload_average > 90
for: 5s
labels:
severity: "critical"
annotations:
title: "Memory Usage"
summary: "High system load: { {$value | printf \"%.2f\"} }%"
host: "{ {$labels.instance} }"
|
Фигурные скобки { {
и } }
следует писать без пробела между ними. Движок сайта некорректно их обрабатывает.
1
| $ sudo nano /etc/prometheus/rules.d/services.rules.yml
|
1
2
3
4
5
6
7
8
9
| groups:
- name: services.rules
rules:
- alert: services
expr: node_systemd_unit_state{state="active"} == 0
for: 1s
annotations:
summary: "Instance { {$labels.instance} } is down"
description: "{ {$labels.instance} } of job { {$labels.job} } is down."
|
Фигурные скобки { {
и } }
следует писать без пробела между ними. Движок сайта некорректно их обрабатывает.
Добавляем список правил в Prometheus
1
| $ sudo nano /etc/prometheus/prometheus.yml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| global:
scrape_interval: 15s
evaluation_interval: 15s
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
rule_files:
# - "alert.rules.yml"
# - "system.rules.yml"
# - "web.rules.yml"
# - "services.rules.yml"
- "/etc/prometheus/rules.d/*.rules.yml"
scrape_configs:
...
|
Меняем права
1
| $ sudo chown -R prometheus. /etc/prometheus/
|
Проверяем правила на ошибки
1
2
3
| $ sudo /usr/local/bin/promtool check rules /etc/prometheus/alert.rules.yml
Checking /etc/prometheus/alert.rules.yml
SUCCESS: 1 rules found
|
Перезапускаем Prometheus
1
2
| $ sudo systemctl restart prometheus
$ sudo systemctl status prometheus
|
Создаем файл с настройками оповещений Alertmanager
1
| $ sudo nano /etc/alertmanager/alertmanager.yml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| global:
resolve_timeout: 5m
# smtp_smarthost: 'smtp.gmail.com:587'
# smtp_from: '[email protected]'
# smtp_auth_username: '[email protected]'
# smtp_auth_identity: '[email protected]'
# smtp_auth_password: 'passwd'
route:
group_by: [Alertname]
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
# default - send 'info' to email only
receiver: default
receivers:
- name: default
email_configs:
- to: [email protected]
send_resolved: true
from: [email protected]
smarthost: smtp.gmail.com:587
auth_username: "[email protected]"
auth_identity: "[email protected]"
auth_password: "passwd"
|
Перезапускаем Alertmanager
1
2
| $ sudo systemctl restart alertmanager
$ sudo systemctl status alertmanager
|
AlertManager с smtp работает только по портам 25, 587
Продолжение настройки Node Exporter
Что бы можно было мониторить запущенные сервисы, редактируем Systemd Unit для Node Exporter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| $ sudo nano /etc/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.systemd \
--collector.systemd.unit-whitelist="(sshd|chronyd|nginx).service" \
--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/) \
--web.config=/opt/node_exporter/web.yml
[Install]
WantedBy=multi-user.target
|
Перезапускаем сервис
1
2
| $ sudo systemctl daemon-reload
$ sudo systemctl restart node_exporter
|