Introdução: Por que o monitoramento é crítico para aplicações Node.js
Aplicações web modernas em JavaScript (Node.js) operam sob alta carga e arquiteturas distribuídas. Mesmo o código perfeitamente escrito pode falhar devido a vazamentos de memória, queda de desempenho ou erros em operações assíncronas. O monitoramento de aplicações JavaScript permite não apenas detectar o problema, mas também preveni-lo antes que afete os usuários.
Neste artigo, vamos analisar quais métricas devem ser monitoradas, como configurar a coleta de dados usando ferramentas populares (Prometheus, Grafana) e como organizar um sistema de alertas para Node.js. Todos os exemplos de código estão escritos em JavaScript e prontos para uso.
Métricas-chave para aplicações Node.js
O monitoramento de aplicações Node.js pode ser dividido em três níveis: infraestrutura, aplicação e métricas de negócio. Vamos analisar cada um deles.
Métricas de infraestrutura
Essas métricas mostram o estado do servidor e do ambiente de execução:
- CPU e Memory (RSS, Heap Total, Heap Used) — vazamentos de memória e alta carga do processador.
- Event Loop Lag — atraso no loop de eventos (se >50ms, a aplicação começa a ficar lenta).
- Garbage Collection (GC) — frequência e duração da coleta de lixo.
- File Descriptors — número de arquivos e sockets abertos.
Métricas da aplicação
Mostram como a aplicação processa as requisições:
- RPS (Requests Per Second) — número de requisições por segundo.
- Latency (p50, p95, p99) — atraso na resposta.
- Error Rate — percentual de erros (4xx, 5xx).
- Active Connections — número de conexões WebSocket/HTTP ativas.
Métricas de negócio
Específicas para sua aplicação:
- Número de usuários registrados.
- Velocidade de processamento de pagamentos.
- Tempo de resposta de APIs externas.
Coleta de métricas com Prometheus e Node.js
Prometheus é o padrão de facto para coleta de métricas na infraestrutura moderna. Para Node.js, existe a biblioteca prom-client, que permite exportar métricas facilmente.
Instalação e configuração do prom-client
npm install prom-client expressVamos criar um servidor básico com métricas:
const express = require('express');const client = require('prom-client');const app = express();
// Criando um registro de métricasconst register = new client.Registry();client.collectDefaultMetrics({ register });
// Criando um histograma personalizado para latênciasconst 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.5, 1, 2, 5]});register.registerMetric(httpRequestDuration);
// Middleware para medir latênciasapp.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();});
// Endpoint para métricasapp.get('/metrics', async (req, res) => { res.set('Content-Type', register.contentType); res.end(await register.metrics());});
app.get('/', (req, res) => { res.send('Hello World');});
app.listen(3000, () => console.log('Server running on port 3000'));Coleta de métricas do Event Loop
Para monitorar o loop de eventos, use process.hrtime() ou a biblioteca event-loop-lag:
const eventLoopLag = new client.Gauge({ name: 'nodejs_event_loop_lag_seconds', help: 'Event loop lag in seconds'});register.re