Задача — мониторить статус supervisor и его задач.
Используем node_exporter и его supervisord коллектор.
Содержание
Настройка supervisor
Настраиваем сам supervisor — в конфиге /etc/supervisor/supervisord.conf, добавляем [inet_http_server]:
... [inet_http_server] port = 127.0.0.1:9001 ...
Перезапускаем supervisor:
[simterm]
root@bttrm-stage-console:/home/admin# systemctl restart supervisor
[/simterm]
Проверяем статус:
[simterm]
root@bttrm-stage-console:/home/admin# supervisorctl status projectname_daily_statistic_processing STARTING projectname_itunes_purchases:projectname_itunes_purchases_00 RUNNING pid 2323, uptime 0:00:27 projectname_itunes_purchases:projectname_itunes_purchases_01 RUNNING pid 2324, uptime 0:00:27 ...
[/simterm]
Настройка node_exporter
Проверяем node_exporter — запускаем пока вручную.
Указываем ему --collector.supervisord и URL — --collector.supervisord.url="http://localhost:9001/RPC2":
[simterm]
root@bttrm-stage-console:/home/admin# docker run -ti prom/node-exporter --collector.supervisord --collector.supervisord.url="http://localhost:9001/RPC2" INFO[0000] Starting node_exporter (version=0.16.0, branch=HEAD, revision=d42bd70f4363dced6b77d8fc311ea57b63387e4f) source="node_exporter.go:82" INFO[0000] Build context (go=go1.9.6, user=root@a67a9bc13a69, date=20180515-15:52:42) source="node_exporter.go:83" INFO[0000] Enabled collectors: source="node_exporter.go:90" INFO[0000] - arp source="node_exporter.go:97" ... INFO[0000] - supervisord source="node_exporter.go:97" INFO[0000] - textfile source="node_exporter.go:97" INFO[0000] - time source="node_exporter.go:97" INFO[0000] - timex source="node_exporter.go:97" INFO[0000] - uname source="node_exporter.go:97" INFO[0000] - vmstat source="node_exporter.go:97" INFO[0000] - wifi source="node_exporter.go:97" INFO[0000] - xfs source="node_exporter.go:97" INFO[0000] - zfs source="node_exporter.go:97" INFO[0000] Listening on :9100 source="node_exporter.go:111"
[/simterm]
ОК, работает.
Теперь добавим supervisor коллектор в Compose файл, из которого у нас запускаются все експортеры:
...
node-exporter:
image: prom/node-exporter
network_mode: "host"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- --collector.filesystem.ignored-mount-points
- "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)"
- --collector.supervisord
- '--collector.supervisord.url=http://localhost:9001/RPC2'
...
Перезапускаем systemd-сервис Prometheus-а:
[simterm]
root@bttrm-stage-console:/home/admin# systemctl restart prometheus-client
[/simterm]
Проверяем метрики:
[simterm]
root@bttrm-stage-console:/home/admin# curl -s localhost:9100/metrics | grep supervisor | head
node_scrape_collector_duration_seconds{collector="supervisord"} 1.6048184669999999
node_scrape_collector_success{collector="supervisord"} 1
# HELP node_supervisord_exit_status Process Exit Status
# TYPE node_supervisord_exit_status gauge
node_supervisord_exit_status{group="projectname_daily_statistic_processing",name="projectname_daily_statistic_processing"} 0
node_supervisord_exit_status{group="projectname_itunes_purchases",name="projectname_itunes_purchases_00"} 0
...
[/simterm]
И на самом Prometheus-сервере:
alert.rules
Для алертинга можно использовать либо node_supervisord_up, которая возвращает 1 или 0 для каждой запущенной задачи, либо node_supervisord_state, которая выводит более расширенное состояние задачи — 10, 20, 30 и т.д. Подробнее статусы описаны тут>>>.
Я пока для пробы добавил два алерта:
...
- alert: ServiceSupervisorTaskDown
expr: avg_over_time(node_supervisord_up[5m]) == 0
for: 5m
labels:
severity: info
annotations:
summary: "Supervisor task is down!"
description: "App Env: {% raw %}{{$labels.env}}{% endraw %}\nHost: {% raw %}{{$labels.host}}{% endraw %}\n Task name: {% raw %}{{$labels.name}}{% endraw %} returned value was {% raw %}{{ $value }}{% endraw %}!"
- alert: ServiceSupervisorTaskStateError
expr: node_supervisord_state != 20 != 10
for: 10m
labels:
severity: info
annotations:
summary: "Supervisor task state errored!"
description: "App Env: {% raw %}{{$labels.env}}{% endraw %}\nHost: {% raw %}{{$labels.host}}{% endraw %}\n Task name: {% raw %}{{$labels.name}}{% endraw %} returned code was {% raw %}{{ $value }}{% endraw %}!"
Во втором алерте проверяем код состояния задачи — 10 и 20 для нас ОК, всё остальное в течении 10-ти минут — плохо, создаём алерт.
Проверяем алерты — стопаем задачу:
[simterm]
root@bttrm-stage-console:~# supervisorctl stop yoga_vimeo yoga_vimeo: stopped
[/simterm]
И получаем алерты в Slack:
В целом — на этом всё.

