Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


Prometheus часть 6 оповещения


Prometheus часть 6 оповещения
 
В продолжение к статье:
http://snakeproject.ru/rubric/article.php?art=prometheus_5_11072024
 
На самом деле уже ранее писал статью-пример алертменеджера + гуглпочта:
http://snakeproject.ru/rubric/article.php?art=alertmanager_27032024
 
Теория
 
В prometheus - правила-условия, при которыхм сработывает алерт и методы его оповещения - разделены
Правила алертинга указываются в prometheus с помощью alert_rules на языке promql
Доставкой оповещений уже занимается компонент - alertmanager
 
 
Напишем алерт
 
Знакомая нам метрика, возвращающая 1, когда сервис доступен:
# ./promtool query instant http://localhost:9090/ "up{}"
up{instance="localhost:9090", job="prometheus"} => 1 @[111.111]
 
Логично, что 0 - недоступен:
# ./promtool query instant http://localhost:9090/ "up{} == 0"
 
prometheus.yml, подключим файл с правилами:
...
rule_files:
  - "alerts.yml"
...
 
alerts.yml:
groups:
- name: Instances
  interval: 15s
  rules:
  - alert: InstanceDown
    expr: up{job="prometheus"} == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }}, job {{ $labels.job }}, down for 1 minute"
 
Выше:
name - имя группы, должно быть уникальным
interval - интервал выполнения правил алертинга 
Если interval группы не задан, будет использован глобальный параметр evaluation_interval
for - если метрика совпала, то ждать указанное время
- Если за указанное время запрос продолжит возвращать тоже значение, prometheus отправит инфу в alertmanager
expr - собственно само выражение условия (в примере метрика up)
labels - теги, благодаря им - alertmanager может рассылать сообщения в различные каналы и группы
Annotations - расширенный текст для alertmanager
В labels и annotations возможно использовать go-templating для подстановки переменных:
- summary (заголовок алерта), в котором обращаемся к тегу instance и добавляем его в текст
- desctiption (описание алерта), в котором обращаемся к тегу instance и job
go-templating позволяет например работать операторами - условия {{ if }} и перебора тегов {{ range }}
 
Созданный алерт изначально неактивен (inactive)
С интервалом времени prometheus выполняет указанный запрос
Если придет метрика, попавшая под условие - алерт станет pending в течение времени, указанного в for
Пока алерт в состоянии pending, prometheus продолжает выполнять запрос с заданным интервалом, проверяя метрику
Если значение не изменилось, то по окончании времени, указанного в for - алерт переходит в статус firing
В статусе firing начинает отправляться информация в alertmanager, который оповещает заданные направления-каналы
 
Вывести текущие алерты метрикой ALERTS:
# ./promtool query instant http://localhost:9090/ "ALERTS{}"
ALERTS{alertname="InstanceDown", alertstate="firing", instance="localhost:9090", job="prometheus", severity="critical"} => 1 @[111.111]
 
 
Тестирование правил
 
Создайте файл с описанием тестов
 
prometheus.yml:
...
rule_files:
    - alerts.yml
 
tests:
  - input_series:
      - series: up{job="prometheus"}
        values: 0
 
    alert_rule_test:
      - eval_time: 1m
        alertname: InstanceDown
        exp_alerts: []
 
      - eval_time: 2m
        alertname: InstanceDown
        exp_alerts:
          - exp_labels:
              alertname: InstanceDown
              job: prometheus
 
Тест состоит из свойства input_series и случаев alert_rule_test
 
Первый тест имитирует ожидание в течение 1 минуты (аналог свойства for правила оповещения) и не ожидает никаких оповещений (exp_alerts: [])
Второй тест ожидает 2 минуты, затем ожидает один экземпляр оповещения с двумя метками: alertname: InstanceDown и job: prometheus
 
Проверка тестов:
# promtool test rules alerts.yml
 
 
Типовые алерты ОС - DISK, CPU, RAM, NET
 
