Introdução: Por que o monitoramento básico não é suficiente?
O monitoramento básico de aplicações PHP (verificação "vivo/morto" e carga da CPU) deixa de funcionar sob altas cargas. Quando sua aplicação processa milhares de requisições por segundo, as métricas padrão não mostram os gargalos: consultas lentas ao banco de dados, vazamentos de memória em processos longos ou picos repentinos de latência.
Neste artigo, abordaremos o nível avançado de monitoramento: coleta de métricas de negócio, profiling em tempo real, configuração de alertas baseados em percentis e integração com stacks modernas de observabilidade (Prometheus + Grafana). Você aprenderá a implementar ferramentas que permitirão não apenas ver que a aplicação "caiu", mas também prever problemas antes que eles ocorram.
1. Métricas avançadas: de códigos HTTP a indicadores de negócio
Contadores padrão (número de requisições, status 200/500) são o mínimo. Para uma análise aprofundada, é necessário coletar:
- Latência: p50, p95, p99 do tempo de resposta. Anomalias no p99 indicam "picos" na operação.
- Consumo de memória: não apenas o valor de pico, mas também a taxa de crescimento dentro de uma única requisição.
- Tempo de execução de chamadas externas: Redis, MySQL, RabbitMQ — cada serviço deve ter sua própria métrica.
- Métricas de negócio: número de pedidos realizados, erros de validação, velocidade das filas.
Exemplo de coleta 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 o tempo de execução da requisição$histogram = $registry->registerHistogram( 'app', 'request_duration_seconds', 'Duração da requisição HTTP', ['method', 'endpoint'], [0.1, 0.5, 1.0, 2.0, 5.0]);
// Contador de eventos de negócio$counter = $registry->registerCounter( 'business', 'orders_total', 'Total de pedidos criados', ['status'] // success/failed);
// No middleware, medimos o tempo$start = microtime(true);// ... execução da requisição ...$duration = microtime(true) - $start;$histogram->observe($duration, ['GET', '/api/orders']);2. Health Checks e Deep Probing: verificação de dependências
Um endpoint simples de ping não verifica a disponibilidade do banco de dados, cache ou filas. Crie um health check abrangente que simule requisições reais:
// 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 se o RabbitMQ não está sobrecarregado $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] = 'falhou: ' . $e->getMessage(); $healthy = false; }}
header('Content-Type: application/json');http_response_code($healthy ? 200 : 503);echo json_encode(['status' => $healthy ? 'saudável' : 'não saudável', 'checks' => $results]);Esse endpoint pode ser conectado às sondas liveness/readiness do Kubernetes ou a um monitoramento externo (por exemplo, UptimeRobot), que verificará não apenas a disponibilidade, mas também a funcionalidade de todas as dependências.
3. Alertas baseados em percentis e anomalias
Alertas baseados no "tempo médio de resposta" frequentemente perdem