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.
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
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"}
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.
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]
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.
aumentar(http_requests_total{job="api-server"}[5m])
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 .
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.
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