Архив метки: monitoring

Prometheus. Сбор метрик php-fpm.

Подготовка к сборке метрик php-fpm делится на несколько этапов:
— редактирование конфиг пула;
— пробросить доступ к статусам PHP-FPM;
— запуск экспортера.

Настройка пула.
Настройки пула хранятся в файле www.conf. Хочу обратить ваше внимание, что файл может располагаться в разных места, например:
— /etc/php-fpm.d/www.conf
— /etc/php/7.3/fpm/pool.d/www.conf

Первым делом открываем к статистике, для этого нужно задать параметр pm.status_path. Раскомментируем строку с этим параметром:

# vim www.conf
...
pm.status_path = /status
...
ping.path = /ping
...

Задавать параметр ping.path необязательно.

Важно проверить проверить адрес, по которому принимаются запросы FastCGI, за это отвечает параметр listen:

# cat /etc/php-fpm.d/www.conf |grep -e 'listen =' 

listen = 127.0.0.1:9000

Адрес может быть в формате ip.address:port, либо ссылка на php-socket:

# cat /etc/php/7.3/fpm/pool.d/www.conf |grep -e 'listen ='
listen = /run/php/php7.3-fpm.sock

От значения параметра listen будет зависеть следующий пункт настройки.

Настройка Nginx.
Опустим основную настройку Nginx, в данном случаем нам нужно лишь пробросить страницу со статусами для экспортера.

для этого достаточно добавить в конфиг следующие строки:

location ~ ^/(status|ping)$ {
allow all;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
include fastcgi_params;
}

Если пул был настрое на сокет, то параметр fastcgi_pass будет иметь значение: fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
Важно отметить, если вы используете это на проде, то заменить параметр allow all; на необходимые адреса или подсети, а остальным запретить доступ параметром deny all;

В целом примерный конфиг будет выглядеть так:

server {
    server_name localhost;
    listen   9000; 

    location ~ ^/(status|ping)$ {
        allow 172.0.0.0/32;
        allow 127.0.0.1/32;
        deny all;
        fastcgi_pass 127.0.0.1:9000;
        #fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 16k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
        include fastcgi_params;
    }

}

Убедимся что все работает, открываем станицу или кидаем curl для проверки промежуточного результата:

Вывод curl на соответствующий адрес:

# curl localhost:9000/status
...
pool:                 www
process manager:      dynamic
start time:           12/Dec/2019:13:43:47 +0300
start since:          78
accepted conn:        4
listen queue:         0
max listen queue:     0
listen queue len:     128
idle processes:       4
active processes:     1
total processes:      5
max active processes: 1
max children reached: 0
slow requests:        0

Все работает, остался финальный этап.

Запуск экспортера.

Официальном сайт Prometheus предлагает php-fpm-exporter за авторством bakins, его и будем использовать.

Рассмотрим параметры запуска php-fpm-exporter:

# php-fpm-exporter --help

usage: php-fpm-exporter [<flags>]

Flags:
  -h, --help                   Show context-sensitive help (also try --help-long and --help-man).
      --addr="127.0.0.1:8080"  listen address for metrics handler
      --endpoint="http://127.0.0.1:9000/status"  
                               url for php-fpm status
      --fastcgi=FASTCGI        fastcgi url. If this is set, fastcgi will be used instead of HTTP
      --web.telemetry-path="/metrics"  
                               Path under which to expose metrics. Cannot be /

Нужно определиться как запускать эксопртер:
— в контейнере;
— локально запустить как процесс.

Для запуска в докер контейнере рекомендую пример от Флант.
При запуске контейнера пробрасываем порты с 8080 на нужный:

docker run -d -p 9000:8080 --name php-fpm-exporter php-fpm-exporter

Запуск как процесс более хлопотный.
Можно скачать уже готовый экспортер с репозитория bakins. Мы же пройдем весь путь сначала.

Первым делом клонируем репозиторий и собираем экспортер:
Для сборки потребуется пакет golang

