Monitoramento: Prometheus, Grafana e .Net Core 3.1 — Parte 2

Douglas Modesto
Guide Lab
Published in
9 min readMay 3, 2021

Desenvolver aplicações que serão utilizadas por milhares de usuários não é uma tarefa fácil, ainda mais quando falamos de cenários de micro serviços escaláveis onde poderemos ter diversos tipos de comunicação entre esses serviços. Como acompanhar a saúde, comportamento da aplicação e sua infraestrutura?
Podemos utilizar alguns recursos que nos auxiliam nesta tarefa e um desses é o Prometheus, uma solução que oferece monitoramento e alerta de código aberto.

O que é o Prometheus?

Conforme informado no github do prometheus, Prometheus é um projeto da Cloud Native Computing Foundation, é um sistema de monitoramento de sistemas e serviços. Ele coleta métricas de destinos configurados em determinados intervalos de tempo, avalia expressões de regra, exibe os resultados e pode acionar alertas quando condições especificadas são observadas.

Suas principais características são:

  • É um modelo de dados multidimensional — time series
  • Possui uma linguagem de consulta poderosa e flexível chamada PromQL
  • Possui diversos modos de suporte para gráficos e painéis.
  • Possui um modelo de pull HTTP para coleta de série temporal
  • É autônomo, sem dependência de armazenamento externo
  • Os alvos (APIs) são descobertos por meio de descoberta de serviço ou configuração estática.

A configuração do Prometheus é totalmente textual. O servidor é configurado a partir de arquivos de extensão .yaml, neste arquivo podemos adicionar nossos alvos (APIs) ao monitoramento, entre outras diversas funcionalidades.

YAML é um formato de serialização (codificação de dados) de dado legíveis por humanos inspirado em linguagens como XML, C, Python, Perl. Esse formato de arquivo de tecnologia é usado em documentos.

Abaixo segue um exemplo do arquivo de configuração do servidor Prometheus monitorando nossa api criada no primeiro artigo dessa série.

prometheus.yml

O Prometheus é agnóstico a linguagens de programação e possui bibliotecas clientes oficiais que são compatíveis e estão disponíveis para as linguagens Go, Java, Scala, Python e Ruby. Há algumas bibliotecas não oficiais disponíveis paras as linguagens .Net C#, Dart, Node.Js, PHP, R entre outros, sendo ainda possível desenvolver sua própria biblioteca.

Entre os principais componentes do Prometheus incluem o servidor Prometheus (que lida com descoberta de serviços, recuperação e armazenamento de métricas de aplicações monitoradas, análise de dados de séries temporais usando a linguagem de consulta PromQL).

O Prometheus é excelente para monitorar métricas e indicadores, esse é o objetivo que ele se propõe a fazer. Não é uma ferramenta de gerenciamento de desempenho de aplicações, porque se concentra exclusivamente em métricas do lado do servidor. A ferramenta não oferece rastreamento de chamada distribuída, descobrimento e visualização de topologia de serviço, análise de desempenho ou monitoramento da experiência do usuário final.

O fluxo da informação no Prometheus é unidirecional, então, não pode ser usado para controle ativo.

Chega de teoria, bora pra prática.

Mão na massa

Agora que sabemos o que é o Prometheus e o seu propósito, vamos ver ele trabalhando na prática. O objetivo é entendermos como o Prometheus Server funciona e como podemos configurá-lo para coletar métricas da nossa api.

Pré-requisitos

Afim de termos uma boa experiência com o laboratório proposto neste artigo, será necessário a instalação de algumas ferramentas que são o Docker e Docker Compose.

Segue abaixo os links das instalações oficiais:

Recapitulando

No primeiro artigo criamos nossa api, porém fiz algumas atualizações nela afim de melhorar nossa experiência com os testes que iremos fazer nesse artigo. Algumas atualizações foram:

  • Criamos uma controle para Listagem de Clientes e Buscar Cliente por Id
  • Configuramos o Swagger para termos nossos endpoints documentados
  • Criamos uma configuração para abrir o swagger no start da aplicação.
  • Criamos um Dockerfile para fazer o deploy da aplicação dentro de um container.

Segue link da api com as atualizações no github: clique aqui

Após as atualizações, ao iniciarmos nosso projeto, no endpoint localhost:8888/swagger/index.html, ele irá abrir nosso swagger, conforme imagem abaixo.

