
Demonstração de tracing distribuído em Rust usando OpenTelemetry, OTLP/HTTP e Jaeger.
Este projeto implementa um exemplo minimalista porém realista de tracing distribuído: uma requisição inicia no “frontend” e é propagada para um “ads-service”, mantendo o mesmo trace e span context. Isso permite visualizar toda a cadeia da requisição dentro do Jaeger.
Este exemplo cobre os elementos fundamentais do ecossistema OpenTelemetry:
O projeto cria spans manualmente utilizando tracing + tracing-opentelemetry, permitindo capturar eventos, atributos e relações parent-child entre spans.
Utilizamos o protocolo OTLP no modo HTTP para enviar os traces diretamente ao Jaeger, sem precisar do OpenTelemetry Collector. Endpoint usado:
http://localhost:4318/v1/traces
O exemplo demonstra distributed tracing real, criando spans em um serviço e propagando o contexto para outro, simulando uma requisição remota.
Toda a estrutura de spans, atributos e hierarquia pode ser visualizada na UI do Jaeger.
frontend (span root)
│
▼
ads-service (span filho)
Cada parte registra seus próprios eventos e atributos, mas sempre vinculados ao mesmo trace.
Use apenas Docker. Sem Docker Compose.
docker run \
-e COLLECTOR_OTLP_ENABLED=true \
-p 16686:16686 \
-p 4317:4317 \
-p 4318:4318 \
jaegertracing/all-in-one:latest
Depois abra:
http://localhost:16686
cargo run
Você verá logs do tipo:
frontend: received request
ads-service: processing ads data
Se o Jaeger estiver rodando, nada quebra e os spans aparecem.
Na UI, procure pelo serviço:
jaeger-http-demo
Você verá:

OTLP é o protocolo nativo do OpenTelemetry. Neste exemplo usamos a versão HTTP, enviando spans diretamente para o Jaeger no endpoint /v1/traces.
Sem Collector intermediário. Jaeger recebe e mostra.
let tracer = global::tracer("jaeger-http-demo");
let root_span = span!(Level::INFO, "frontend", user_id = 42);
prop.inject_context(&cx, &mut injector);
prop.extract(&extractor)
Porque:
Ou seja, é exatamente o conceito de distributed tracing.
Você pode:
#[instrument])Esse projeto já serve como base para aplicações distribuídas reais.