🇧🇷Criando um Ambiente de Monitoramento com Prometheus e Grafana

🇬🇧 – To read this article in English click here

O monitoramento de aplicações é crucial para garantir que tudo esteja funcionando corretamente e para detectar possíveis problemas rapidamente. Além disso, ele torna suas aplicações muito mais profissionais ao incluir um monitoramento adequado. Neste artigo, vou mostrar como configurar um ambiente de monitoramento utilizando Prometheus e Grafana.

O que é o Prometheus?

O Prometheus é uma ferramenta de monitoramento que coleta e armazena métricas de serviços e aplicações. Ele é popular por sua capacidade de coleta ativa de dados, ou seja, ele mesmo coleta as informações diretamente dos serviços expostos via HTTP, sem depender de envios externos.

Vamos montar um compose.yaml:

services:

  web:

    image: kubedevio/rotten-potatoes:v1

    ports:

      - "8080:5000"

    networks:

      - live_prometheus

    depends_on:

      - mongodb

    environment:

      MONGODB: "admin"

      MONGODB_HOST: "mongodb"

      MONGODB_PORT: "27017"

      MONGODB_USERNAME: "mongouser"

      MONGODB_PASSWORD: "mongopwd"

  mongodb:

    image: mongo:7.0

    volumes:

      - db_mongo:/data/db

    networks:

      - live_prometheus

    environment:

      MONGO_INITDB_ROOT_USERNAME: mongouser

      MONGO_INITDB_ROOT_PASSWORD: mongopwd

  prometheus:

    image: prom/prometheus:v2.47.2

    ports:

      - "9090:9090"

    networks:

      - live_prometheus

    volumes:

      - ./prometheus.yaml:/etc/prometheus/prometheus.yml

    extra_hosts:

      host.docker.internal: 192.168.100.5

  grafana:

    image: grafana/grafana:10.2.2

    ports:

      - "3000:3000"

    networks:

      - live_prometheus

volumes:

  db_mongo:

networks:

  live_prometheus:

    driver: bridge

Nesse arquivo, estamos criando um ambiente Docker com os seguintes serviços:

web:

  • Rodando na porta 8080 e conectado à rede live_prometheus.
  • Esse serviço disponibiliza uma aplicação web de exemplo que expõe métricas da API através do endereço:

Métricas da aplicação web: 8080/metrics.

prometheus:

  • Rodando na porta 9090 e conectado à rede live_prometheus.
  • Esse serviço faz o build da imagem do Prometheus e disponibiliza uma versão web da aplicação.
    • Acesse o Prometheus em localhost:9090. No menu superior, clique em Status > Targets para ver todos os endpoints que o Prometheus está monitorando (ainda nenhum inicialmente).

O Prometheus monitora ele mesmo:

mongodb:

  • Faz o build da imagem do MongoDB, utilizado pela aplicação web.

grafana:

  • Rodando na porta 3000 e conectado à rede live_prometheus.
  • Faz o build da imagem do Grafana, disponibilizando a aplicação web para utilizarmos.

Adicionando o monitoramento da aplicação web no Prometheus:

Vamos adicionar ao projeto um arquivo prometheus.yaml, que será o arquivo de configuração do Prometheus. O Prometheus disponibiliza vários tipos de configurações, mas vamos usar apenas duas:

  • scrape_interval: 15s
  • scrape_timeout: 10s

Significados:

  • scrape_interval: Marca o intervalo de consulta do Prometheus ao endpoint.
  • scrape_timeout: Marca o tempo de espera máximo do Prometheus.
global:

  scrape_interval: 15s

  scrape_timeout: 10s

scrape_configs:

  - job_name: rottenpotatoes

    scrape_interval: 15s

    scrape_timeout: 10s

    static_configs:

      - targets:

          - web:5000

  - job_name: prometheus

    static_configs:

      - targets:

          - localhost:9090

Após configurar o Prometheus, os targets já serão atualizados com a nossa aplicação web em monitoramento.

agora posso escolher quais métricas quero coletar

usando métrica de exemplo (localhost:8080/metrics) na página inicial do prometheus

flask_http_request_duration_seconds_count:

posso filtrar os parâmetros de monitoramento do exemplo

flask_http_request_duration_seconds_count{status=”404″} filtrando somente o que tem status 404