Documentação da api web-api-metrics

Configurando o Prometheus

No diretório onde se encontra a pasta Root da nosso serviço web-api-metrics, iremos criar uma nova pasta com nome prometheus e também iremos criar um arquivo chamado docker-compose.yml. O diretório deverá ficar conforme imagem abaixo.

diretório raiz do projeto

Na pasta prometheus iremos incluir as configurações do prometheus para ele rodar dentro do conteiner do docker.
Não se preocupe com o conteúdo do arquivo docker-compose.yml, mais a frente iremos incluir algumas configurações e cada uma dessas configurações será explicada e detalhada.

Dentro da pasta prometheus iremos criar alguns arquivos e diretórios que seguem:

  • crie um arquivo chamado Dockerfile (perceba que o arquivo Dockerfile não tem extensão)
  • crie um arquivo chamado prometheus.yml
  • crie uma pasta chamada data
diretório /prometheus

No arquivo Dockerfile iremos configurar a imagem do prometheus como segue abaixo:

Dockerfile do prometheus

Neste arquivo estamos:

  • Buscando a imagem do prometheus prom/prometheus:v2.17.1
  • Copiando nosso arquivo prometheus.yml para dentro do diretório /etc/prometheus que irá se econtrar dentro do contêiner
  • Definimos um volume na pasta /data para persitir nossas informações do prometheus no host caso percamos nosso container.
  • Estamos expondo a imagem na porta 9090

No arquivo prometheus.yml iremos incluir algumas configurações.

prometheus.yml

Neste arquivos estamos:

  • Setando o intervalo de 5 segundos para que o prometheus realize o pull das métricas
  • Estamos dando o nome web-api-metrics-job para o job do prometheus
  • Incluindo o endereço que o nosso serviço estará rodando e qual caminho ele irá encontrar as métricas /metrics
  • observação: Onde está o endereço IP, você deverá coloca o IP da sua máquina. Estamos utilizando o IP por que o prometheus e a nossa api irão se comunicar via containers do docker.

A princípio, essa são as configurações que devemos fazer no Prometheus para ele passar a buscar as informações que nossa api está gerando no endpoint /metrics

Agora voltaremos para o diretório raiz do nosso projeto, para incluir as configurações necessárias no nosso arquivo docker-compose.yml

docker-compose.yml

Vamos entrar um pouco mais no detalhe desse arquivo.
Dentro de services, temos dois serviços configurados que são api e prometheus.

No service api, estamos fazendo o seguinte:

  • Na tag context estamos dizendo nosso contexto é dentro do diretório /web-api-metrics, e que dentro desse diretório existe um arquivo Dockerfile.
  • Na tag image estamos dando um nome para a nossa imagem, que é web-api-metrics-image
  • Na tag port estamos fazendo o mapeamento das portas, onde o serviço roda na porta 80 dentro do container, e iremos expor a porta 8888 para o host.
  • Na tag networks estamos apontando pra nossa configuração de rede web_api_metrics_networks onde os containeres irão se comunicar.
docker-compose.yml

No service prometheus, estamos fazendo o seguinte:

  • Na tag context estamos dizendo nosso contexto é dentro do diretório /prometheus, e que dentro desse diretório existe um arquivo Dockerfile.
  • Na tag image estamos dando um nome para a nossa imagem, que é prometheus-local-image
  • Na tag restart quando colocamos always significa que o contêiner será reinicializado sempre que houver alguma atualização.
  • Na tag port estamos fazendo o mapeamento das portas, onde o serviço roda na porta 9090 dentro do container, e iremos expor a porta 9090.
  • Na tag networks estamos apontando pra nossa configuração de rede web_api_metrics_networks onde os containeres irão se comunicar.
docker-compose.yml

Em networks, estamos fazendo o seguinte:

  • criamos uma rede com o nome web_api_metrics_network
  • e colocamos o driver como overlay, isso significa que criamos uma rede distribuída em vários hosts daemon do Docker. Essa rede fica no topo (sobrepõe) as redes especificas do host.
docker-compose.yml

Em teoria é isso, com as configurações que temos até o momento, já podemos rodar nosso projeto e ver o prometheus coletando as informações.

Antes de executar os próximos comandos do Docker, certifique-se que o Docker da sua máquina esteja rodando, blz?

