Rastreamento e Monitoramento: Implementando Tracing com Jaeger, OpenTelemetry, Prometheus, Grafana e Loki
Este projeto tem como objetivo implementar uma solução robusta de rastreamento distribuído e monitoramento de performance utilizando Jaeger, OpenTelemetry, Prometheus, Grafana e Grafana Loki. Através dessa abordagem, buscamos fornecer uma visibilidade completa do comportamento e desempenho de sistemas distribuídos, como microsserviços, ao longo de toda a sua execução, identificando gargalos, falhas e pontos de melhoria.
O projeto foi modificado para usar a arquitetura limpa.
Base: Clean Architecture - Uncle Bob
- Camadas concêntricas com regras de dependência que apontam sempre para o centro.
- Separação clara entre lógica de negócio (núcleo) e infraestrutura.
br.com.cursos
├── application # Casos de uso
│ └── domain # Entidades e regras de negócio
│ └── model
│ └── repository
│ └── usecase
├── infrastructure # Adapters externos (DB, APIs, etc.)
│ └── config
│ └── exceptions # Exceptions da aplicação
│ └── persistence
│ └── service
├── interfaces # Controllers e Gateways
│ └── controller
│ └── dto
│ └── handlersPara executar apenas a aplicação dentro do IntelliJ, por exemplo, execute:
- Execute:
local-start.sh- Será iniciado apenas o banco de dados e Redis em docker (Configuração do banco mais abaixo). - Você poderá executar a aplicação no IntelliJ, pois ele encontrará o banco e o Redis.
Quando você inicia a aplicação via docker, só é possível acessar nos seguintes endereços:
- Swagger da aplicação: http://localhost/swagger-ui/index.html - Não está ok no momento
- Listar cursos: http://localhost/curso
- Exibir curso por ID: http://localhost/curso/c48ab5a0-f363-4723-82ac-67b2377362a0
- Actuator da aplicação: http://localhost/info
- Métricas da aplicação: http://localhost/metrics
- API Actuator/health: http://localhost/health
Acesse: http://localhost:8080/swagger-ui.html.
Também é possível usar o Postman, só obter a collection postman/api-cursos.postman_collection.json.
⚠️ Observação: A API quando é iniciada via docker, só é possível acessar via proxy reverso no nginx. Então o swagger não funcionar direito. Mas você pode usar, quando subir a aplicação localmente sem docker compose. Esse projeto é baseado em estudo no docker compose.
Execute o arquivo cadastrar_cursos.sh, quando a aplicação estiver em execução local, para fazer vários cadastros.
-
Jaeger: Jaeger é uma plataforma de rastreamento distribuído de código aberto que fornece a coleta, o armazenamento e a visualização das traces geradas em sistemas distribuídos. Com o Jaeger, é possível monitorar a jornada de cada requisição, identificar latências e entender o comportamento entre os microsserviços.
-
OpenTelemetry: OpenTelemetry é um framework unificado para coletar dados de observabilidade (tracing, métricas e logs) de diferentes fontes. Ele oferece uma API e bibliotecas para instrumentar as aplicações de forma eficiente e enviar os dados para ferramentas como Jaeger, Prometheus, entre outras.
-
Prometheus: Prometheus é uma ferramenta de monitoramento e coleta de métricas, especialmente útil para sistemas distribuídos. Ele coleta métricas em tempo real de suas aplicações e armazena em um formato de séries temporais. A integração com OpenTelemetry facilita a coleta dessas métricas diretamente das aplicações instrumentadas.
-
Grafana: Grafana é uma plataforma de visualização de dados que se integra com o Prometheus para criar dashboards interativos e ricos, permitindo uma visualização clara de métricas de desempenho. Com o Grafana, é possível construir visualizações de tempo real que ajudam a identificar problemas de performance e monitorar a saúde do sistema.
-
Grafana Loki: Loki é uma ferramenta de agregação de logs desenvolvida pelo time do Grafana. Ele coleta, armazena e consulta logs de forma eficiente, sendo altamente integrado ao Grafana. Isso permite combinar métricas, traces e logs em uma única interface, proporcionando uma visão completa do comportamento do sistema.
-
Rastreamento com Jaeger e OpenTelemetry: OpenTelemetry é utilizado para instrumentar a aplicação, gerando traces que são enviados ao Jaeger, onde são armazenados e visualizados. Isso permite acompanhar a jornada das requisições entre os diferentes microsserviços.
-
Coleta de Métricas com Prometheus: O Prometheus coleta métricas das aplicações instrumentadas via OpenTelemetry, como tempos de resposta, uso de CPU, latência de rede, entre outras, e armazena essas métricas em séries temporais.
-
Visualização com Grafana: O Grafana conecta-se ao Prometheus para visualizar as métricas em dashboards interativos, e também pode ser integrado ao Jaeger para correlacionar as traces com as métricas, facilitando a análise de performance.
-
Logs com Grafana Loki: Os logs gerados pelas aplicações são coletados pelo Loki, sendo visualizados também no Grafana, permitindo que métricas e logs sejam acessados a partir de uma interface única, tornando a análise mais completa e eficiente.
- Visibilidade Completa: A combinação de Jaeger, OpenTelemetry, Prometheus, Grafana e Loki oferece uma visão holística da aplicação, permitindo acompanhar traces, métricas e logs de forma integrada.
- Detecção Proativa de Problemas: Através de tracing e métricas, é possível identificar rapidamente gargalos de desempenho, latências altas ou falhas, facilitando a correção proativa.
- Análise de Performance: As métricas coletadas pelo Prometheus, visualizadas no Grafana, fornecem uma visão clara da performance do sistema, ajudando a otimizar recursos e melhorar a experiência do usuário.
- Centralização de Logs: Com o Grafana Loki, a centralização e consulta de logs torna-se mais eficiente, permitindo a rápida análise em conjunto com as métricas e traces.
- Definições de SLI e SLO
- Definições de thresholds e alertas
- Políticas de respostas a incidentes
- Monitoramento sintético
- Chaos Engineering
- Production Readiness Review (PRR)
Métrica quantitativa que representa o comportamento real de um serviço. Exemplos:
- Latência média de requisições
- Taxa de erro 5xx
- Disponibilidade (%)
“O que estamos medindo?”
Meta quantitativa baseada em um SLI, que define o nível esperado de serviço. Exemplo:
- 99.9% das requisições devem ter latência < 200 ms.
“Qual nível é aceitável?”
-
Threshold: valor limite definido para acionar ações.
- Ex: erro > 1% por 5 minutos.
-
Alerta: notificação gerada quando o threshold é excedido (ex: via Prometheus + Alertmanager, Grafana, etc.).
“Quando devemos reagir?”
Plano documentado para lidar com falhas. Inclui:
- Definição de severidade (sev0–sev4)
- Processo de escalonamento
- Comunicação (internamente e externamente)
- Postmortem e análise de causa raiz
“Como reagimos a falhas e evitamos repetições?”
Execução simulada de interações com o sistema para monitoramento proativo. Exemplo:
- Health checks periódicos em endpoints críticos
- Testes simulando fluxo de usuários (login, pagamento etc.)
“O sistema parece funcional de fora?”
Prática de injetar falhas controladas para validar a resiliência do sistema em produção ou ambientes equivalentes.
Exemplo: desligar instâncias, corromper dados, atrasar respostas.
“Como o sistema reage ao inesperado?”
Checklist técnico de pré-go-live garantindo que o serviço está pronto para produção. Verifica:
- Logs, métricas, tracing
- Alarmes configurados
- Testes automatizados
- Procedimentos de rollback
- Conformidade de segurança
“Estamos preparados para colocar isso em produção?”
PgAdmin 4 é uma interface gráfica de administração para o PostgreSQL, um dos sistemas de gerenciamento de banco de dados relacionais mais populares. Ele é utilizado para facilitar a interação e administração do banco de dados PostgreSQL de maneira intuitiva e visual.
Usamos o banco de dados Postgresql. Para acessar o pgadmin4: localhost:5050/. Para logar, veja no docker-compose ou use:
- 👤 Login: user@domain.com
- 🔑 Passowrd: 112358
Depois, precisamos nos registrar no servidor conforme passos abaixo:
Neste ícone, vamos nos registrar no servidor postgres, para ter acesso as bases de dados.
- 🌐 Server name: database-api-cursos
- 🖥️ Host name/address: database-api-cursos
- 👤 Username: postgres
- 🔑 Password: postgres
Ao executar a shell ./start.sh, após subida do banco, os comandos abaixo são executado automaticamente para a criação do banco:
docker exec -it database-api-cursos psql -U postgres -c "CREATE DATABASE cursosdb WITH OWNER = postgres ENCODING = 'UTF8' LC_COLLATE = 'en_US.utf8' LC_CTYPE = 'en_US.utf8' LOCALE_PROVIDER = 'libc' TABLESPACE = pg_default CONNECTION LIMIT = -1 IS_TEMPLATE = False;"
docker exec -it database-api-cursos psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE cursosdb TO postgres;"Para testar local, faça e execute:
Descomente a linha do docker compose referente a porta do banco e do redis, pois eles só funcionam internamente conforme arquitetura.
database-api-cursos:
ports:
- "5432:5432"
cache-api-cursos:
ports:
- 6379:6379Execute:
mvn spring-boot:run -Dspring-boot.run.profiles=dev
⚠️ Observação: Quando executar apenas via docker, comente novamente e acesse via nginx.
Prometheus é uma ferramenta de monitoramento e alerta de código aberto, usada principalmente para coletar e armazenar métricas de sistemas e serviços. Ele é amplamente utilizado para monitorar aplicações, como Spring Boot e outras APIs, fornecendo informações detalhadas sobre o desempenho e a saúde do sistema.
Para acessar o prometheus via nginx (proxy): localhost/prometheus.
Para acessar o prometheus sem proxy, descomente a porta no docker-compose e acesse: localhost:9090.
A API do projeto exibe os dados do actuator e prometheus: localhost/metrics.
Sem liberar a porta no docker-compose, acesse: localhost:8080/actuator/prometheus.
⚠️ Observação: Para configurar o prometheus.yml para acessar externamente a API, foi configurado o endereço do host da minha máquina local, exemplo:192.168.0.160:8080. Se você subir sua API em um docker, user o mesmo network e ocontainer_namedesse container.
Grafana é uma plataforma de visualização de dados e monitoramento de código aberto que permite criar dashboards interativos e gráficos a partir de métricas e logs de sistemas, aplicações e infraestrutura. Ele é amplamente utilizado para analisar e visualizar dados em tempo real e é frequentemente usado em conjunto com ferramentas como Prometheus, Elasticsearch, Loki e outros sistemas de coleta de métricas e logs.
Podemos acessar o grafana pelo endereço: localhost:3000/login. Com os acessos:
- 👤 Login: admin
- 🔑 Passowrd: admin
⚠️ Observação: No primeiro acesso, será solicitado a troca de senha.
Acessando o grafana, seguir os passos:
- Acessar "Data sources" no menu --> Add data sources
- Selecione "Prometheus"
- Name: prometheus
- Prometheus server URL: http://prometheus-api-cursos:9090 | A comunicação é entre "conteineres"
- Clicar no botão
Save & testno final da página | A mensagemSuccessfully queried the Prometheus API.deve aparecer
- Acessar "Data sources" no menu --> Add data sources
- Selecione "Loki"
- Name: loki
- Prometheus server URL: http://loki-api-cursos:3100 | A comunicação é entre "conteineres"
- Clicar no botão
Save & testno final da página | A mensagemData source successfully connected.deve aparecer
Já temos um template do dashboard da API Cursos. Seguir os passos para importar:
- Acesse http://localhost:3000/dashboards do Grafana
- Clique em
Import a dashboard - Importe o json:
template/api-cursos-dashboard.json, que está dentro do projeto - Escolha o name e o folder que quiser, e depois
Import
⚠️ Dando tudo certo, você já verá algumas informações da API em execução.
Grafana Loki é uma ferramenta de agregação e consulta de logs de código aberto, projetada para trabalhar de forma integrada com o Grafana. Ao contrário de outras soluções de logs, o Loki foi criado para ser simples, eficiente e escalável, com foco na otimização de armazenamento e consulta.
Para acesar o jaeger, use o link: localhost:16686/jaeger
Jaeger é uma ferramenta open-source para tracing distribuído, usada para monitorar e depurar transações em arquiteturas de microsserviços. Ele permite rastrear requests enquanto passam por múltiplos serviços, identificando gargalos de performance e falhas.
- Distributed Context Propagation: mantém o contexto de uma requisição entre serviços.
- Root Cause Analysis: identifica a origem de erros e lentidão.
- Performance / Latency Optimization: ajuda a medir e otimizar tempos de resposta.
- Service Dependency Analysis: mapeia dependências entre serviços.
- Monitoring & Alerting: integração com dashboards para observabilidade.
- Jaeger Client Libraries:
Instrumentam serviços para enviar spans (unidades de tracing) para o collector. - Agent:
Recebe spans dos clientes via UDP e os envia para o Collector. - Collector:
Recebe spans do Agent, processa e armazena no backend (Ex: Elasticsearch, Cassandra, Kafka). - Query:
API para consultar spans armazenados. - UI:
Interface web para visualização de traces e análise de performance.
- Suporta OpenTracing e OpenTelemetry.
- Pode ser integrado com Java, Go, Python, Node.js, entre outros.
- Suporta envio de spans via HTTP/Thrift/GRPC.
- Diagnóstico de latência em chamadas inter-serviços.
- Análise de falhas e exceções em microsserviços.
- Mapeamento de dependências complexas em sistemas distribuídos.
docker run --rm proxy-api-cursos cat /etc/os-releaseRetorno:
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"Entre no container e digite:
docker exec -it f30577e0c792226993439a22f7773fbecd94411796ebe1609adc3e35469799af bash
cat /etc/os-release
