Este artículo explica cómo recolectar estadísticas de PHP-FPM con collectd, utilizando el plugin "curl_json", para obtener gráficas y alertas en Grafana.
El plugin de collectd curl_json
permite recolectar valores desde datos en formato JSON para ser parseados por libyajl. Al mismo tiempo, estos datos se obtiene utilizando curl
.
Utilizando este plugin es posible parsear la información obtenida en la salida de la página de estado del gestor de procesos FPM de PHP (FastCGI Process Manager).
Instalación de collectd
Para comenzar, instalar las dependencias necesarias para compilar collectd con soporte para el plugin "curl_json":
# apt-get install libcurl4-openssl-dev libyajl-dev
Luego configurar el paquete habilitando la opción --enable-curl_json
. Compilar e instalar collectd siguiendo las instrucciones del artículo Compilar y configurar collectd con InfluxDB en Debian y derivados.
Configurar collectd:
# cd /opt/collectd/etc/ # nano collectd.conf
Habilitar el plugin curl_json:
LoadPlugin curl_json
Luego configurar el acceso a las estadísticas de PHP-FPM a través de Nginx:
<Plugin curl_json> <URL "http://localhost/php-fpm-7.3--www?json"> Plugin "phpfpm" Instance "main" <Key "accepted conn"> Type "total_requests" Instance "accepted" </Key> <Key "slow requests"> Type "total_requests" Instance "slow" </Key> <Key "listen queue"> Type "queue_length" Instance "listen" </Key> <Key "active processes"> Type "vs_processes" Instance "active" </Key> <Key "total processes"> Type "vs_processes" Instance "total" </Key> </URL> </Plugin>
Ajustar la URL según corresponda. Es importante pasar el parámetro json
para que la salida de la página de estado de PHP-FPM sea en formato JSON y no en texto plano.
Configuración del pool de FPM
Editar la configuración del pool que se desee monitorear:
# nano /usr/local/etc/php-7.3/php-fpm.d/www.conf
Agregar la siguiente línea:
pm.status_path = /php-fpm-7.3--$pool
Esta línea define el alias de la página de estado para el pool. Notar que lleva el nombre del pool como parámetro.
Recargar la configuración de PHP-FPM:
# service php-fpm-7.3 reload
Configuración de Nginx
Si no existe, agregar un servidor Web de Nginx que escuche peticiones en localhost a través de HTTP plano en el puerto 80
:
# nano /usr/local/etc/nginx/nginx.conf
server { listen localhost:80; server_name localhost; server_tokens off; location = /php-fpm-7.3--www { fastcgi_pass php-fpm-7.3--www; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param REQUEST_URI $uri?$args; include fastcgi_params; } }
Ajustar el alias y nombre del upstream (parámetro fastcgi_pass
) según corresponda.
Finalmente, recargar la configuración de Nginx:
# service nginx reload
Luego verificar el correcto funcionamiento de la página de estado de PHP-FPM:
root@www:/usr/local/collectd/etc# curl http://localhost/php-fpm-7.3--www pool: www process manager: dynamic start time: 08/May/2019:11:48:23 -0300 start since: 93355 accepted conn: 33 listen queue: 0 max listen queue: 0 listen queue len: 0 idle processes: 2 active processes: 1 total processes: 3 max active processes: 1 max children reached: 0 slow requests: 0
Verificar también la salida en formato JSON:
root@www:/usr/local/collectd/etc# curl http://localhost/php-fpm-7.3--www?json && echo {"pool":"www","process manager":"dynamic","start time":1557326903,"start since":93616,"accepted conn":36,"listen queue":0,"max listen queue":0,"listen queue len":0,"idle processes":2,"active processes":1,"total processes":3,"max active processes":1,"max children reached":0,"slow requests":0}
Configuración de Grafana
Reiniciar collectd por última vez y crear un dashboard de Grafana.
La siguiente consulta InfluxQL permite graficar la cantidad de solicitudes aceptadas:
SELECT derivative(mean("value"), 10s) FROM "phpfpm_value" WHERE ("host" = 'www.linuxito.com' AND "instance" = 'main' AND "type" = 'total_requests' AND "type_instance" = 'accepted') AND $timeFilter GROUP BY time($__interval) fill(null)
Otros valores que se pueden graficar son solicitudes lentas, longitud d ela cola de espera, procesos activos y procesos totales. Para visualizar otras métricas, verificar la salida JSON de la página de estado de PHP-FPM.

Referencias
- Compilar y configurar collectd con InfluxDB en Debian y derivados
- FastCGI Process Manager (FPM) - Configuration
- Nginx – Enable PHP-FPM Status Page
- Plugin:cURL-JSON
- Plugin:cURL-JSON/phpfpm
- Plugin curl_json - collectd.conf
- collectd/php-fpm.conf