Introdução: Por que o monitoramento é crítico para aplicações TypeScript
\nTypeScript é uma ferramenta poderosa para criar aplicações web escaláveis, mas mesmo o código da mais alta qualidade não está imune a falhas em produção. Sem um sistema de monitoramento, você corre o risco de descobrir problemas através dos usuários, e não de alertas automáticos. Neste artigo, abordaremos o ciclo completo de configuração de monitoramento: desde a coleta de métricas até o envio de notificações.
\nAbordaremos os três pilares fundamentais da observability: métricas (indicadores numéricos do sistema), logs (registros detalhados de eventos) e tracing (rastreamento de requisições). Daremos atenção especial à integração com ferramentas populares — Prometheus, Grafana e Sentry.
\n\n1. Métricas principais para aplicações TypeScript
\nAntes de configurar alertas, é necessário definir quais métricas são críticas para sua aplicação. Vamos dividi-las em três grupos:
\n\n1.1 Métricas de negócio
\nRefletem a saúde da aplicação do ponto de vista do usuário:
\n- \n
- Número de requisições por segundo (RPS) — mostra a carga no servidor \n
- Tempo de resposta (latência) — percentis p50, p95, p99 \n
- Número de erros — status 4xx e 5xx \n
- Usuários ativos — sessões, conexões WebSocket \n
1.2 Métricas técnicas
\nMostram o estado da infraestrutura:
\n- \n
- CPU e Memória — uso do processador e vazamentos de memória \n
- Event Loop Lag — atrasos no loop de eventos do Node.js \n
- Garbage Collection — frequência e duração da coleta de lixo \n
- HTTP connection pool — número de conexões abertas \n
1.3 Exemplo: coleta de métricas com Prometheus em TypeScript
\nInstale a biblioteca prom-client para Node.js:
npm install prom-client @types/prom-client\n\nCrie o arquivo metrics.ts:
import client from 'prom-client';\nimport express, { Request, Response } from 'express';\n\n// Cria um registro de métricas\nconst register = new client.Registry();\nclient.collectDefaultMetrics({ register });\n\n// Métrica personalizada: número de requisições HTTP\nconst httpRequestCounter = new client.Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'route', 'status_code'],\n registers: [register],\n});\n\n// Histograma de tempo de resposta\nconst httpRequestDuration = new client.Histogram({\n name: 'http_request_duration_seconds',\n help: 'Duration of HTTP requests in seconds',\n labelNames: ['method', 'route', 'status_code'],\n buckets: [0.1, 0.5, 1, 2, 5],\n registers: [register],\n});\n\n// Middleware para coleta de métricas\nexport function metricsMiddleware(req: Request, res: Response, next: Function) {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n const labels = {\n method: req.method,\n route: req.route?.path || 'unknown',\n status_code: res.statusCode.toString(),\n };\n httpRequestCounter.inc(labels);\n end(labels);\n });\n next();\n}\n\n// Endpoint para o Prometheus\nexport function metricsEndpoint(req: Request, res: Response) {\n res.set('Content-Type', register.contentType);\n res.send(register.metrics());\n}\n\n2. Configuração de alertas: da teoria à prática
\nOs alertas devem ser inteligentes — muitos falsos positivos cansam a equipe. Use a regra dos "três sigmas" para anomalias e valores limite para métricas críticas.
\n\n2.1 Regras de alertas no Prometheus
\nCrie o arquivo alerts.yml:
groups:\n - name: typescript-app\n rules:\n - alert: HighErrorRate\n expr: |\n rate(http_requests_total{status_code=~"5.."}[5m]) \n / \n rate(http_requests_total[5m]) > 0.05\n for: 2m\n labels:\n severity: critical\n annotations:\n