# git clone https://github.com/bakins/php-fpm-exporter.git
# cd php-fpm-exporter
# ./script/build
...
+ NAME=php-fpm-exporter
+ ARCH=amd64
+ export GOFLAGS=-mod=vendor
+ GOFLAGS=-mod=vendor
+ export GO111MODULE=on
+ GO111MODULE=on
+ for OS in darwin linux
+ FILE=php-fpm-exporter.darwin.amd64
+ CGO_ENABLED=0
+ GOOS=darwin
+ GOARCH=amd64
+ go build -o php-fpm-exporter.darwin.amd64 ./cmd/php-fpm-exporter
++ openssl sha256 php-fpm-exporter.darwin.amd64
++ awk '{print $2}'
+ SHA=b9b5203821aa158221002abed322572a9d0a95df58d26cb35d74b7dc60d6d907
+ echo 'b9b5203821aa158221002abed322572a9d0a95df58d26cb35d74b7dc60d6d907 php-fpm-exporter.darwin.amd64'
+ for OS in darwin linux
+ FILE=php-fpm-exporter.linux.amd64
+ CGO_ENABLED=0
+ GOOS=linux
+ GOARCH=amd64
+ go build -o php-fpm-exporter.linux.amd64 ./cmd/php-fpm-exporter
++ openssl sha256 php-fpm-exporter.linux.amd64
++ awk '{print $2}'
+ SHA=e53c1392bb5ef2297b1b8487a75fa87c9c1f06c9f76d1da7b35523d94922a6d8
+ echo 'e53c1392bb5ef2297b1b8487a75fa87c9c1f06c9f76d1da7b35523d94922a6d8 php-fpm-exporter.linux.amd64'
...

Теперь запустим экспортер

# chmod +x php-fpm-exporter.linux.amd64
# cp php-fpm-exporter.linux.amd64 /usr/share/php-fpm-exporter
# php-fpm-exporter

Если во втором пункте при настройки страницы со статусом вы указали нестандартный порт(порт по умолчанию 9000), то при запуске экспортера задаем ключ —endpoint. Если вы хотите отрыть доступ к станице с метриками по нестандартному порту запускаем экспортер с ключем —addr:

# php-fpm-exporter --addr=192.168.122.10:10202 --endpoint http://localhost:10101/status > /dev/null &

После всех действий проверяем доступность метрик, заходим на страницу http://192.168.122.10:10202/metrics:

Вывод curl страницы с метриками:

# curl 192.168.122.10:10202/metrics
...
# HELP phpfpm_accepted_connections_total Total number of accepted connections
# TYPE phpfpm_accepted_connections_total counter
phpfpm_accepted_connections_total 12
# HELP phpfpm_active_max_processes Maximum active process count
# TYPE phpfpm_active_max_processes counter
phpfpm_active_max_processes 1
# HELP phpfpm_listen_queue_connections Number of connections that have been initiated but not yet accepted
# TYPE phpfpm_listen_queue_connections gauge
phpfpm_listen_queue_connections 0
# HELP phpfpm_listen_queue_length_connections The length of the socket queue, dictating maximum number of pending connections
# TYPE phpfpm_listen_queue_length_connections gauge
phpfpm_listen_queue_length_connections 0
# HELP phpfpm_listen_queue_max_connections Max number of connections the listen queue has reached since FPM start
# TYPE phpfpm_listen_queue_max_connections counter
phpfpm_listen_queue_max_connections 0
# HELP phpfpm_max_children_reached_total Number of times the process limit has been reached
# TYPE phpfpm_max_children_reached_total counter
phpfpm_max_children_reached_total 0
# HELP phpfpm_processes_total process count
# TYPE phpfpm_processes_total gauge
phpfpm_processes_total{state="active"} 1
phpfpm_processes_total{state="idle"} 1
# HELP phpfpm_scrape_failures_total Number of errors while scraping php_fpm
# TYPE phpfpm_scrape_failures_total counter
phpfpm_scrape_failures_total 0
# HELP phpfpm_slow_requests_total Number of requests that exceed request_slowlog_timeout
# TYPE phpfpm_slow_requests_total counter
phpfpm_slow_requests_total 0
# HELP phpfpm_up able to contact php-fpm
# TYPE phpfpm_up gauge
phpfpm_up 1

Возможные ошибки.

Если страница метрик отдает следующее содержание:

#curl 192.168.122.22:10202/metrics 
...
# HELP phpfpm_scrape_failures_total Number of errors while scraping php_fpm
# TYPE phpfpm_scrape_failures_total counter
phpfpm_scrape_failures_total 2
# HELP phpfpm_up able to contact php-fpm
# TYPE phpfpm_up gauge
phpfpm_up 0

Из вывода видно, что мы получили phpfpm_up 0, это значит, что экспортер не может получить статистику php-fpm со страницы, которую мы настраивали в Nginx.

Проверяем работу php-fpm, открывается ли localhost:9000/status. Если страница /status не на 9000, смотрим как запустить экспортер ссылкой на нужный адрес.

Полезные ссылки:
flant/php-fpm-exporter
bakins/php-fpm-exporter
Список рекомендуемых экспортеров

0

Скрипт уведомлений из zabbix в telegram

Создаем бота в telegram.

Для этого надо найти бота @BotFather и сказать ему «/start» и потом «/newbot». BotFather сначала спросит, как назвать нового бота, а следующим сообщением нужно ввести имя бота. В ответ BotFather пришлет token.

Читать далее

0