Monitoramento e alerta de aplicações de serviços com Prometheus

Conheça alguns conceitos introdutórios da ferramenta e suas aplicações

Lucas Farias

💻 Desenvolvedor de software no iFood

Conceitos introdutórios da ferramenta e suas aplicações

Desenvolver serviços que são utilizados por milhões de usuários com tráfego na escala de milhões é uma responsabilidade muito grande. Acompanhar a saúde, comportamento e tendências de aplicação e infraestrutura é uma atividade essencial dentro do iFood. Utilizamos algumas ferramentas para nos auxiliar nesta tarefa, e uma delas é o Prometheus — uma solução de monitoramento e alerta de código aberto.

Neste texto, apresentarei conceitos introdutórios da ferramenta, seus principais componentes, modelos de dados e tipos de estatísticas e dicas de utilização.

Prometeu

O Prometheus é uma plataforma de monitoramento e alerta de aplicações. Observar como os sistemas estão sendo utilizados fornece informações importantes para o planejamento de decisões, sejam elas de engenharia ou de negócio. Normalmente quando estamos monitorando algo, queremos saber quando as coisas dão erradas. Estas são as duas funções principais do Prometheus, ele não tenta fazer nada além disso.

Um aspecto interessante do ecossistema é que sua construção é feita em módulos independentes. O componente principal é o Prometheus Server que é responsável por um raspador em informações expostas realizadas por serviços sendo monitorados e armazenados em uma base de dados time series , descoberta dinâmica de serviços que precisam ser monitorados — o que é uma característica muito importante para ambientes elásticos em nuvem — e também avaliar regras que podem identificar anomalias no comportamento dos sistemas, enviando notificações para o gerenciador de alertas , que é responsável por controlar o processo de notificação.

Há basicamente três formas de exportar estatísticas ao Prometheus Server :

  • Bibliotecas Clientes: aplicações de longa vida, o Prometheus busca informações de tempos em tempos, batendo em um endpoint para coletar as informações expostas normalmente por bibliotecas clientes . Essa é a forma mais usual para serviços web, por exemplo.
  • Push Gateway: aplicações curtas, aquelas que executam apenas para realizar uma tarefa. Background Jobs são bons exemplos deste tipo de aplicação. Para estes casos, essas aplicações devem notificar um componente push gateway que irá exportar essas informações ao Prometheus.
  • Exportadores: aplicações e serviços de terceiros que não têm acesso ao código fonte, mas que desejamos monitorar, tais como banco de dados, hardware, sistemas de mensagens, são utilizados exportadores para definir e obter dados da aplicação.

O Prometheus não se preocupa em criar formas avançadas de visualização das métricas. Apesar de oferecer uma interface web simples para consulta, ele oferece uma API que permite a consulta de informações por ferramentas como Grafana .

Base de dados de métricas e séries temporais

Um ponto que acreditar ser interessante é como as estatísticas são representadas. As coleções armazenadas em uma série temporal base podem ser vistas como fluxos de valores em um momento do tempo . A representação pode ser vista como um identificador , um conjunto de rótulos para definir dimensões. Os registros dessa métrica são um fluxo de valores chamados de amostras.

				
					metric_name{label="valor",...} = [(v0,t0), (v1,t1), ...]
				
			

O processo de aquisição destas amostras é feito por uma técnica chamada Scraping , onde o Prometheus faz requisições HTTP nos serviços em intervalos de tempo fixo, coletando as informações expostas pelo endpoint de exposição.

monitoramento e alerta de aplicações
Exemplo do processo de Scraping do prometheus

Como boa prática, o nome da métrica deve definir a funcionalidade do sistema que está sendo monitorado. Por exemplo, a métrica chamada de prometheus_http_requests_total conta o total de requisições HTTP realizadas ao Prometheus Server . A imagem abaixo mostra esta métrica na UI do Prometheus:

				
					prometheus_http_requests_total
				
			
monitoramento e alerta de aplicações
Conjunto de Séries Temporais da métrica prometheus_http_requests_total

Na métrica acima, temos um conjunto de séries temporais composto pela combinação das dimensões (código, manipulador, instância e trabalho). Por exemplo, todas as requisições com código de status 200 para o endpoint “/api/v1/query” consistem em uma série temporal da métrica prometheus_http_requests_total . É recomendado esta combinação de dimensões — chamada de cardinalidade — seja algo controlado , evitando usar valores que variam muito, como por exemplo, e-mails ou identificadores de usuários.

Podemos filtrar e agregar dados de uma métrica com base em suas dimensões. Por exemplo, para recuperar o número total de requisições feitas no endpoint “/api/v1/targets”, podemos usar o seguinte label matcher :

				
					prometheus_http_requests_total{handler="/api/v1/targets"}
				
			
monitoramento e alerta de aplicações
Uso da Prometheus Expression Language para filtrar séries temporais com base em dimensões

O resultado destas consultas pode ser dividido em quatro tipos, porém os que gostaria de abordar aqui são dois: o Instant Vector e Range Vector. O primeiro tipo, vetor instantâneo , ocorre quando consultamos apenas pelo nome da métrica ou usando os rótulos como seletores — como feito anteriormente —, e podemos ter como resultado um conjunto de séries temporais com um único valor de amostragem, o mais recente da métrica.

