Distributed Tracing in Istio
Envoy creates a trace span for each request. For the trace to be complete across hops:
Service A receives: Service A forwards to B:
x-b3-traceid: abc123 x-b3-traceid: abc123 ← same!
x-b3-spanid: 111 x-b3-spanid: 222 ← new child span
x-b3-parentspanid: (none) x-b3-parentspanid: 111
Services must propagate B3 headers (or W3C TraceContext headers). If a service calls B but doesn't forward trace headers, the trace is broken — B's span appears orphaned.
In Rust with tonic/Axum: use OpenTelemetry's TraceContextPropagator to extract/inject headers.