The Ops Community ⚙️

Francilio Araújo
Francilio Araújo

Posted on • Edited on

Introdução ao prometheus

Prometheus é um sistema open source de coleta, armazenamento, consulta e exibição de métricas. Ele foi construído dentro da SoundCloud por engenheiros que já tinham trabalhado com o sistema de monitoramento do Borg, antecessor do kubernetes. Prometheus foi o segundo projeto a fazer parte da Cloud Native Computing Foundation, logo após o kubernetes.
O prometheus armazena as métricas como séries temporais, ou seja, os valores são armazenados junto ao timestamp de quando eles foram coletados e, opcionalmente, algumas labels.

Funcionalidades

  • Um modelo de dados multi-dimensional com dados de séries temporais identificados por nome e pares chave/valor;
  • PromQL, uma linguagem de consulta flexível e capaz de lidar com esta dimensionalidade;
  • Não depende de armazenamento distribuído. Nós single server são autônomos;
  • Coleta de séries temporais ocorre por pull sobre HTTP;
  • Push de séries temporais é suportado por meio de um gateway intermediário;
  • Alvos são listados por meio de service discovery ou configuração estática;
  • Suporte a múltiplos modos para geração de gráficos e dashboards.

Arquitetura

O diagrama a seguir ilustra os componentes do prometheus e a relação com outras ferramentas do ecosistema:

Arquitetura do Prometheus

O prometheus gera uma lista de endpoints em que ele coletará os dados. Ele suporta listar endpoints de provedores de cloud, como AWS, Azure, GCP, Digital Ocean e Linode, de orquestradores, como Hashicorp Nomad e Kubernetes, de sistemas de service discovery, como Eureka e Hashicorp Consul, além de arquivos, endpoints HTTP, DNS, hosts docker e vários outros métodos.
Após listar os alvos, o prometheus realiza uma requisição em cada um para coletar as métricas. Um alvo pode ser uma aplicação instrumentada, um exporter ou um pushgateway.
Uma aplicação instrumentada é uma aplicação que utiliza uma biblioteca cliente do prometheus. Um exporter é uma aplicação que coleta dados de um processo ou serviço e os disponibiliza no formato do prometheus. O pushgateway é uma aplicação intermediária entre o prometheus e processos de curta duração. Como processos de curta duração podem terminar antes do prometheus realizar a coleta, pode-se enviar as métricas para o pushgateway e o prometheus fará a coleta nele.
Os dados coletados são armazenados localmente no disco.
O prometheus pode enviar notificações para o alertmanager para sinalizar valores fora do esperado.
Outras ferramentas podem consultar os dados do prometheus utilizando PromQL para visualização e exportação.

Primeiros passos com docker

Para realizar este hands-on você vai precisar do docker e docker compose (prefira o plugin). Como base vamos utilizar este repositório:

0. Preparação

Realize o checkout da branch part01 e suba o contêiner pelo compose:

$ git checkout part01
Switched to branch 'part01'
Your branch is up to date with 'origin/part01'.
$ ls -F
docker-compose.yaml # Compose com todos os 'nós'
get-ip-for*         # Script para exibir o IP de um contêiner
prometheus/         # Pasta com o Dockerfile para o prometheus
$ docker compose up -d
[+] Building 17.4s (6/6) FINISHED                                              
 => [internal] load build definition from Dockerfile                      1.3s
 => => transferring dockerfile: 115B                                      0.3s
 => [internal] load .dockerignore                                         1.2s
 => => transferring context: 2B                                           0.0s
 => [internal] load metadata for docker.io/library/debian:bullseye        0.2s
 => CACHED [1/2] FROM docker.io/library/debian:bullseye                   0.0s
 => [2/2] RUN apt-get update &&     apt-get install -y wget vim          14.4s
 => exporting to image                                                    0.8s
 => => exporting layers                                                   0.8s
 => => writing image sha256:a4106420c75c87f084254dd950583c6320c90f9767c2  0.0s 
 => => naming to docker.io/library/monitoring-labs_prometheus             0.0s 
[+] Running 3/3                                                                
 ⠿ Network monitoring-labs_lab             Created                        0.1s 
 ⠿ Network monitoring-labs_default         Created                        0.1s
 ⠿ Container monitoring-labs_prometheus_1  Started                        0.7s
$ docker compose ps
NAME                           SERVICE             STATUS              PORTS
monitoring-labs_prometheus_1   prometheus          running             
Enter fullscreen mode Exit fullscreen mode

A partir deste ponto, as linhas que iniciarem por @prometheus $ devem ser executadas dentro do contêiner prometheus e as linhas que iniciarem por @host $ devem ser executadas na máquina host. Entre no contêiner com:

@host $ docker compose exec prometheus /bin/bash
Enter fullscreen mode Exit fullscreen mode

Este contêiner é um contêiner debian:bullseye.

1. Instalação

Vá até esta para copiar o link de download. Faça o download dentro do contêiner prometheus, descompacte e entre na nova pasta. No exemplo a seguir usarei a versão 2.37.0.

