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


Tal vez pueda interesarte


Compartí este artículo