Introducción: ¿Por qué el monitoreo básico no es suficiente?
El monitoreo básico de aplicaciones PHP (verificación "vivo/muerto" y carga de CPU) deja de funcionar bajo cargas altas. Cuando tu aplicación procesa miles de solicitudes por segundo, las métricas estándar no muestran los cuellos de botella: consultas lentas a la base de datos, fugas de memoria en procesos largos o picos repentinos de latencia.
En este artículo veremos el nivel avanzado de monitoreo: recopilación de métricas de negocio, perfilado en tiempo real, configuración de alertas basadas en percentiles e integración con stacks modernos de observabilidad (Prometheus + Grafana). Aprenderás a implementar herramientas que te permitirán no solo ver que la aplicación "se cayó", sino también predecir problemas antes de que ocurran.
1. Métricas avanzadas: de códigos HTTP a indicadores de negocio
Los contadores estándar (número de solicitudes, estados 200/500) son el mínimo. Para un análisis profundo, necesitas recopilar:
- Latencia: p50, p95, p99 del tiempo de respuesta. Las anomalías en p99 indican "valores atípicos" en el funcionamiento.
- Consumo de memoria: no solo el valor máximo, sino también la tasa de crecimiento dentro de una misma solicitud.
- Tiempo de ejecución de llamadas externas: Redis, MySQL, RabbitMQ — cada servicio debe tener su propia métrica.
- Métricas de negocio: número de pedidos realizados, errores de validación, velocidad de las colas.
Ejemplo de recopilación de métricas usando promphp/prometheus_client_php:
use Prometheus\\CollectorRegistry;use Prometheus\\RenderTextFormat;use Prometheus\\Storage\\InMemory;
$registry = new CollectorRegistry(new InMemory());
// Histograma para el tiempo de ejecución de la solicitud$histogram = $registry->registerHistogram( 'app', 'request_duration_seconds', 'Duración de solicitud HTTP', ['method', 'endpoint'], [0.1, 0.5, 1.0, 2.0, 5.0]);
// Contador de eventos de negocio$counter = $registry->registerCounter( 'business', 'orders_total', 'Total de pedidos creados', ['status'] // success/failed);
// En el middleware medimos el tiempo$start = microtime(true);// ... ejecución de la solicitud ...$duration = microtime(true) - $start;$histogram->observe($duration, ['GET', '/api/orders']);2. Health Checks y Deep Probing: verificación de dependencias
Un endpoint simple de ping no verifica la disponibilidad de la base de datos, la caché o las colas. Crea un health check integral que simule solicitudes reales:
// health.php$checks = [ 'database' => function () { $db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); $db->query('SELECT 1'); return true; }, 'redis' => function () { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->ping(); return true; }, 'queue' => function () { // Verificamos que RabbitMQ no esté desbordado $channel = new AMQPChannel(new AMQPConnection()); $queue = new AMQPQueue($channel); return $queue->declareQueue() !== false; }];
$results = [];$healthy = true;foreach ($checks as $name => $check) { try { $check(); $results[$name] = 'ok'; } catch (\\Throwable $e) { $results[$name] = 'falló: ' . $e->getMessage(); $healthy = false; }}
header('Content-Type: application/json');http_response_code($healthy ? 200 : 503);echo json_encode(['status' => $healthy ? 'saludable' : 'no saludable', 'checks' => $results]);Este endpoint se puede conectar a las sondas liveness/readiness de Kubernetes o a un monitoreo externo (por ejemplo, UptimeRobot), que verificará no solo la disponibilidad, sino también el correcto funcionamiento de todas las dependencias.
3. Alertas basadas en percentiles y anomalías
Las alertas sobre el "tiempo de respuesta promedio" a menudo pasan por alto