Coletando métricas de serviços com Prometheus
Após fazer a instalação da ferramenta Prometheus, desejo coletar métricas de minha aplicação web, para serem armazenadas em disco pela ferramenta Prometheus.
De uma maneira geral, tenho a seguinte configuração:
A ferramenta Prometheus é completa, ela já possui a interface gráfica web e grava os dados em disco. Ela também é responsável por fazer a coleta de métricas dos serviços que eu desejo fazer a coleta de métricas.
Configurando o serviço web
Afim de fazer um exemplo real (um caso concreto), vamos implementar um serviço em nodejs para que seja possível coletar métricas em tempo real. E assim ter uma ideia do estado atual da aplicação. Via dados de APM (application performance metrics).
Para implementar esta etapa vamos criar um novo serviço com o nodejs e adicionar algumas libs express
, morgan
, nodemon
e prometheus-api-metrics
.
Para não criar um projeto do zero, vou disponibilizar o código do serviço no github
Dentro do README.md
existe instruções para execução com nodejs, docker ou docker-compose.
Mas as partes relevantes do código estão aqui, este é o conteúdo do arquivo app.js
:
const express = require('express');
const logger = require('morgan');
const apiMetrics = require('prometheus-api-metrics');
const app = express();
app.use(express.json());
app.use(logger('dev'));
app.use(apiMetrics())
app.get('/', (req, res) => {
res.status(200).json({ msg: "Server up and running" })
});
module.exports = app;
Este serviço possui 2 endpoints um "/" que responde por padrão um json { msg: "Server up and running" }
e um segundo "/metrics" (que foi definido na linha app.use(apiMetrics())
.
Caso seja necessário personalizar a rota em que gostaria de disponibilizar as métricas basta passar um novo parâmetro na instânciação do serviço, da seguinte forma:
app.use(apiMetrics({metricsPath : '/status'}))
Agora as métricas serão exibidas na rota /status
Um exemplo da execução do serviço está abaixo:
Para testar o serviço basta acessar a rota http://localhost:3000 ele deve exibir a mensagem de erro padrão.
Ao acessar a rota /metrics deve ser exibido as métricas da aplicação, em um formato que o prometheus consegue fazer o scrap e gravar os dados.
Agora que temos o serviço funcionando e servindo as métricas da aplicação vamos configurar os targets no Prometheus.
Configuração dos targets
Prometheus é configurado via argumentos de linha de comando e arquivos de configuração.
É nestes arquivos de configuração que definimos tudo relacionado ao scraping das métricas.
O arquivo de configuração é escrito no formato YAML. Um exemplo de arquivo válido pode ser visto aqui
Mas para fins deste tutorial vamos apenas re-usar o arquivo .yaml
que já veio quando baixamos o binário do Prometheus.
Então supondo que está no diretório em que extraiu a aplicação do prometheus você pode editar o arquivo prometheus.yaml
Agora basta adicionar o serviço dentro do nó scrape_configs
:
scrape_configs:
- job_name: "Web service 1"
static_configs:
- targets: ["localhost:3000"]
Agora ao iniciar o prometheus ele vai fazer o scrap das métricas da aplicação a cada n segundos configurados neste mesmo arquivo. E ficará tudo salvo no collections time series deste banco de dados.
Abaixo vemos um exemplo da execução:
Com isso finalizamos a etapa de configuração de um serviço + Prometheus.
Uma versão mais granular (completa) de como configurar um scraper pode ser vista no exemplo abaixo:
scrape_configs:
- job_name: "Web service 1"
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: /metrics
scheme: http
follow_redirects: true
static_configs:
- targets:
- localhost:3000