Guia completo sobre PromQL: a linguagem de consulta do Prometheus

Guia completo sobre PromQL: a linguagem de consulta do Prometheus

Nesse post vamos falar sobre o PromQL, que nada mais é do que uma linguagem de consulta do Prometheus, ela nos possibilita selecionar e agregar dados de séries temporais em tempo real.
Essa poderosa linguagem de expressão nos permite realizar filtros utilizando os rótulos de séries temporais e utilizar os resultados de cada expressão para visualizar graficamente.

Consulta do Prometheus

Os nomes das métricas em séries temporais são a parte principal de qualquer consulta no PromQL, todas as métricas do Prometheus são baseadas em tempo, as métricas são divididas em quatro partes, sendo elas:

  • metric_name: O nome da métrica.
  • labels: São chave-valor que distinguem cada métrica com o mesmo nome.
  • value: É o valor mais recente coletado, esse valor é um float64.
  • timestamp: Registro de data e hora com precisão de milissegundos, porém esse registro não aparece no console de consulta, para poder visualizá-lo você precisa alternar para a guia Gráfico no Prometheus.

Tipos de métricas

As métricas são obtidas através dos exportadores do Prometheus, ele realiza scrapes ou seja raspagem em intervalos regulares. Essa configuração de intervalos é feita no arquivo de configuração do Prometheus chamado de prometheus.yml em scrape_interval que por padrão realiza a raspagem a cada 15s.

Existem quatro tipos de métricas:

  • Counters: São métricas cumulativas que sempre evoluem como por exemplo, número de acessos a uma página.
  • Gauges: São métricas voláteis, tais como velocidade de transmissão, temperatura, etc.
  • Histogram: São métricas que se baseiam em observações, geralmente baseados numa amostragem temporal.
  • Summary: Summary é semelhante ao histogram, ele realiza coletas amostras e cria várias métricas, incluindo soma (sum) e contagem (count).

Laboratório

Vamos ver na prática como criar gráficos utilizando as expressões do PromQL e exibi-los no Prometheus.

Nesse laboratório utilizarei o Prometheus executando em container do Docker, supondo que você já possua Docker e Docker Compose instalados na sua máquina.

Conteúdo do docker-compose.yml:

version: '3.3'

volumes:
  prometheus:

services:
  prometheus:
    image: prom/prometheus
    hostname: prometheus
    ports:
      - 9090:9090

Vamos executar o nosso docker-compose para provisionar a infraestrutura do laboratório:

 
sudo docker-compose up -d 

Após finalizar a execução, podemos acessar o Prometheus na porta 9090:

Vamos acessar o nosso Prometheus na opção de Status > Targets e verificar o status:

Vamos utilizar as métricas do próprio Prometheus para criar as consultas, para isso clique em Graph e no campo de busca digite promhttp_metric_handler_requests_total e em seguida clique em Execute:

Em Element é possível visualizar as métricas apresentadas após a consulta realizada. No resultado da consulta podemos visualizar o nome da métrica promhttp_metric_handler_requests_total suas labels instance=”localhost:9090″ e seus respectivos valores.

Para podermos visualizar o timestamp da métrica consultada basta clicar em Graph:

Podemos filtrar a consulta utilizando algumas labels (rótulos), temos quatro operadores suportados que podemos utilizar nos filtros de labels sendo eles:

  • = Igual
  • != Não igual
  • =~ Corresponde a regex
  • !~ Não corresponde a regex

O Prometheus utiliza a sintaxe RE2 em todas as expressões regulares, todos os filtros ficam dentro de chaves ({}) após o nome da métrica.

Vamos realizar uma nova consulta filtrando pelo código 200, no campo de busca digite promhttp_metric_handler_requests_total{code=”200″} e em seguida clique em Execute:

Dessa forma estamos filtrando na métrica promhttp_metric_handler_requests_total apenas pelo código igual a 200.

Vetores de intervalo

Podemos anexar uma duração de intervalo em uma consulta, dessa forma obtemos vários valores de data e hora registrados no intervalo selecionado. Isso se chama vetor de intervalo, esses valores serão registrados na série temporal.

Para as durações de tempo, possuímos as seguintes unidades:

  • s – segundos
  • m – minutos
  • h – horas
  • d – dias
  • w – semanas
  • y – anos

Vamos realizar uma consulta buscando os valores registrados nos últimos 5 minutos da métrica promhttp_metric_handler_requests_total:

