Monitoramento de aplicações JavaScript: métricas e alertas do A ao Z
\n\nNo mundo moderno do desenvolvimento, não basta apenas escrever código funcional. É fundamental entender como sua aplicação se comporta em ambiente de produção. O monitoramento de aplicações JavaScript (especialmente em Node.js) não é apenas uma tendência, mas uma necessidade. Ele permite identificar gargalos, prevenir falhas e garantir alta disponibilidade dos serviços. Neste artigo, abordaremos o ciclo completo: desde a coleta de métricas essenciais até a configuração de alertas, utilizando um conjunto moderno de ferramentas.
\n\nPor que o monitoramento de Node.js é importante?
\nAplicações Node.js frequentemente operam de forma assíncrona, processando milhares de requisições por segundo. Sem monitoramento, você corre o risco de:
\n- \n
- Perder um vazamento de memória (memory leak), que pode derrubar o servidor. \n
- Não perceber o aumento no tempo de resposta (latência), prejudicando a experiência do usuário. \n
- Perder dados devido a erros não tratados. \n
Um sistema de monitoramento oferece visibilidade (observabilidade) e permite tomar decisões baseadas em dados, não em suposições.
\n\nMétricas essenciais para aplicações JavaScript
\nTodas as métricas podem ser divididas em três grupos: infraestruturais, métricas de negócio e métricas da aplicação. Vamos detalhá-las.
\n\n1. Métricas de infraestrutura (método USE)
\nSão indicadores básicos de saúde do servidor: CPU, memória, disco, rede. Para Node.js, a memória (heap, non-heap) e o número de descritores de arquivo abertos são especialmente importantes.
\n\n2. Métricas da aplicação (método RED)
\nO método RED (Rate, Errors, Duration) é o padrão ouro para microsserviços:
\n- \n
- Taxa (Rate): número de requisições por segundo (RPS). \n
- Erros (Errors): percentual de requisições que resultaram em erro (4xx, 5xx). \n
- Duração (Duration): tempo de execução da requisição (percentis p50, p95, p99). \n
3. Métricas de negócio
\nEspecíficas do seu produto: número de usuários registrados, pedidos concluídos, sessões ativas, etc.
\n\nColeta de métricas com Prometheus e Node.js
\nPrometheus é o padrão de facto para coleta de métricas. Para Node.js, usamos a biblioteca prom-client. Veja um exemplo de configuração.
Instalação e configuração básica
\nnpm install prom-client express\n\nCriaremos um servidor com o endpoint /metrics:
const express = require('express');\nconst client = require('prom-client');\n\nconst app = express();\nconst port = 3000;\n\n// Criando um registro de métricas\nconst register = new client.Registry();\n\n// Adicionando métricas padrão do Node.js\nclient.collectDefaultMetrics({ register });\n\n// Criando um histograma personalizado para tempo de resposta\nconst httpRequestDuration = new client.Histogram({\n name: 'http_request_duration_seconds',\n help: 'Duração das requisições HTTP em segundos',\n labelNames: ['method', 'route', 'status'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5]\n});\nregister.registerMetric(httpRequestDuration);\n\n// Middleware para medir o tempo\napp.use((req, res, next) => {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n end({ method: req.method, route: req.route?.path || 'unknown', status: res.statusCode });\n });\n next();\n});\n\n// Endpoint para métricas\napp.get('/metrics', async (req, res) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\napp.get('/', (req, res) => {\n res.send('Olá, monitoramento!');\n});\n\napp.listen(port, () => {\n console.log(`Aplicação ouvindo em http://localhost:${port}`);\n});\n\nContadores personalizados
\nVamos adicionar um contador de erros:
\nconst errorCounter = new client.Counter({\n name: 'app_errors_total',