@prometheus $ wget https://github.com/prometheus/prometheus/releases/download/v2.37.0/prometheus-2.37.0.linux-amd64.tar.gz
...
2022-09-06 00:48:02 (22.8 MB/s) - 'prometheus-2.37.0.linux-amd64.tar.gz' saved
@prometheus $ tar -xzvf prometheus-2.37.0.linux-amd64.tar.gz     
prometheus-2.37.0.linux-amd64/
prometheus-2.37.0.linux-amd64/consoles/
prometheus-2.37.0.linux-amd64/consoles/index.html.example
prometheus-2.37.0.linux-amd64/consoles/node-cpu.html
prometheus-2.37.0.linux-amd64/consoles/node-disk.html
prometheus-2.37.0.linux-amd64/consoles/node-overview.html
prometheus-2.37.0.linux-amd64/consoles/node.html
prometheus-2.37.0.linux-amd64/consoles/prometheus-overview.html
prometheus-2.37.0.linux-amd64/consoles/prometheus.html
prometheus-2.37.0.linux-amd64/console_libraries/
prometheus-2.37.0.linux-amd64/console_libraries/menu.lib
prometheus-2.37.0.linux-amd64/console_libraries/prom.lib
prometheus-2.37.0.linux-amd64/prometheus.yml
prometheus-2.37.0.linux-amd64/LICENSE
prometheus-2.37.0.linux-amd64/NOTICE
prometheus-2.37.0.linux-amd64/prometheus
prometheus-2.37.0.linux-amd64/promtool
@prometheus $ cd prometheus-2.37.0.linux-amd64
@prometheus $ ls -F
LICENSE  console_libraries/  prometheus*     promtool*
NOTICE   consoles/           prometheus.yml
Enter fullscreen mode Exit fullscreen mode

Entre os arquivos extraídos temos o binário do prometheus, um binário utilitário chamado promtool e um exemplo de configuração. O exemplo de configuração junto com algumas explicações:

# Configurações globais
global:
  scrape_interval: 15s # Configura o tempo entre cada coleta para 15s. O padrão é a cada 1 minuto.
  evaluation_interval: 15s # Calcula regras a cada 15s. O padrão é a cada 1 minuto.
  # scrape_timeout é configurado para o padrão global (10s).

# Configurações do Alertmanager
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Carrega regras uma vez e periodicamente as calcula de acordo com o 'evaluation_interval' global.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# Uma configuração de coleta contendo exatamente um endpoint para coletar:
# Aqui está o próprio prometheus.
scrape_configs:
  # O nome do job é adicionado como uma label `job=<job_name>` para qualquer série temporal coletada desta configuração.
  - job_name: "prometheus"

    # metrics_path padrão é '/metrics'
    # scheme padrão é 'http'.

    static_configs:
      - targets: ["localhost:9090"]
Enter fullscreen mode Exit fullscreen mode

2. Iniciando

O prometheus é iniciado com o seguinte comando:

@prometheus $ ./prometheus --config.file=prometheus.yml
Enter fullscreen mode Exit fullscreen mode

No host execute ./get-ip-for prometheus para pegar o ip do contêiner e acesse no seu navegador com a porta 9090. Você verá uma tela similar a esta:

Tela do prometheus

Antes de utilizar a UI web, acesse o endereço http://<ip do prometheus>:9090/metrics para ver como são as métricas. Exemplos de algumas métricas:

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 4.0051e-05
go_gc_duration_seconds{quantile="0.25"} 6.132e-05
go_gc_duration_seconds{quantile="0.5"} 9.129e-05
go_gc_duration_seconds{quantile="0.75"} 0.001359203
go_gc_duration_seconds{quantile="1"} 0.001720425
go_gc_duration_seconds_sum 0.005046295
go_gc_duration_seconds_count 10
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 35
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed.
# TYPE go_memstats_alloc_bytes_total counter
go_memstats_alloc_bytes_total 7.6876768e+07
# HELP prometheus_tsdb_tombstone_cleanup_seconds The time taken to recompact blocks to remove tombstones.
# TYPE prometheus_tsdb_tombstone_cleanup_seconds histogram
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.005"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.01"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.025"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.05"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.1"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.25"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="0.5"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="1"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="2.5"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="5"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="10"} 0
prometheus_tsdb_tombstone_cleanup_seconds_bucket{le="+Inf"} 0
prometheus_tsdb_tombstone_cleanup_seconds_sum 0
prometheus_tsdb_tombstone_cleanup_seconds_count 0
Enter fullscreen mode Exit fullscreen mode

Cada métrica inicia com duas linhas # HELP <nome> e # TYPE <nome>. A linha # HELP diz o que é esta métrica e # TYPE diz qual o tipo dela. O prometheus suporta quatro tipos de métricas, contadores, medidores, histogramas e sumários. Mais informações sobre cada tipo de métrica podem ser encontrados aqui. As próximas linhas contém o nome da métrica, labels entre {} e o valor da métrica. Cada linha é uma série. Cada série pode ter várias labels separadas por ,, ou nenhuma. No caso de não haverem labels, também não há {}.

Na UI web temos os menus alertas, gráfico, status e ajuda. Dentro do menu status temos informação de build e runtime, status do TSDB, flags de linha de comando, configuração, regras, alvos e service discovery.

Na página gráfico podemos ver os valores das métricas e gerar gráficos simples. Esta página é muito útil para debugar métricas. Na barra ao lado da lupa você pode escrever expressões em PromQL para executá-las. No botão com um planeta, logo ao lado, é possível explorar as métricas que estão no prometheus.

página gráfico mostrando a métrica prometheus_http_requests_total

Para filtrar as séries com code=200 podemos escrever prometheus_http_requests_total{code="200"} e para filtrar mais ainda podemos adicionar labels separadas por ,, como prometheus_http_requests_total{code="200",handler="/metrics"}. Mais informações sobre PromQL podem ser encontrados aqui.

Top comments (0)