Biblioteca prom-client: Monitoramento de aplicações Node.js com Prometheus
No desenvolvimento web moderno, o monitoramento de desempenho e estado das aplicações tornou-se uma necessidade. Uma das soluções mais populares para coleta e análise de métricas é o Prometheus — um sistema de código aberto que coleta dados na forma de séries temporais. Para integração com Node.js, existe a biblioteca oficial prom-client, que permite exportar métricas facilmente em um formato compreensível para o Prometheus.
Neste artigo, vamos detalhar como instalar e usar o prom-client, quais tipos de métricas estão disponíveis e como integrá-las com o framework web Express.
Instalação e configuração
Para começar, instale a biblioteca via npm:
npm install prom-clientApós a instalação, importe-a para sua aplicação:
const prometheus = require('prom-client');const express = require('express');const app = express();Principais tipos de métricas
A biblioteca prom-client suporta quatro tipos principais de métricas do Prometheus:
- Counter — um contador que só aumenta (por exemplo, número de requisições).
- Gauge — um valor que pode tanto aumentar quanto diminuir (por exemplo, número de conexões ativas).
- Histogram — um histograma que mede a distribuição de valores (por exemplo, tempo de resposta).
- Summary — uma estatística resumida, semelhante ao Histogram, mas com quantis mais precisos.
Exemplo: Counter (contador de requisições)
Vamos criar um contador para rastrear o número total de requisições HTTP:
const httpRequestsTotal = new prometheus.Counter({ name: 'http_requests_total', help: 'Total number of HTTP requests', labelNames: ['method', 'route', 'status']});
// Middleware para contar requisiçõesapp.use((req, res, next) => { res.on('finish', () => { httpRequestsTotal.inc({ method: req.method, route: req.path, status: res.statusCode }); }); next();});Exemplo: Gauge (conexões ativas)
O Gauge é útil para rastrear o estado atual, como o número de usuários ativos:
const activeUsers = new prometheus.Gauge({ name: 'active_users', help: 'Number of active users'});
app.get('/login', (req, res) => { activeUsers.inc(); // Aumenta ao fazer login res.send('Logged in');});
app.get('/logout', (req, res) => { activeUsers.dec(); // Diminui ao fazer logout res.send('Logged out');});Exemplo: Histogram (tempo de resposta)
O Histogram permite medir quanto tempo leva para processar requisições:
const httpRequestDuration = new prometheus.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route'], buckets: [0.1, 0.5, 1, 2, 5] // Limites dos buckets em segundos});
app.use((req, res, next) => { const end = httpRequestDuration.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.path }); }); next();});Exportando métricas para o Prometheus
Para que o Prometheus possa coletar dados, é necessário criar um endpoint (geralmente /metrics) que retorna todas as métricas registradas:
app.get('/metrics', async (req, res) => { res.set('Content-Type', prometheus.register.contentType); res.end(await prometheus.register.metrics());});
app.listen(3000, () => { console.log('Server running on port 3000');});Métricas personalizadas com labels
Você pode adicionar labels (rótulos) para uma filtragem mais detalhada. Por exemplo, vamos dividir as métricas por versões da API:
const apiCalls = new prometheus.Counte Também na biblioteca
Event Bus e padrão Observer em Rust: implementação de arquitetura orientada a eventos
Quartz Scheduler para Java: guia completo com exemplos práticos
Trabalhando com Excel em JavaScript (Node.js): bibliotecas e exemplos
Geração Swagger/OpenAPI para Swift: ferramentas e bibliotecas