Начали у нас на бекенде размножаться процессы.
Причина сейчас не важна, интересно другое: захотелось собирать метрики по общему количеству процессов на хостах, но, внезапно — node-exporter такого не умеет: у него есть только метрики node_procs_running и node_procs_blocked, а хочется видеть количество процессов и в Sleep, и в Zombie.
Используем вместо него process-exporter.
Запускаем для проверки вручную:
[simterm]
root@bttrm-dev-console:/home/admin# docker run --rm -p 9256:9256 --privileged -v /proc:/host/proc ncabatoff/process-exporter --procfs /host/proc ... Status: Downloaded newer image for ncabatoff/process-exporter:latest 2019/09/09 12:56:55 Reading metrics from /host/proc for procnames: []
[/simterm]
Проверяем метрики:
[simterm]
admin@bttrm-dev-console:~$ curl -s localhost:9256/metrics
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 1.4938e-05
go_gc_duration_seconds{quantile="0.25"} 1.6973e-05
go_gc_duration_seconds{quantile="0.5"} 1.9837e-05
go_gc_duration_seconds{quantile="0.75"} 5.3428e-05
go_gc_duration_seconds{quantile="1"} 0.00019463
go_gc_duration_seconds_sum 0.000299806
go_gc_duration_seconds_count 5
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 7
...
[/simterm]
Окей — в целом метрики идут, но нет тех, что нам нужны, а нужны нам РНР — значит используем селектор.
Создаём конфиг:
process_names:
- comm:
- php
Запускаем:
[simterm]
root@bttrm-dev-console:/home/admin# docker run --rm -p 9256:9256 --privileged -v /proc:/host/proc -v `pwd`/process-exporter.yml:/config/process-exporter.yml ncabatoff/process-exporter --procfs /host/proc -config.path /config/process-exporter.yml 2019/09/09 13:04:36 Reading metrics from /host/proc based on "/config/process-exporter.yml"
[/simterm]
Проверяем:
[simterm]
admin@bttrm-dev-console:~$ curl -s localhost:9256/metrics | grep namedprocess_namegroup_num_procs
# HELP namedprocess_namegroup_num_procs number of processes in this group
# TYPE namedprocess_namegroup_num_procs gauge
namedprocess_namegroup_num_procs{groupname="php"} 8
[/simterm]
Вот и оно.
Отлично.
Хотя — а почему тут по нулям?
[simterm]
...
# HELP namedprocess_namegroup_states Number of processes in states Running, Sleeping, Waiting, Zombie, or Other
# TYPE namedprocess_namegroup_states gauge
namedprocess_namegroup_states{groupname="php",state="Other"} 0
namedprocess_namegroup_states{groupname="php",state="Running"} 0
namedprocess_namegroup_states{groupname="php",state="Sleeping"} 8
namedprocess_namegroup_states{groupname="php",state="Waiting"} 0
namedprocess_namegroup_states{groupname="php",state="Zombie"} 0
...
[/simterm]
А, не, всё OK — 8 в Sleep:
namedprocess_namegroup_states{groupname=»php»,state=»Sleeping»} 8
Осталось добавить его в Ansible.
Создаём шаблон конфига — roles/prometheus-client/templates/process-exporter.yml.j2, используя {%raw%}...{% endraw %}:
process_names:
- name: "{% raw %}{{.Comm}}{% endraw %}"
comm:
- php
В roles/prometheus-client/tasks/main.yml добавляем его копирование на сервера:
...
- name: "Copy process-exporter config file"
template:
src: "templates/process-exporter.yml.j2"
dest: "{{ prometheus_client_home }}/process-exporter.yml"
...
В Docker Compose файл, который запускает все експортеры — добавляем новый экспортер и монтирование каталога /proc и файла настроек:
...
process_exporter:
privileged: true
image: ncabatoff/process-exporter
volumes:
- /opt/prometheus-client/process-exporter.yml:/config/process-exporter.yml
- /proc:/host/proc
command:
- '-config.path=/config/process-exporter.yml'
- '--procfs=/host/proc'
ports:
- 9256:9256
...
Добавляем сбор метрик с этого експортёра в самом Prometheus, roles/prometheus-client/templates/prometheus-app-client-conf.yml.j2:
...
- job_name: 'process_exporter'
static_configs:
- targets:
- 'localhost:9256'
...
Деплоим, проверяем:
[simterm]
root@bttrm-stage-console:/opt/prometheus-client# curl -s localhost:9256/metrics | grep namedprocess_namegroup_num_procs | grep -v \#
namedprocess_namegroup_num_procs{groupname="php"} 152
[/simterm]
Отлично.
И в самом Prometheus:
Готово.
Осталось добавить алерты, например в Ansible-шаблоне тестовый алерт будет может так:
...
- name: ProcessExplorer.rules
rules:
- alert: PHPProcessesTotalInfo
expr: namedprocess_namegroup_num_procs > 1
for: 1s
labels:
severity: info
annotations:
summary: 'PHP processes number alert!'
description: "App host: {% raw %}{{ $labels.host }}{% endraw %}\nProcesses count: {% raw %}{{ $value | humanize }}{% endraw %} during last 10 minutes!"
...
Деплоим, проверяем снова:
Готово.

