Jaeger: o que é, como funciona e como usar na prática
Quando uma requisição atravessa dezenas de microsserviços antes de retornar uma resposta ao usuário, identificar onde ocorre um gargalo de latência se torna um desafio real. É nesse cenário que entra o Jaeger, uma plataforma open source de rastreamento distribuído criada para dar visibilidade ao caminho completo de cada transação.
Neste artigo, você vai entender o que é o Jaeger, como ele funciona internamente, quais são seus componentes principais e como ele se integra ao ecossistema moderno de observabilidade. Também vamos comparar com alternativas como Zipkin e Grafana Tempo e mostrar como instalar na prática.
Se a sua equipe trabalha com arquiteturas distribuídas e precisa de diagnóstico rápido em produção, este guia reúne tudo o que você precisa saber para começar.
O que é Jaeger
Jaeger é uma plataforma de rastreamento distribuído de código aberto, projetada para monitorar e diagnosticar transações em sistemas baseados em microsserviços. O nome vem do alemão e significa “caçador”, uma referência à sua função de rastrear o fluxo de requisições entre serviços.
O projeto nasceu em 2015 dentro da Uber Technologies para resolver problemas de visibilidade em sua arquitetura de centenas de microsserviços. Em 2017, foi doado à Cloud Native Computing Foundation como projeto de incubação e alcançou o status de graduado em 2019, consolidando-se como uma das ferramentas mais adotadas para tracing no ecossistema cloud-native.
Na prática, o Jaeger coleta dados de rastreamento gerados pelas aplicações e os organiza em uma interface visual que permite analisar a sequência de chamadas entre serviços, medir a latência de cada etapa e identificar onde ocorrem falhas ou degradações de performance.
Para que serve o Jaeger
O Jaeger resolve problemas que ferramentas tradicionais de monitoramento não conseguem endereçar sozinhas. Em uma arquitetura monolítica, um stack trace geralmente aponta a causa raiz de um erro. Em microsserviços, a mesma requisição pode passar por dez ou mais serviços antes de falhar, tornando a investigação manual inviável.
Os principais casos de uso incluem:
➡️ Análise de latência: o Jaeger mostra exatamente quanto tempo cada serviço leva para processar sua parte de uma requisição. Se uma API responde em 2 segundos, o trace revela que 1,5 segundo está concentrado em uma chamada ao banco de dados de um serviço intermediário.
➡️ Análise de causa raiz: quando um erro ocorre em produção, os traces mostram o caminho exato que a requisição percorreu e em qual serviço a falha se originou, eliminando a necessidade de analisar logs dispersos manualmente.
➡️ Mapeamento de dependências: o Jaeger gera grafos de dependência entre serviços automaticamente. Isso permite visualizar quais serviços se comunicam entre si e identificar pontos únicos de falha na arquitetura.
➡️ Otimização de performance: comparando traces de requisições rápidas com lentas, equipes de engenharia identificam padrões de degradação e priorizam otimizações com base em dados concretos.
Arquitetura e componentes do Jaeger
A arquitetura do Jaeger é modular e foi projetada para escalar horizontalmente em ambientes de produção com alto volume de dados. Cada componente tem uma responsabilidade específica dentro do pipeline de coleta e análise de traces.
➡️ Collector: recebe spans enviados pelas aplicações instrumentadas (via SDK ou OpenTelemetry Collector), valida os dados e os persiste no backend de armazenamento escolhido. Em ambientes de alto throughput, é possível executar múltiplas instâncias do Collector com um balanceador de carga à frente.
➡️ Storage Backend: o Jaeger suporta diferentes backends de armazenamento. Os mais utilizados são Elasticsearch (para buscas complexas e retenção longa), Cassandra (para alta taxa de escrita e escalabilidade horizontal) e Kafka (como buffer intermediário antes da persistência final).
➡️ Query Service: expõe uma API REST e gRPC que permite buscar traces por ID, por serviço, por operação ou por intervalo de tempo. É o componente que alimenta a interface web.
➡️ UI (Interface Web): painel visual onde os operadores analisam traces individuais, comparam traces lado a lado e exploram o grafo de dependências entre serviços. A interface mostra cascatas de spans com duração, tags e logs associados.
➡️ All-in-One: para desenvolvimento local e testes, o Jaeger oferece um binário único que inclui todos os componentes com armazenamento em memória. Não é recomendado para produção, mas é ideal para experimentação rápida.
Como o Jaeger funciona
O funcionamento do Jaeger se baseia em dois conceitos fundamentais do rastreamento distribuído: spans e traces.
Um span representa uma unidade lógica de trabalho dentro de um serviço. Cada span contém um nome de operação, timestamps de início e fim, tags (metadados como http.method=GET) e logs de eventos. Quando um serviço chama outro, o span pai propaga o contexto de rastreamento para o span filho.
Um trace é a coleção de todos os spans relacionados a uma mesma requisição. O trace conecta spans de diferentes serviços através de um identificador único (Trace ID) que é propagado em headers HTTP ou mensagens de fila ao longo de toda a cadeia de chamadas.
A propagação de contexto é o mecanismo que garante a continuidade do trace entre serviços. Quando o serviço A chama o serviço B via HTTP, o Trace ID e o Span ID são injetados nos headers da requisição. O serviço B extrai esses identificadores e cria seus próprios spans como filhos do span recebido.
Na interface do Jaeger, cada trace é visualizado como uma cascata temporal (waterfall view) onde é possível ver a sequência de spans, suas durações e a relação de parentesco entre eles.
Jaeger e OpenTelemetry
O OpenTelemetry (OTel) é o padrão aberto para instrumentação de aplicações e coleta de telemetria. Desde 2023, o Jaeger migrou oficialmente para o OpenTelemetry como método recomendado de instrumentação, depreciando seus SDKs nativos (jaeger-client) em favor dos SDKs do OTel.
Isso significa que hoje a forma correta de enviar dados ao Jaeger é instrumentar sua aplicação com os SDKs disponíveis para cada linguagem e configurar o exportador OTLP (OpenTelemetry Protocol) para enviar spans diretamente ao Jaeger Collector.
O Jaeger 2.0, lançado no final de 2024, aprofundou essa integração. Nessa versão, o backend do Jaeger foi reconstruído sobre o OpenTelemetry Collector, o que significa que o Jaeger Collector agora é essencialmente um OTel Collector com extensões específicas para armazenamento e consulta de traces. Essa mudança simplifica a operação e permite que equipes que já utilizam o OTel Collector adotem o Jaeger sem duplicar infraestrutura.
Na prática, o pipeline moderno funciona assim: a aplicação instrumentada com OTel SDK gera spans e os exporta via OTLP. O Jaeger Collector (baseado em OTel Collector) recebe os spans, processa e persiste no backend de armazenamento. O Query Service e a UI permitem consultar e visualizar os dados.
Jaeger vs. Zipkin vs. Grafana Tempo
Uma dúvida frequente ao adotar rastreamento distribuído é qual backend escolher. As três opções open source mais relevantes são Jaeger, Zipkin e Grafana Tempo, cada uma com características distintas.
➡️ Jaeger oferece a interface mais completa para exploração de traces, com visualização em cascata, comparação lado a lado e grafo de dependências. É o projeto mais maduro da CNCF para tracing e tem forte integração com o ecossistema Kubernetes.
➡️ Zipkin é o pioneiro do rastreamento distribuído open source, inspirado no paper Dapper do Google. Possui uma interface simples e uma API leve. É mais adequado para equipes que precisam de uma solução rápida de implementar, mas oferece menos funcionalidades avançadas de análise que o Jaeger.
➡️ Grafana Tempo é a opção mais recente e foi projetada desde o início para armazenar traces usando apenas object storage (como S3 ou GCS), o que reduz significativamente o custo operacional. Integra-se nativamente com Grafana, Loki e Prometheus, formando a stack de observabilidade completa da Grafana Labs.
Para equipes que já utilizam o ecossistema Grafana, o Tempo pode ser a escolha mais natural. Para quem precisa de uma UI dedicada para análise profunda de traces e já opera em Kubernetes, o Jaeger tende a ser a opção mais robusta.
Como instalar o Jaeger
A forma mais rápida de experimentar o Jaeger é utilizando o modo all-in-one via Docker:
docker run -d --name jaeger -p 16686:16686 -p 4317:4317 -p 4318:4318 jaegertracing/jaeger:latest
Esse comando inicia todos os componentes do Jaeger em um único container. A porta 16686 expõe a interface web, enquanto as portas 4317 (gRPC) e 4318 (HTTP) recebem dados via OTLP. Após iniciar, acesse http://localhost:16686 para abrir a UI.
Deploy em Kubernetes com Helm
Para ambientes de produção, o Jaeger oferece um operador Kubernetes e charts Helm oficiais. O deploy com Helm segue este fluxo:
helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
helm install jaeger jaegertracing/jaeger --set storage.type=elasticsearch
O Jaeger Operator automatiza a gestão do ciclo de vida dos componentes, incluindo escalabilidade do Collector e rotação de índices no Elasticsearch. A documentação oficial do operador detalha as opções de configuração para cada cenário.
Boas práticas para Jaeger em produção
Rodar o Jaeger em produção exige atenção a três aspectos fundamentais: estratégia de amostragem, escolha do storage backend e escalabilidade.
Estratégias de amostragem (sampling)
Em ambientes com alto volume de requisições, coletar 100% dos traces é inviável por questões de custo e performance. O Jaeger suporta diferentes estratégias de sampling:
Probabilístico: coleta uma porcentagem fixa dos traces (ex: 1%). Simples de configurar, mas pode perder traces de requisições raras ou com erro.
Rate limiting: coleta um número fixo de traces por segundo por serviço. Útil para garantir cobertura mínima sem sobrecarregar o backend.
Adaptive (remoto): ajusta dinamicamente a taxa de amostragem com base no volume de cada operação. Operações de baixo volume são amostradas com taxa maior, garantindo representatividade.
Escolha do storage backend
Para produção, a escolha do backend depende do perfil de uso. Elasticsearch é recomendado quando a equipe precisa de buscas complexas por tags e retenção de dados por semanas. Cassandra é indicada para cenários de altíssima taxa de escrita onde a busca avançada não é prioridade. Kafka como buffer intermediário protege o backend de picos de ingestão.
Escalabilidade
O Collector é o componente que mais exige atenção. Em ambientes com milhares de serviços, é recomendável executar múltiplas réplicas do Collector atrás de um load balancer. O Query Service pode ser escalado de forma independente conforme a demanda de consultas da equipe.
Logs, métricas e traces unificados para diagnóstico em profundidade.
Instrumentamos aplicações corporativas com OpenTelemetry para correlacionar eventos e acelerar a análise de causa raiz em produção.
Conclusão
O Jaeger é uma ferramenta essencial para qualquer equipe que opera microsserviços em produção e precisa de visibilidade sobre o comportamento real das suas transações distribuídas. Com sua arquitetura modular, integração nativa com OpenTelemetry e interface poderosa para análise de traces, ele se consolidou como referência no ecossistema cloud-native.
A evolução para o Jaeger 2.0, construído sobre o OpenTelemetry Collector, reforça que o caminho para observabilidade moderna passa pela padronização com OTel. Independentemente do backend escolhido, instrumentar suas aplicações com OpenTelemetry garante flexibilidade para o futuro.
Se a sua organização precisa de apoio para implementar rastreamento distribuído, instrumentação com OpenTelemetry ou uma estratégia completa de observabilidade, fale com os especialistas da OpServices e descubra como podemos acelerar essa jornada.

