Métricas Prometheus em TypeScript: guia completo de monitoramento

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

Métricas Prometheus em TypeScript: guia completo

\n\n

Prometheus é 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.

\n\n

O que são métricas Prometheus?

\n\n

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

Instalação do prom-client em TypeScript

\n\n

Para trabalhar com Prometheus em TypeScript, usaremos a biblioteca oficial prom-client. Instale-a via npm:

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

Instale também os tipos para TypeScript:

\n\n
npm install @types/prom-client --save-dev
\n\n

Criação e registro de métricas

\n\n

Vamos considerar um exemplo básico de criação de métricas. Crie um arquivo metrics.ts:

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

Usando métricas em uma aplicação Express

\n\n

Agora, crie uma aplicação Express simples em TypeScript que usará nossas métricas:

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

Execução e verificação

\n\n

Execute a aplicação:

\n\n
npx ts-node app.ts
\n\n

Abra no

Recommendations