Tipos primitivos de métricas no Prometheus

Publicado em 11 fev 2020. Uns 3 minutos de leitura.

O Prometheus tem dois tipos primitivos e dois tipos complexos de métricas. Os tipos complexos reusam os tipos primitivos, usando múltiplas séries temporais para fazer o que parece ser apenas uma quando consultado com as funções de agregação específicas.

Vamos dar uma olhada nos dois tipos primitivos: contadores e medidas.

🧮 Contador (counter)

Um contador é um número que sempre aumenta (ou fica parado). Ele representa o número de vezes que alguma coisa aconteceu. Alguns exemplos:

  • Número de visualizações do seu site
  • Número de transações de cartão de crédito no seu sistema (você não pode desfazer uma transação -- você pode estorná-la, mas ela aconteceu e isto é imutável)
  • Número de deploys da sua aplicação

Como você pode ver, um contador é algo que normalmente se pensa em termos de número de vezes que x aconteceu.

Agora, aplicações que exportam métricas para o Prometheus não persistem estas métricas entre reinícios, então o contador vai voltar para zero quando a aplicação tiver um deploy, travar ou qualquer outro evento que a reinicie. Então como contadores são úteis?

Um contador por si só é difícil de entender. É aí que a função rate entra. rate recebe uma série temporal de um contador, um tamanho de janela em unidades de tempo, e retorna uma série temporal de eventos por segundo. A função rate e sua família sabem lidar com reinícios de contadores.

Por exemplo, se uma métrica de contador tinha o valor de 50 na última coleta, e agora tem o valor 3, a aplicação tem que ter reiniciado. A função rate não vai dar como resultado "eventos por segundo negativo" aqui. Ela vai, na verdade, dizer que o contador aumentou em 3 unidades entre as coletas (de 50 para 53). Isso quer dizer que você pode perder alguns dados se, por exemplo, entre as coletas o contador foi para 52 e depois reiniciou. Mas isso é ok e o Prometheus deve ser usado em situações em que essas perdas esporádicas pelos reinícios não sejam um problema (a maior parte das situação de monitoramento deve estar ok quanto a isso).

📈 Medida (gauge)

Antes de mais nada, eu não consegui pensar numa tradução melhor pra gauge. Outra tradução que pode ajudar (ou não é bitola). Enfim…

Uma medida é um número que pode subir, descer ou manter-se parado. Ela representa um retrato instantâneo de uma quantidade observável. Alguns exemplos:

  • Quantidade atual de usuários online
  • Quantidade atual de compras finalizadas com envio pendente (vai subir quando uma nova compra for criada e descer quando uma compra for enviada)
  • Quantidade atual de CPU em utilização, percentual

Esses exemplos reforçam o fato que medidas normalmente significam uma quantidade atual de coisas, absoluta ou relativa.

Como é um retrato do estado atual, uma métrica de medida pode ser lida sozinha e deve fazer sentido. Você pode também traçá-la sobre o tempo para ver tendências. Se a aplicação reiniciar, ela vai começar a reportar o valor atual da métrica de novo quando iniciar, então você não precisa de um tratamento especial aqui.

O que vem depois?

Não só de contadores e gauges vive o Prometheus. Ok, podemos até dizer que sim. O Prometheus também tem dois tipos complexos de métricas: histogramas e sumários que são construidos como conjuntos desses de métricas desses dois tipos primitivos. Dá uma lida sobre no outro post!