Место на диске < 20%:
  - alert: HostOutOfDiskSpace
    expr: (node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes < 20 and ON (instance, device, mountpoint) node_filesystem_readonly == 0
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: Host out of disk space (instance {{ $labels.instance }})
      description: "Free disk space < 20% left\n VALUE = {{ $value }}\n  LABELS = {{ $labels }}"
 
Загрузка CPU > 50%:
  - alert: HostHighCpuLoad
    expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 50
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: Host high CPU load (instance {{ $labels.instance }})
      description: "CPU load over > 50%\n VALUE = {{ $value }}\n  LABELS = {{ $labels }}"
 
 
Cвободная память < 50%:
  - alert: HostOutOfMemory
    expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 50
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: Host out of memory (instance {{ $labels.instance }})
      description: "Memory load over > 50%\n VALUE = {{ $value }}\n  LABELS = {{ $labels }}"
 
Загрузка сети > 100 MB/s:
  - alert: HostUnusualNetworkThroughputIn
    expr: sum by (instance) (rate(node_network_receive_bytes_total[2m])) / 1024 / 1024 > 100
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: Host with increased network activity in (instance {{ $labels.instance }})
      description: "Host network i-faces load over > 100 MB/s\n VALUE = {{ $value }}\n  LABELS = {{ $labels }}"
  
А вообще зачем что-то писать, если все написано до нас, используйте готовые алерты:
https://samber.github.io/awesome-prometheus-alerts/
 
 
Настройка alertmanager
 
Настало время научиться отправлять оповещения на сработавшие правила
 
Установка и запуск:
# wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
# tar zxf alertmanager-0.22.2.linux-amd64.tar.gz && mv alertmanager-0.22.2.linux-amd64 alertmanager
# /alertmanager/alertmanager
 
Так-же можно стартовать через systemd или docker
 
/etc/systemd/system/alertmanager.service:
[Unit]
Description=Alertmanager Service
After=network.target
 
[Service]
Type=simple
ExecStart=/usr/local/bin/alertmanager/alertmanager \
          --config.file=/usr/local/bin/alertmanager/alertmanager.yml
 
[Install]
WantedBy=multi-user.target
 
Включим, запустим:
# systemctl daemon-reload
# systemctl enable alertmanager
# service alertmanager restart
# service alertmanager status
 
Основные возможности
 
Grouping - Группировка
Пример, упал сервер, на котором было несколько экспортеров и сработало множество алертов
Группировка позволяет сгруппировать алерты в одну группу и отправить их единственным оповещением
 
Inhibition - Замедление
Пример, упал сервер, на котором было несколько экспортеров и сработало множество алертов
Замедление позволяет не отправлять группу, а лишь один, отправить упала БД, не отправляем алерт о недоступности web
 
Silences - Молчание
Приостановка отправки алертов на определенное время
 
High Availability - Высокая доступность
Кластерный режим для высой доступности с выборами главного алертменеджера
 
Оф. документация:
https://prometheus.io/docs/alerting/latest/configuration/
 
Пример alertmanager.yml:
route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'web.hook'
  routes:
  - receiver: 'crit'
    group_wait: 10s
    matchers:
    - severity="critical"
  - receiver: 'warn'
    group_wait: 60s
    matchers:
    - severity=~"info|warning"
  - receiver: 'email'
    group_wait: 60s
    matchers:
    - severity="custom"
 
receivers:
  - name: 'web.hook'
    webhook_configs:
    - url: 'http://127.0.0.1:9087/alert/111222333444'
  - name: 'crit'
    pagerduty_configs:
    - routing_key: 'test'
      service_key: 'md5-hash'
  - name: 'warn'
    slack_configs:
    - api_url: 'https://hooks.slack.com/services/TOKEN'
      channel: '#warnings'
  - name: 'email'
    email_configs:
    - send_resolved: true
      to: 'user_name@gmail.com'
      from: 'user_name@gmail.com'
      smarthost: smtp.gmail.com:587
      auth_username: 'user_name@gmail.com'
      auth_identity: 'user_name@gmail.com'
      auth_password: 'user_name_password'
 
inhibit_rules:
  - source_matchers:
    - severity="critical"
    target_matchers:
    - severity=~"info|warning"
    equal: ['instance']
 
Проверьте конфигурацию и роутинг:
# ./amtool check-config alertmanager.yml
# ./amtool config routes --config.file alertmanager.yml
# ./amtool config routes test severity="critical" --config.file alertmanager.yml
# ./amtool config routes test severity=~"warning" --config.file alertmanager.yml
# ./amtool config routes test severity=~"info" --config.file alertmanager.yml
 
Выше:
3 базовые секции - route, receivers и inhibit_rules
Можно дополнительно указать:
global - параметры
templates - шаблоны отправляемых сообщений
mute_time_intervals - интервалы, когда алерты отправляться не будут
 
Процесс на примере конфы выше
 
Алерт изначально попадает в alertmanager в маршруты - секция route, где определяется, что с ним делать
Маршруты читаются сверху - вниз начиная с корневого маршрута, у которого нет условий - параметр matchers
Сработает только в случае, если ни один из других маршрутов не совпал по условиям
В прмиере выше - корневой маршрут будет использовать получателя - receiver с названием web.hook
 
Т.е., когда пришел алерт:
alertmanager ищет для него подходящий маршрут по условиям (matchers) в маршрутах (route)
Когда маршрут определен, alertmanager группирует все пришедшие алерты по правилу group_by за интервал времени group_wait
После истечения group_wait интервала, alertmanager передает алерты на отправку нужному получателю (receiver)
В receiver указывается каким образом и куда следует отправить алерт
 
Если алерт совпадет с условием маршрута - тег severity="critical", то уведомление пойдет получателю с названием crit
 
Если алерт совпадет с условием маршрута - тег severity=~"warning|info", то уведомление пойдет получателю с названием warn
Возможно помимо regexp выше использование операторов != не равно и !~ - не равно regexp
 
Если алерт совпадет с условием маршрута - тег severity="custom", то уведомление пойдет получателю с названием email
В примере почта на гугле
 
Когда алерт с одним и тем же условием нужно отправить множеству получателей - используйте флаг continue: true
https://prometheus.io/docs/alerting/latest/configuration/#route
 
Правила группировки алертов - group_by - в данном случае используется имя алерта, возможно указать любой другой лейбл
Если группировка не нужна - укажите group_by: [...], группировка оповещения произойдет по всем доступным лейблам
 
group_wait - время ожидания alertmanager первый раз при получении алерта до момента его отправки
Нужно, чтоб prometheus успел отправить все новые алерты и они успешно сгруппировались
 
group_interval - интервал, спустя который отправятся уведомления о новых алертах, которые были добавлены в группу после ее отправки
 
repeat_interval - интервал, спустя который пойдет напоминание об алерте, если он еще не перешел в состояние resolved
 
Методы доставки сообщений выше - web.hook, crit, warn, email
Обратите внимание, что каждый метод уведомлений имеет свои определенные параметры
 
Блок - inhibit_rules позволяет не отправлять какие-либо алерты, если другие алерты уже присутствуют
В примере выше логика - есть критикал алерт по инстансу, варнинг уже не нужен:
- Если уже существует алерт (source_matchers) с тегом severity="critical"
- Приходит новый алерт (target_matchers) с тегом severity=~"info|warning"
- У данных алертов совпадают теги instance
- Тогда новый алерт отправлен не будет
 
Связка в prometheus.yml:
...
# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - localhost:9093
...
 
Отправка оповещений в telegram
 
Необходимо отправить webhook к api телеграмма
 
Создайте нового бота через бота @BotFather, команда /newbot
Указываем любое имя, пример my_t1000 и ник (должен заканчиваться на bot) пример - my_t1000_bot
В ответ получите ключ доступа к боту с помощью api, кторый используйте в $TOKEN
Найдите бота через поиск по нику - my_t1000_bot и отправьте ему сообщение:
- Команда start
- Напишите что угодно, в ответ ничего не ответят, зато узнаете chat_id
 
Или узнать chat_id можно так, где - $TOKEN необходимо подставить ваш token:
# curl -s https://api.telegram.org/bot$TOKEN/getUpdates | jq .
...
"chat": {
          "id": 111222333444,
...
 
Проверьте отправку сообщений указав $TOKEN и chat_id:
# curl -s 'https://api.telegram.org/bot$TOKEN/sendMessage?chat_id=111222333444&text=HelloWorld!'
 
Чтоб изменить текст сообщения от alertmanager воспользуемся prometheus_bot
Утилита будет принимать алерт от alertmanager и отправлять его в телеграм
 
Установка:
# apt install golang-go
# mkdir /opt/prometheus_bot
# export GOPATH=/opt/prometheus_bot
# go get github.com/inCaller/prometheus_bot
# cd /opt/prometheus_bot/
# cat config.yaml
telegram_token: "$TOKEN"
split_msg_byte: 4000
send_only: true
# ./bin/prometheus_bot
 
Смоделируем падение "несуществующей ноды"
 
alerts.yml:
groups:
- name: instances
  interval: 10s
  rules:
  - alert: InstanceDown
    expr: up == 0
    labels:
      severity: fire
    annotations:
      summary: Test instance down
 
prometheus.yml:
global:
  scrape_interval:     15s
  evaluation_interval: 15s
 
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - localhost:9093
 
rule_files:
  - "alerts.yml"
 
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'test'
    static_configs:
    - targets: ['localhost:1234']
 
Проверка, запуск:
# /usr/local/bin/prometheus/promtool check config /usr/local/bin/prometheus/prometheus.yml
# service prometheus restart
# service prometheus status
 

Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.
Весь материал на сайте носит ознакомительный характер,
за его использование другими людьми, автор ответственности не несет.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект