Начали у нас на бекенде размножаться процессы.
Причина сейчас не важна, интересно другое: захотелось собирать метрики по общему количеству процессов на хостах, но, внезапно – 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!" ...
Деплоим, проверяем снова:
Готово.