Prometheus: node_exporter – мониторинг supervisord

By | 10/25/2018
 

Задача – мониторить статус supervisor и его задач.

Используем node_exporter и его supervisord коллектор.

Настройка supervisor

Настраиваем сам supervisor – в конфиге /etc/supervisor/supervisord.conf, добавляем [inet_http_server]:

...
[inet_http_server]
port = 127.0.0.1:9001
...

Перезапускаем supervisor:

root@bttrm-stage-console:/home/admin# systemctl restart supervisor

Проверяем статус:

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
...

Настройка node_exporter

Проверяем node_exporter – запускаем пока вручную.

Указываем ему --collector.supervisord и URL – --collector.supervisord.url="http://localhost:9001/RPC2":

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"

ОК, работает.

Теперь добавим 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-а:

root@bttrm-stage-console:/home/admin# systemctl restart prometheus-client

Проверяем метрики:

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
...

И на самом 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-ти минут – плохо, создаём алерт.

Проверяем алерты – стопаем задачу:

root@bttrm-stage-console:~# supervisorctl stop yoga_vimeo
yoga_vimeo: stopped

И получаем алерты в Slack:

В целом – на этом всё.