Prometheus: получить общее количество процессов на сервере и process-exporter

Автор: | 09/09/2019

Начали у нас на бекенде размножаться процессы.

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

Деплоим, проверяем снова:

Готово.