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:

exemplo de execução

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:

execution example

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