Já o vetor de intervalo funciona quase da mesma forma que o vetor instantâneo , exceto pelo fato retornar um conjunto de amostras após o momento atual, por exemplo, como amostragens do último minuto. A duração do intervalo define o quanto queremos voltar no tempo para recuperar amostras da métrica.

monitoramento e alerta de aplicações
Amostragens recuperadas em operações de Instant Vector e Range Vectors em múltiplas Séries Temporais

Por exemplo, se quisermos saber uma amostra do aumento de requisições na /api/v1/targets no último minuto:

				
					prometheus_http_requests_total{handler="/api/v1/targets"}[1m]
				
			
monitoramento e alerta de aplicações
Imagem 3 — Vetor de intervalo com o intervalo de 1m de amostras do total de requisições feitas em /api/v1/targets

Tipos de medições

Após entender como as métricas são representadas, vamos dar um passo a diante e entender quais tipos de métricas estão disponíveis.

Contador

Os contadores contabilizaram o número total de algum evento que ocorreu desde que a aplicação foi iniciada. Por exemplo, os contadores podem ser usados ​​para representar o número de pedidos, número de requisições em um endpoint.

monitoramento e alerta de aplicações

Geralmente este tipo de métrica é útil para entender o quanto e quão rápido algo está acontecendo no sistema. Para isso, essa métrica geralmente é operada com funções de aumento e taxa por meio de vetores de faixa .

				
					aumentar(http_requests_total{job="api-server"}[5m])
				
			
monitoramento e alerta de aplicações

Medidor

Gauge é uma métrica que representa um valor que pode aumentar e diminuir. Um exemplo de como você pode usar medidores é o uso atual de memória disponível em um sistema operacional. Quando usados ​​em consultas de agregação, normalmente utilizamos as funções sum , avg , min , e max .

monitoramento e alerta de aplicações

Histograma e Resumos

Essas tabelas são composições de contadores e permitem que você acompanhe a distribuição de eventos e o cálculo de quantis para eles. Por exemplo, quando estamos analisando o desempenho das respostas de requisições (latência) HTTP dos nossos serviços.

monitoramento e alerta de aplicações
Imagem retirada do livro Design Data Intensive Applications — por Martin Kleppmann (Autor)

As métricas de histograma possuem um sufixo _bucket em suas séries temporais . Cada série temporal possui um rótulo chamado le , que é um contador de quantas vezes um evento que possui tamanho menor que X aconteceu. Para consultar este tipo de informação, utilizamos a função histogram_quantile em conjunto com a função rate para obter o intervalo instantâneo que desejamos monitorar.

				
					histograma_quantile(0,9, taxa(prometheus_http_request_duration_seconds_bucket[5m]))
				
			

Outros exemplos são a medição da distribuição do tempo de entrega de pedidos em minutos pelos entregadores, tempos para tomada de decisão do processo de roteirização de pedidos, etc.

Já o Resumo apresenta as mesmas capacidades do Histograma , mas ele fornece também uma contagem total — um contador com o sufixo _count — e uma soma de todas as amostras observadas — um contador com o sufixo _sum .

Instrumentação

O Prometheus funciona como uma ferramenta de caixa branca, ou seja, você precisa definir explicitamente quais métricas sua aplicação deseja exportar. Na documentação do próprio Prometheus é apresentada APIs para diversas linguagens. Caso sua linguagem favorita seja executada na JVM, uma opção interessante é abstrair a API nativa com o uso do Micrometer , que fornece instrumentação para o Prometheus, além de outras ferramentas de monitoramento. Para alguns casos de uso, como os serviços de tempo de vida curto — como o Spring Cloud Task — a exposição de métrica para o Pushgateway precisa ser feita com a API nativa.

Conclusões

Prometheus é uma ferramenta com grande notoriedade na comunidade. Suas capacidades e limitações devem ser bem informadas para o uso em grande escala. Após essa leitura introdutória apresentada, fique como sugestão de próximos passos a leitura das referências deste texto, que contém alguns insights interessantes de assuntos que não foram aprofundados aqui.

Obrigado e boa leitura!

Referências

Prometheus: instalado e funcionando: monitoramento de desempenho de infraestrutura e aplicações — https://www.amazon.com.br/dp/B07FCV2VVG/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

Documento de referência do Prometheus- https://prometheus.io/docs/introduction/overview/

https://www.robustperception.io/

PromCon EU 2019: Contendo sua cardinalidade – https://www.youtube.com/watch?v=49BGvC1coG4

PromCon 2016: Banco de dados de séries temporais Prometheus – https://www.youtube.com/watch?v=HbnGSNEjhUc

Monitoramento Prometheus para desenvolvedores Java por Fabian Stäber — https://www.youtube.com/watch?v=jb9j_IYv4cU

Introdução + mergulho profundo: Prometheus — Julius Volz, Prometheus e Richard Hartmann, SpaceNet — https://www.youtube.com/watch?v=9GMWvFcQjY

GOTO 2019 • Uma introdução ao monitoramento de sistemas e serviços com Prometheus • Julius Vol — z https://www.youtube.com/watch?v=5O1djJ13gRU

PromCon EU 2019: diversão e lucro com Alertmanager — https://www.youtube.com/watch?v=VgsM8pOyN5s

PromCon 2018: A vida de um alerta — https://www.youtube.com/watch?v=PUdjca23Qa4

Esse conteúdo foi útil para você?
SimNão

Publicações relacionadas