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:
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
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
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
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"]
2. Iniciando
O prometheus é iniciado com o seguinte comando:
@prometheus $ ./prometheus --config.file=prometheus.yml
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:
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
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.
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)