Vamos lá, abra um Command Line da sua preferença, navegue até o diretório onde está nosso arquivo docker-compose.yml no diretório raiz do nosso projeto.

diretório raiz do projeto

Após isso execute o seguinte comando:

  • docker-compose up
linha de comando com a execução do comando docker-compose up

Após a execução do comando docker-compose up, a construção dos containeres da nossa api e do prometheus deverão ser construidos.

No Windows temos um recurso bem interessante para gerenciarmos nossos conteineres que é o Docker Desktop. Ele oferece uma forma visual para conseguirmos analisar nossos conteineres conforme imagem abaixo.

Nesta tela podemos ver nossos dois conteineres em execução, o contêiner da api e o contêiner do prometheus.

Testando nosso cenário

Nossa API web-api-metrics está rodando na porta 8888, conforme configuramos no arquivo docker-compose.yml.

Se abrimos no navegador a url http:localhost:8888/metrics iremos ver as metricas geradas pela biblioteca do prometheus para o .Net Core.

métricas geradas pela api web-api-metrics

Para acessarmos o swagger da API, devemos navegar na url: http:localhost:8888/swagger/index.hml . então veremos a documentação da API, onde iremos realizar nossos testes.

swagger da api web-api-metrics

Podemos observar que nossa api tem dois endpoints, o endpoint /api/customers é onde iremos realizar a listagem de clientes, e o endpoint /api/customers/customer é onde iremos buscar o cliente pelo seu codigo de identificação.

A ideia é que, sempre que recebermos alguma requisição nesses endpoints, o prometheus contabilize pra gente quantas requisições esses endpoints receberam, entre outras métricas que veremos a seguir.

Vamos ver agora a interface do prometheus que estamos executando pelo Docker na porta 9090

Podemos perceber que o prometheus está observando nossa api no endpont e porta que configuramos, localhost:8888/metrics

Após realizar algumas requisições nos endpoints de listagem de clientes, e busca de cliente por id, podemos ver as seguintes informações no prometheus:

  • Quantidade de requisições por endpoint
quantidade de requisições por endpoint
  • Gráfico de quantidade de requisições por endpoint
Gráfico de quantidade de requisições por endpoint
  • Gráfico que verifica se nossa api está funcionando
Gráfico que verifica se nossa api está funcionando
  • Gráfico que mostra o processamento da CPU por segundo
Gráfico que mostra o processamento da CPU por segundo

Existem diversos tipos de métricas que podemos capturar com o Prometheus, as métricas apresentadas acima são apenas algumas.

Com apenas algumas configurações, podemos tirar métricas valiosas dos nossos serviços com o objetivo de prover disponibilidade e qualidade para os mesmos.

Você deve estar se perguntando, ok entendi, mas e ai?

  • Só conseguimos gerar esse tipo de gráfico?
  • E se eu quiser customizar os gráfico e criar um dashboard com as informações que eu achar importante de forma consolidada, como eu faço isso?

Para responder essas perguntas, eu vou lhe apresentar o Grafana, mas isso será em outro momento, enquanto isso, absorva o conteúdo que discutimos nesse artigo e compartilhe com seus amigos caso ache o tema relevante.

No próximo artigo, iremos entender o que é o Grafana e como podemos configurá-lo para consumir os dados que o Prometheus coleta e como podemos criar e customizar nosso dashboard afim de consolidar todas as informações importantes da nossa api.

Nos vemos no próximo artigo, até lá galera! 😀

Link do projeto no github:

Artigo — Parte 1
Artigo — Parte 3

Referências
https://medium.com/tech-grupozap/prometheus-monitorando-a-sa%C3%BAde-da-sua-aplica%C3%A7%C3%A3o-bd9b3b63e7b1
https://movile.blog/monitoramento-de-servicos-com-prometheus/
https://www.infoq.com/br/articles/prometheus-monitor-applications-at-scale/#:~:text=O%20Prometheus%20%C3%A9%20%C3%B3timo%20para,m%C3%A9tricas%20do%20lado%20do%20servidor.

--

--

Douglas Modesto
Guide Lab

Pos Graduado em Inteligência Artificial e Arquitetura de Software distribuídos apaixonado por tecnologia, aprendendo a aprender ao mesmo tempo que ensina.