🇧🇷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:
- Exemplo de template: https://grafana.com/grafana/dashboards/3662-prometheus-2-0-overview/
- Clique em Copy ID to clipboard e cole no Grafana. Clique em Load.
- 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
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