Задача — мониторить статус
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:
В целом — на этом всё.