Mas para ver as informações de forma mais profissional eu utilizo o grafana

Conectando o Grafana:

O Grafana é uma plataforma de código aberto para visualização de dados, amplamente utilizada no monitoramento de aplicações e infraestrutura. Ele permite criar dashboards interativos para exibir métricas, logs e alertas em tempo real, provenientes de diversas fontes de dados, como Prometheus, Elasticsearch, InfluxDB, entre outros.

grafana rodando na porta 3000:

usuário: admin

senha: admin

No Grafana:

  • Acesse Menu > Prometheus > Connections > Datasource > Prometheus.
  • Em Connections, insira:
    • http://prometheus:9090

Salve as configurações.

Dessa forma, o Grafana já estará ciente da aplicação web e suas métricas.

Criando dashboard no Grafana:

Para quem não entende de montagem de dashboards no Grafana, a ferramenta disponibiliza vários templates gratuitos para utilização:

  • Configure o datasource para o Prometheus e importe.

Pronto, dashboard criada!

Esse foi apenas um exemplo de como importar dashboards no grafana, mas não vamos utilizar exatamente essa dashboard no nosso monitoramento, então salve e volte ao menu do grafana.

Agora, como pegar as informações da aplicação e exibi-las no grafana?

olhando no repositório da aplicação web

https://github.com/KubeDev/rotten-potatoes

no arquivo:

https://github.com/KubeDev/rotten-potatoes/blob/main/src/app.py

estamos usando

from prometheus_flask_exporter import PrometheusMetrics

da biblioteca do prometheus para expor as métricas e utilizá-las

A importação do PrometheusMetrics no arquivo app.py a partir da biblioteca prometheus_flask_exporter é essencial para expor métricas da aplicação Flask e permitir que o Prometheus as colete e monitore.

Essa biblioteca atua como um integrador entre a aplicação Flask e o Prometheus, fornecendo métricas específicas do comportamento da aplicação, como o tempo de resposta de requisições, contagem de erros, e uso de recursos.

Essa é somente uma das bibliotecas, você pode entrar na documentação oficial do grafana e ler um pouco mais sobre cada uma das bibliotecas de métricas. O importante é preparar a aplicação para expor suas métricas.

no projeto do prometheus_flask_exporter: https://github.com/rycus86/prometheus_flask_exporter

nos temos uma pasta de dashboards com um dashboard no formato json

https://github.com/rycus86/prometheus_flask_exporter/blob/master/dashboards/flask_webapp.json

no grafana, crie um novo dashboard em importar dashboard e coloque o dashboard do projeto

sua dash de monitoramento será monitorada na aplicação

Vamos monitorar de uma fonte diferente?

Monitorando arquivo de métricas do docker:

inclua 

{

  "metrics-addr": "0.0.0.0:9323"

}

no arquivo de configuração do docker

vamos lá:

sudo vim /etc/docker/daemon.json

aperte I e faça o insert

{

  "metrics-addr": "0.0.0.0:9323"

}

em seguida 

:wq!

para salvar

rode

sudo systemctl restart docker

entre em

http://localhost:9323/metrics

e você verá todas as métricas do docker expostas.

inclua no arquivo prometheus.yaml o target do docker

global:

 scrape_interval: 15s

 scrape_timeout: 10s

scrape_configs:

 - job_name: rottenpotatoes

   scrape_interval: 15s

   scrape_timeout: 10s

   static_configs:

     - targets:

         - web:5000

 - job_name: prometheus

   static_configs:

     - targets:

         - localhost:9090

 - job_name: docker <<<<<<<< modificação

   static_configs:

     - targets:

         - host.docker.internal:9323

inicie novamente o compose

docker-compose up -d

o target do docker estará novamente disponível

no grafana, vamos inserir um novo dashboard utilizando template pronto (ensinado anteriormente)

https://grafana.com/grafana/dashboards/9621-docker-registry

perceba que o dashboard já está monitorando nosso docker no target que definimos (host.doker.internal:9223)

esse host.doker.internal foi definido no arquivo de composer, pois o docker roda no ip da nossa maquina e não dentro do container docker como a nossa aplicação web.

voce pode navegar no mesmo dashboard em diferentes targets

(web:5000)

caso tenha alguma dúvida de como uma visualização usa os parâmetros para monitorar métricas, clique nas opções de visualização e em seguida em editar