Monitoramento de aplicações JavaScript: métricas e alertas do A ao Z

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Monitoramento de aplicações JavaScript: métricas e alertas do A ao Z

\n\n

No 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\n

Por que o monitoramento de Node.js é importante?

\n

Aplicaçõ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
\n

Um sistema de monitoramento oferece visibilidade (observabilidade) e permite tomar decisões baseadas em dados, não em suposições.

\n\n

Métricas essenciais para aplicações JavaScript

\n

Todas 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\n

1. Métricas de infraestrutura (método USE)

\n

Sã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\n

2. Métricas da aplicação (método RED)

\n

O 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
\n\n

3. Métricas de negócio

\n

Específicas do seu produto: número de usuários registrados, pedidos concluídos, sessões ativas, etc.

\n\n

Coleta de métricas com Prometheus e Node.js

\n

Prometheus é o padrão de facto para coleta de métricas. Para Node.js, usamos a biblioteca prom-client. Veja um exemplo de configuração.

\n\n

Instalação e configuração básica

\n
npm install prom-client express
\n\n

Criaremos um servidor com o endpoint /metrics:

\n
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\n

Contadores personalizados

\n

Vamos adicionar um contador de erros:

\n
const errorCounter = new client.Counter({\n    name: 'app_errors_total',                

Blogs

Book Recommendations