Métricas Prometheus em TypeScript: guia completo
\n\nPrometheus é um sistema de código aberto para monitoramento e alertas que coleta métricas de suas aplicações em tempo real. Neste artigo, veremos como integrar métricas Prometheus em aplicações TypeScript usando a biblioteca prom-client. Você aprenderá a criar, registrar e exportar métricas, além de configurar um endpoint para coleta de dados.
O que são métricas Prometheus?
\n\nPrometheus funciona com base no modelo pull: ele periodicamente consulta (scrape) os endpoints da sua aplicação para obter métricas. As métricas são divididas em vários tipos principais:
\n\n- \n
- Counter (contador) — apenas aumenta (ex.: número de requisições). \n
- Gauge (medidor) — pode aumentar e diminuir (ex.: número atual de usuários ativos). \n
- Histogram (histograma) — mede a distribuição de valores (ex.: tempo de resposta). \n
- Summary (resumo) — semelhante ao histograma, mas calcula quantis no lado do cliente. \n
Instalação do prom-client em TypeScript
\n\nPara trabalhar com Prometheus em TypeScript, usaremos a biblioteca oficial prom-client. Instale-a via npm:
npm install prom-client\n\nInstale também os tipos para TypeScript:
\n\nnpm install @types/prom-client --save-dev\n\nCriação e registro de métricas
\n\nVamos considerar um exemplo básico de criação de métricas. Crie um arquivo metrics.ts:
import client from 'prom-client';\n\n// Cria um registro para as métricas (por padrão, usa-se o global)\nconst register = new client.Registry();\n\n// Adiciona métricas padrão (ex.: memória, CPU)\nclient.collectDefaultMetrics({ register });\n\n// Cria um Counter para contagem de requisições\nconst httpRequestsTotal = new client.Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'status', 'path'],\n registers: [register],\n});\n\n// Cria um Gauge para conexões ativas\nconst activeConnections = new client.Gauge({\n name: 'active_connections',\n help: 'Number of active connections',\n registers: [register],\n});\n\n// Cria um Histogram para 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', 'path'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 5],\n registers: [register],\n});\n\nexport { register, httpRequestsTotal, activeConnections, httpRequestDuration };\n\nUsando métricas em uma aplicação Express
\n\nAgora, crie uma aplicação Express simples em TypeScript que usará nossas métricas:
\n\nimport express from 'express';\nimport { register, httpRequestsTotal, activeConnections, httpRequestDuration } from './metrics';\n\nconst app = express();\nconst port = 3000;\n\n// Middleware para contagem do tempo de requisição\napp.use((req, res, next) => {\n const end = httpRequestDuration.startTimer({ method: req.method, path: req.path });\n activeConnections.inc();\n\n res.on('finish', () => {\n httpRequestsTotal.inc({ method: req.method, status: res.statusCode.toString(), path: req.path });\n activeConnections.dec();\n end();\n });\n\n next();\n});\n\n// Endpoint para o Prometheus\napp.get('/metrics', async (req, res) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\n// Exemplo de endpoint\napp.get('/', (req, res) => {\n res.send('Hello, Prometheus!');\n});\n\napp.listen(port, () => {\n console.log(`Server running at http://localhost:${port}`);\n});\n\nExecução e verificação
\n\nExecute a aplicação:
\n\nnpx ts-node app.ts\n\nAbra no
Também na biblioteca
Internacionalização (i18n) em C# (.NET): guia completo
Aprendizado de Máquina em Rust: visão geral das bibliotecas para ML e Data Science
Crossbeam para Rust: guia completo com exemplos práticos
Trabalhando com S3 e armazenamentos em nuvem em Kotlin: AWS SDK e MinIO
Configuração de aplicativos Swift: biblioteca SwiftyConfig