Пост

Установка Alertmanager с авторизацией и подключение к Prometheus в Centos 8

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
Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.