Monitoramento de serviços com Prometheus

Compartilhe

Compartilhar no facebook
Compartilhar no google
Compartilhar no twitter
Compartilhar no linkedin

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 da 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, vou apresentar conceitos introdutórios da ferramenta, seus principais componentes, modelos de dados e tipos de métricas e dicas de utilização.

Prometheus

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 errado. 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: realizar um scraper em informações expostas por serviços sendo monitorados e armazenar 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 possam identificar anomalias no comportamento dos sistemas, enviando notificações para o alert manager, que é responsável por controlar o processo de notificação.

Há basicamente três formas de expor métricas ao Prometheus Server:

  • Client Libraries: aplicações de vida longa ― o Prometheus busca as informações de tempos em tempos, batendo em um endpoint para coletar as métricas expostas normalmente por client libraries. 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, estas aplicações devem notificar um componente push gateway que irá expor estas informações ao Prometheus.
  • Exporters: aplicações e serviços de terceiros que não temos acesso ao código fonte, mas que desejamos monitorar, tais como banco de dados, hardware, sistemas de mensageria ― são utilizados exporters 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.

Métricas e Time Series Data Base

Um ponto que acredito ser interessante entender é como as métricas são representadas. As métricas armazenadas em uma base time series podem ser vistas como streams 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 stream de valores chamados de amostras.

metric_name{label=”value”,…} = [(v0,t0), (v1,t1), …]

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

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:

 Conjunto de Time series da métrica prometheus_http_requests_total

Na métrica acima, temos um conjunto de time series composto pela combinação das dimensões (code, handler, instance e job). Por exemplo, todas as requisições com status code 200 para o endpoint “/api/v1/query” consiste em um time series da métrica prometheus_http_requests_total.

É recomendado que esta combinação de dimensões — chamada de cardinalidade — seja algo controlado, evitando utilizar valores que variam muito, como por exemplo, emails 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 a seguinte label matcher:

prometheus_http_requests_total{handler=”/api/v1/targets”}

Uso da Prometheus Expression Language para filtrar time series com base em dimensões

Os resultados destas consultas podem ser divididos em quatro tipos, porém os que gostaria de abordar aqui são dois: o Instant Vector e Range Vector.

O primeiro tipo, instant vector, ocorre quando consultamos apenas pelo nome da métrica ou usando os labels como seletores — como feito anteriormente — , e podemos ter como resultado um conjunto de time series com um único valor de amostragem, o mais recente da métrica.

Já o range vector funciona quase da mesma forma que o instant vector, exceto pelo fato de retornar um conjunto de amostras após o momento atual, por exemplo, as amostragens do último minuto.

A duração do intervalo define o quanto queremos voltar no tempo para recuperar amostras da métrica.

Amostragens recuperadas em operações de Instant Vector e Range Vectors em múltiplas Time Series

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]

Imagem 3 — Range vector com o intervalo de 1m de amostras do total de requisições feitas na /api/v1/targets

Tipos de métricas

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

  • Counter

Counters contabilizam o número total de algum evento que aconteceu desde que a aplicação iniciou. Por exemplo, counters podem ser utilizados para representar o número de pedidos, número de requisições em um endpoint.

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

increase(http_requests_total{job=”api-server”}[5m])

  • Gauge

Gauge é uma métrica que representa um valor que pode aumentar e diminuir. Exemplo de medida que pode utilizar gauges é o uso atual de memória disponível em um sistema operacional. Quando usados em consultas de agregação, usualmente utilizamos as funções sum, avg, min, e max.

  • Histogram e Summaries

Essas métricas são composições de counters e permitem a você rastrear a distribuição de eventos e o cálculo de quantiles para eles. Por exemplo, quando estamos analisando o desempenho das respostas de requisições (latência) HTTP dos nossos serviços.

Imagem retirada do livro Design Data Intensive Applications — por Martin Kleppmann (Autor)

As métricas de histogram possuem um sufixo _bucket em seus time series. Cada time series possui um label chamado le, que é um counter de quantas vezes um evento que possui tamanho menor que X aconteceu. Para consulta deste tipo de informação, utilizamos a função histogram_quantile em conjunto com a função rate para obter o range instant que desejamos monitorar.

histogram_quantile(0.9, rate(prometheus_http_request_duration_seconds_bucket[5m]))

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

Já a Summary apresenta as mesmas capacidades do Histogram, mas ele provê também uma contagem total — um counter com o sufixo _count — e uma soma de todas as amostragens observadas — um counter com o sufixo _sum.

Instrumentação

O Prometheus funciona como uma ferramenta de caixa branca, ou seja, você precisa explicitamente definir quais métricas sua aplicação deseja expor. Na documentação do próprio Prometheus são apresentadas APIs para diversas linguagens.

Caso sua linguagem favorita execute na JVM, uma opção interessante é abstrair a API nativa com o uso do Micrometer, que provê a 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 de tecnologia. Suas capacidades e limitações devem ser bem compreendidas para o uso em grande escala.

Após essa leitura introdutória apresentada, fica 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: Up & Running: Infrastructure and Application Performance Monitoring — https://www.amazon.com.br/dp/B07FCV2VVG/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

Prometheus Reference Doc- https://prometheus.io/docs/introduction/overview/

https://www.robustperception.io/

PromCon EU 2019: Containing Your Cardinality — https://www.youtube.com/watch?v=49BGvC1coG4

PromCon 2016: The Prometheus Time Series Database — https://www.youtube.com/watch?v=HbnGSNEjhUc

Prometheus Monitoring for Java Developers by Fabian Stäber — https://www.youtube.com/watch?v=jb9j_IYv4cU

Intro + Deep Dive: Prometheus — Julius Volz, Prometheus & Richard Hartmann, SpaceNet — https://www.youtube.com/watch?v=9GMWvFcQjY

GOTO 2019 • An Introduction to Systems & Service Monitoring with Prometheus • Julius Vol — zhttps://www.youtube.com/watch?v=5O1djJ13gRU

PromCon EU 2019: Fun and Profit with Alertmanager — https://www.youtube.com/watch?v=VgsM8pOyN5s

PromCon 2018: Life of an Alert — https://www.youtube.com/watch?v=PUdjca23Qa4

 

 

Camila Monteiro

Camila Monteiro

Graduada em Marketing pela Universidade de São Paulo e Analista de Employer Branding na Movile. Acredita que as relações humanas e a conexão entre pessoas são capazes de transformar o mundo. Apaixonada por café, plantas e guardar objetos completamente desnecessários.

Deixe um comentário

Categorias

Posts relacionados

Siga-nos

Baixe nosso e-book!

%d blogueiros gostam disto: