Начали у нас на бекенде размножаться процессы.
Причина сейчас не важна, интересно другое: захотелось собирать метрики по общему количеству процессов на хостах, но, внезапно — node-exporter
такого не умеет: у него есть только метрики node_procs_running
и node_procs_blocked
, а хочется видеть количество процессов и в Sleep, и в Zombie.
Используем вместо него process-exporter
.
Запускаем для проверки вручную:
Проверяем метрики:
Окей — в целом метрики идут, но нет тех, что нам нужны, а нужны нам РНР — значит используем селектор.
Создаём конфиг:
process_names: - comm: - php
Запускаем:
Проверяем:
Вот и оно.
Отлично.
Хотя — а почему тут по нулям?
А, не, всё 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' ...
Деплоим, проверяем:
Отлично.
И в самом 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!" ...
Деплоим, проверяем снова:
Готово.