Навигация
|
Prometheus часть 6 оповещенияPrometheus часть 6 оповещения
В продолжение к статье:
На самом деле уже ранее писал статью-пример алертменеджера + гуглпочта:
Теория
В 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 }}"
А вообще зачем что-то писать, если все написано до нас, используйте готовые алерты:
Настройка 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 - Высокая доступность
Кластерный режим для высой доступности с выборами главного алертменеджера
Оф. документация:
Пример 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
Правила группировки алертов - 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
Комментарии пользователей Эту новость ещё не комментировалиНаписать комментарий Анонимам нельзя оставоять комментарии, зарегистрируйтесь! |
Контакты Группа ВК | Код обмена баннерами | Видео к IT статьям на YoutubeВидео на другие темы Смотреть | |||
Мои друзья: | © Snakeproject.ru создан в 2013 году.При копировании материала с сайта - оставьте ссылку.Весь материал на сайте носит ознакомительный характер,за его использование другими людьми, автор ответственности не несет. |
||||
Поддержать автора и проект
|