Частота отправки активных алертов из Alertmanager определяется параметром repeat_interval
в файле /etc/alertmanager/config.yml
.
У нас этот интервал задан в 15 минут, в результате чего в Slack каждые 15 минут приходят уведомления обо всех активных алертах в системе.
Но некоторые алерты это такие себе “known issue”, когда о проблеме мы знаем, девелоперы её взяли в работу для фикса – а вот алерты продолжают приходить.
Что бы отключить повторную отправку таких алертов – их можно пометить как “silenced“.
Включается Silence алерта через Web UI самого Alertmanager, см. документацию.
Собственно, что будем делать:
- обновим аргументы запуска Alertmanager, что бы настроить доступ к веб-интерфейсу
- обновим виртуалхост NGINX, что бы получить доступ к Alertmanager
- проверим и настроим работу Prometheus для отправки алертов
- добавим алерт, и посмотрим, как его добавить в silenced
Содержание
Настройка Alertmanager Web UI
У нас Alertmanager запускается из Docker Compose, добавляем в command
два параметра – web.route-prefix
, который указывает URI, по которому будет доступен Alertmanager Web UI, и web.external-url
, который указывает на URL.
Полностью путь будет выглядеть как dev.monitor.example.com/alertmanager – добавляем их:
... alertmanager: image: prom/alertmanager:v0.21.0 networks: - prometheus ports: - 9093:9093 volumes: - /etc/prometheus/alertmanager_config.yml:/etc/alertmanager/config.yml command: - '--config.file=/etc/alertmanager/config.yml' - '--web.route-prefix=/alertmanager' - '--web.external-url=https://dev.monitor.example.com/alertmanager' ...
Alertmanager работает в Docker-контейнере, и доступен с хоста по адресу localhost:9093:
[simterm]
root@monitoring-dev:/home/admin# docker ps | grep alert 24ae3babd644 prom/alertmanager:v0.21.0 "/bin/alertmanager -…" 3 seconds ago Up 1 second 0.0.0.0:9093->9093/tcp prometheus_alertmanager_1
[/simterm]
В файле настроек NGINX добавляем новый upstream
, в котором указываем Docker-контейнер с Alertmanager:
... upstream alertmanager { server 127.0.0.1:9093; } ...
Там же добавляем location
, который будет проксировать все запросы на dev.monitor.example.com/alertmanager к этому апстриму:
... location /alertmanager { proxy_redirect off; 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_pass http://alertmanager$request_uri; } ...
Сохраняем, и перезапускаем NGINX и Alertmanager.
Открываем https://dev.monitor.example.com/alertmanager, и попадаем в веб-интерфейс:
Тут пока пусто – ждём, пока в Prometheus сработают алерты.
Prometheus: “Error sending alert” err=”bad response status 404 Not Found”
Сейчас в логах Prometheus при попытке им отправить алерты в Alertmanager будет ошибка:
caller=notifier.go:527 component=notifier alertmanager=http://alertmanager:9093/api/v1/alerts count=3 msg=”Error sending alert” err=”bad response status 404 Not Found”
Возникает она вполне логично, так как в настройках Prometheus Alertmanager задан как:
... alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093 ...
Что бы добавить URI, по которому у нас теперь доступен Alertmanager – используем path_prefix
:
... alerting: alertmanagers: - path_prefix: "/alertmanager/" static_configs: - targets: - alertmanager:9093 ...
Перезапускаем Prometheus, и ещё раз ждём алерты:
И они же появляются в UI самого Alertmanager:
Alertmanager: Silence алертов
Теперь отключим повторную отправку алертов.
Например, что бы отключить все алерты alertname=”APIendpointProbeSuccessCritical” – кликаем на +
:
Затем Silence:
Лейбл alertname
добавляется в условие, задаём период, по-умолчанию два часа, добавляем кто создал silence и описание:
Жмём Create – готово:
И можно проверить через API:
[simterm]
root@monitoring-dev:/home/admin# curl -s http://localhost:9093/alertmanager/api/v1/alerts | jq '.data[1]' { "labels": { "alertname": "APIendpointProbeSuccessCritical", "instance": "http://push.example.com", "job": "blackbox", "monitor": "monitoring-dev", "severity": "critical" }, "annotations": { "description": "Cant access API endpoint http://push.example.com!", "summary": "API endpoint down!" }, "startsAt": "2020-12-30T11:25:25.953289015Z", "endsAt": "2020-12-30T11:43:25.953289015Z", "generatorURL": "https://dev.monitor.example.com/prometheus/graph?g0.expr=probe_success%7Binstance%21%3D%22https%3A%2F%2Fokta.example.com%22%2Cjob%3D%22blackbox%22%7D+%21%3D+1&g0.tab=1", "status": { "state": "suppressed", "silencedBy": [ "ec11c989-f66e-448e-837c-d788c1db8aa4" ], "inhibitedBy": null }, "receivers": [ "critical" ], "fingerprint": "01e79a8dd541cf69" }
[/simterm]
Алерт в Slack отправляться не будет:
[simterm]
... "status": { "state": "suppressed", "silencedBy": [ "ec11c989-f66e-448e-837c-d788c1db8aa4" ], ...
[/simterm]
Готово.