Monitoreo de aplicaciones PHP: métricas y alertas de la A a la Z
\n\nEn el desarrollo web moderno, la estabilidad y el rendimiento de una aplicación no son solo un deseo, sino un requisito crítico. PHP, a pesar de su madurez, requiere una atención cuidadosa al monitoreo. Sin él, corres el riesgo de enterarte de la caída del sitio por parte de los usuarios, y no por el sistema de alertas. En este artículo, analizaremos cómo construir un sistema completo de monitoreo para aplicaciones PHP: desde la recopilación de métricas clave hasta la configuración de alertas que salvarán tu proyecto de tiempos de inactividad.
\n\n¿Por qué monitorear PHP? Métricas clave
\n\nEl monitoreo permite responder a tres preguntas principales: "¿Está funcionando la aplicación?", "¿Qué tan rápido funciona?" y "¿Está sucediendo algo anómalo?". Para las aplicaciones PHP, los siguientes grupos de métricas son críticamente importantes:
\n\n- \n
- Métricas de disponibilidad (Uptime): Verificar que el servidor web y PHP-FPM respondan a las solicitudes. La forma más simple es un endpoint de health check. \n
- Métricas de rendimiento: Tiempo de ejecución de la solicitud (Response Time), capacidad de procesamiento (Requests per Second), tiempo de respuesta de la base de datos y APIs externas. \n
- Métricas de recursos: Consumo de memoria (Memory Usage), carga de CPU, número de procesos activos de PHP-FPM. \n
- Métricas de errores: Número de errores HTTP (5xx, 4xx), excepciones (Exceptions), errores fatales y advertencias (warnings). \n
- Métricas de negocio: Velocidad de finalización de pedidos, número de registros: todo lo que es importante para tu negocio. \n
Estas métricas se pueden recopilar de diferentes maneras: desde un simple registro en archivo hasta el uso de sistemas avanzados de observabilidad, como Prometheus + Grafana o soluciones comerciales (Datadog, New Relic).
\n\nRecopilación de métricas: de lo simple a lo complejo
\n\nEmpecemos con un enfoque básico: crear un health check simple y recopilar métricas en formato Prometheus.
\n\n1. Endpoint de Health Check
\nCrea un endpoint simple que verifique la conexión a la base de datos y la caché:
\n\n<?php\n// health.php\n$checks = [\n 'database' => false,\n 'redis' => false,\n 'status' => 'unhealthy'\n];\n\ntry {\n new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');\n $checks['database'] = true;\n} catch (PDOException $e) {\n // Registramos el error\n}\n\nif ($checks['database'] && $checks['redis']) {\n $checks['status'] = 'healthy';\n http_response_code(200);\n} else {\n http_response_code(503);\n}\n\nheader('Content-Type: application/json');\necho json_encode($checks);\n\n\n2. Recopilación de métricas para Prometheus
\nPrometheus es un sistema popular de recopilación de métricas. Tu aplicación debe exponer los datos en formato /metrics. Ejemplo de un exportador simple:
<?php\n// metrics.php\nheader('Content-Type: text/plain; version=0.0.4');\n\n$metrics = [];\n\n// Contador de solicitudes\n$metrics[] = '# HELP http_requests_total Total number of HTTP requests.';\n$metrics[] = '# TYPE http_requests_total counter';\n$metrics[] = 'http_requests_total{method="GET",route="/home"} 1024';\n\n// Histograma de tiempo de respuesta\n$metrics[] = '# HELP http_request_duration_seconds Request duration in seconds.';\n$metrics[] = '# TYPE http_request_duration_seconds histogram';\n$metrics[] = 'http_request_duration_seconds_bucket{le="0.1"} 500';\n$metrics[] = 'http_request_duration_seconds_bucket{le="0.5"} 800';\n$metrics[] = 'http_request_duration_seconds_bucket{le="+Inf"} 1024';\n\n// Métricas de PHP (memoria, tiempo)\n$metrics[] = '# HELP php_memory_bytes Current memory usage.';\n$metrics[] = '# TYPE php_memory_bytes gauge';\n$metrics[] = 'php_memory_bytes ' . memory_get_usage(true);\n\necho implode("\\n", $metrics) . "\\n";\n\n\nConfiguración de alertas: cuándo y cómo notificar
\n\nLas métricas sin alertas son solo números. Las alertas deben configurarse basándose en umbrales (thresholds). Reglas principales:
\n<