Repare que as coletas possuem um intervalo de 15 segundos, podemos observar que após o símbolo @ têm exatamente 15 segundos de diferença entra cada coleta.

Uma observação importante é que não podemos representar graficamente os vetores de intervalo, pois eles contém diversos valores de registro de data e hora, se selecionarmos a opção Graph para visualizarmos graficamente teremos a seguinte mensagem de erro:

Funções

Geralmente utilizamos uma função em um vetor de intervalo dessa forma obtemos um vetor instantâneo, assim podemos visualizá-lo graficamente (apenas vetores instantâneos podem ser representados graficamente).

O Prometheus possui diversos tipos de funções para vetores instantâneos e de intervalo, algumas delas são:

  • rate() – Essa função calcula a taxa média de aumento por segundo da série temporal no vetor de intervalo.
  • irate() – Essa função calcula a taxa instantânea de aumento por segundo da série temporal no vetor de intervalo. Isso é baseado nos dois últimos pontos de dados.
  • increase() – Essa função calcula o aumento na série temporal no vetor de intervalo, ele basicamente multiplica a taxa pelo número de segundos no seletor de intervalo de tempo.

Vamos realizar novamente a consulta e utilizando a função rate():

Agora é possível ver graficamente vetores de intervalo em um vetor instantâneo.

Operadores de agregação

O Prometheus possui alguns operadores de agregação internos, que podemos utilizar para agregar os elementos de um único vetor instantâneo, dessa forma teremos um novo vetor de menos elementos com valores agregados, alguns deles são:

  • sum – Calcula soma sobre dimensões.
  • min – Seleciona as dimensões mínimas acima.
  • max – Seleciona o máximo de dimensões.
  • avg – Calcula a média das dimensões.
  • count – Conta o número de elementos no vetor.
  • count_values – Conta o número de elementos com o mesmo valor.

Podemos utilizar o operador sum para obter o número totais de requisições da instância localhost:

Dessa forma estamos somando todas as requisições da instância localhost independente do código de reposta.

O PromQL também suporta operadores binários aritméticos, sendo eles:

  • + = Adição.
  • = Subtração.
  • * = Multiplicação.
  • / = Divisão.
  • % = Módulo.
  • ^ = Potenciação.

Podemos utilizar esses operadores para somar o valor de duas métricas, como por exemplo:

Assim estamos somando apenas os valores dos códigos 200 e 500.

 

Conclusão

Bom pessoal essa foi uma pequena introdução sobre o PromQL, na próxima postagem demonstrarei como realizar essas consultas e criar gráficos no Grafana.

Espero que tenham gostado, até a próxima!

 

Líder em Treinamento e serviços de Consultoria, Suporte e Implantação para o mundo open source. Conheça nossas soluções:

CURSOSCONSULTORIA

Anterior Como monitorar seu ambiente MongoDB com Prometheus e Grafana
Próxima Transforme sua empresa com soluções open source para alta demanda

About author

Rauny Moreira
Rauny Moreira 3 posts

Rauny Moreira atua como Analista de Infraestrutura em Software Livre, estudante de Redes de Computadores pela Universidade Nove de Julho. Possui experiência em ferramentas voltadas para aplicação da cultura Devops, com ênfase em monitoramento. Detém expertise como instrutor de cursos voltados ao Sistema Operacional Linux e Ferramentas de Monitoramento OpenSource, possui Certificação Zabbix 4.0 Certified Specialist.

View all posts by this author →

Você pode gostar também

Infraestrutura TI

A lenda do arquivo perdido. Domine a busca de arquivos no Linux com o comando find!

Você já se perguntou como os especialistas em Linux conseguem encontrar arquivos em um emaranhado de diretórios? Saiba que há um comando mágico chamado find que lhes concede esse poder.

Infraestrutura TI

Aprenda a converter um shell script em binário em passos simples

Na dica da semana de hoje, aprenderemos como converter um shell script em binário, uma prática muito utilizada quando queremos esconder o código fonte de um determinado shell script. Vamos

DevOps

Guia para atualizar o AWS Load Balancer Controller após migração do Kubernetes 1.21 para 1.22

Após atualizar o cluster do Kubernetes da versão 1.21 para a 1.22, você pode precisar atualizar o AWS Load Balancer Controller (anteriormente conhecido como ALB Ingress Controller) para garantir que