Monitoramento Avançado de Aplicações TypeScript: Métricas e Alertas
\nNo desenvolvimento moderno, o monitoramento foi além da simples verificação "o servidor está vivo?". Para aplicações TypeScript que operam em ambientes distribuídos complexos, é necessário um sistema avançado de observabilidade. Não basta apenas registrar erros — é preciso coletar métricas personalizadas de desempenho, configurar alertas inteligentes e construir dashboards para análise preditiva. Neste artigo, veremos como implementar um monitoramento profissional de aplicações TypeScript usando ferramentas modernas e melhores práticas.
\n\n1. Coleta de Métricas Personalizadas de Desempenho
\nMétricas básicas (CPU, memória) muitas vezes não fornecem uma visão completa. Para aplicações TypeScript, métricas de negócio e métricas de tempo de execução são criticamente importantes. Vejamos a configuração da coleta de métricas personalizadas usando a biblioteca prom-client (cliente Prometheus para Node.js).
Tipos de Métricas Personalizadas
\n- \n
- Counter (contador) — para contar eventos (requisições, erros). \n
- Gauge (medidor) — para valores que podem aumentar e diminuir (número de conexões ativas). \n
- Histogram (histograma) — para distribuição de valores (tempo de resposta). \n
- Summary (resumo) — para quantis de tempo de execução. \n
Exemplo: Registro de Métricas Personalizadas em TypeScript
\nimport client from 'prom-client';\nimport express, { Request, Response } from 'express';\n\n// Criando um registro de métricas\nconst register = new client.Registry();\nclient.collectDefaultMetrics({ register });\n\n// Contador personalizado de erros\nconst errorCounter = new client.Counter({\n name: 'app_errors_total',\n help: 'Total number of application errors',\n labelNames: ['type', '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'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5],\n registers: [register],\n});\n\n// Gauge de usuários ativos\nconst activeUsers = new client.Gauge({\n name: 'active_users_count',\n help: 'Number of currently active users',\n labelNames: ['user_type'],\n registers: [register],\n});\n\nconst app = express();\n\n// Middleware para medir o tempo das requisições\napp.use((req: Request, res: Response, next) => {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n end({ method: req.method, route: req.path, status: res.statusCode });\n });\n next();\n});\n\n// Endpoint para métricas\napp.get('/metrics', async (req: Request, res: Response) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\n// Simulação de erro\napp.get('/error', (req: Request, res: Response) => {\n errorCounter.inc({ type: 'validation', code: '400' });\n res.status(400).send('Bad Request');\n});\n\napp.listen(3000, () => console.log('Server on port 3000'));\n\n2. Integração com Prometheus e Grafana
\nAs métricas coletadas precisam ser exportadas e visualizadas. O Prometheus consultará nosso endpoint /metrics, e o Grafana exibirá os dados em dashboards.
Configuração do Prometheus para Aplicação TypeScript
\n# prometheus.yml\nglobal:\n scrape_interval: 15s\nscrape_configs:\n - job_name: 'typescript-app'\n static_configs:\n - targets: ['localhost:3000']\n metrics_path: '/metrics'\n # Adicionando rótulos de ambiente\n relabel_configs:\n - source_labels: [__address__]\n target_label: instance\n regex: '([^:]+):.*'\n replacement: '${1}'\n\nConsultas Avançadas PromQL para Análise
\n- \n
rate(app_errors_total[5m])— taxa de erros nos últimos 5 minutos. \nhistogram_quantile(0.95, rate(http_request_durati\n