Monitoramento de aplicações JavaScript: métricas e alertas (nível avançado)
As aplicações JavaScript modernas em Node.js estão se tornando cada vez mais complexas: microsserviços, arquiteturas orientadas a eventos, sistemas em tempo real. O monitoramento simples "vivo/morto" já não fornece uma visão completa. Para garantir estabilidade e alto desempenho, é necessária uma abordagem avançada: coleta de métricas de negócios, análise de latência, configuração de alertas inteligentes e observabilidade. Neste artigo, vamos explorar como construir um sistema de monitoramento de nível avançado usando Node.js, Prometheus e Grafana.
1. Métricas-chave para aplicações Node.js
O monitoramento começa com a escolha correta das métricas. Para ambientes de produção, três grupos são críticos:
- Métricas RED (Rate, Errors, Duration) — frequência de requisições, número de erros, tempo de resposta.
- Métricas USE (Utilization, Saturation, Errors) — carga da CPU, uso de memória, número de descritores de arquivo abertos.
- Métricas de negócio — número de usuários ativos, tamanho da fila de tarefas, velocidade de processamento de eventos.
Exemplo de coleta de métricas usando a biblioteca prom-client:
const client = require('prom-client');const httpRequestDuration = new client.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route', 'status_code'], buckets: [0.1, 0.3, 0.5, 1, 3, 5]});
app.use((req, res, next) => { const end = httpRequestDuration.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.route?.path || 'unknown', status_code: res.statusCode }); }); next();});Também é essencial monitorar o garbage collection (GC) e o event loop lag — isso ajuda a identificar problemas de desempenho antes que se tornem críticos.
2. Configuração de alertas: do simples ao inteligente
Alertas não são apenas notificações de queda do servidor. Em um nível avançado, os alertas devem ser:
- Contextuais — considerar horário do dia, dia da semana, ciclos de negócios.
- Em múltiplos níveis — Warning, Critical, Pager.
- Preditivos — baseados em tendências (ex.: aumento de latência em 20% em 15 minutos).
Exemplo de regra para o Prometheus Alertmanager usando previsão:
groups: - name: nodejs_alerts rules: - alert: HighErrorRate expr: rate(http_requests_errors_total[5m]) / rate(http_requests_total[5m]) > 0.05 for: 2m labels: severity: critical annotations: summary: "Alta porcentagem de erros ({{ $value | humanizePercentage }})" description: "Mais de 5% das requisições retornam erros nos últimos 2 minutos."
- alert: MemoryLeak expr: predict_linear(nodejs_heap_bytes_used{space="total"}[30m], 3600) > 1e9 for: 5m labels: severity: warning annotations: summary: "Vazamento de memória previsto" description: "O uso do heap pode exceder 1GB em uma hora."É importante configurar a deduplicação e o agrupamento de alertas para não sobrecarregar o engenheiro de plantão com centenas de mensagens semelhantes. Use group_wait e group_interval na configuração do Alertmanager.
3. Logging avançado: logs estruturados e rastreamento
O console.log padrão não é adequado para produção. Use logging estruturado com as bibliotecas pino ou winston no formato JSON. Isso facilita a análise de logs e a integração com sistemas de agregação (ELK, Loki).
Exemplo de configuração do pino:
const pino = require('pino');const logger = pino({ level: process.env.LOG_LEVEL ||