Context propagation is the whole of distributed tracing

Instrumenting each service produces disconnected traces. Passing the trace context between them is what makes it one trace, and it is the part that breaks.

// outbound HTTP: W3C traceparent
$this->http->withHeaders([
    'traceparent' => $this->tracer->currentContextHeader(),
])->post($url, $payload);

// and the queue, which is where it is always lost
dispatch((new ProcessOrder($id))->withTraceContext($header));

// version-traceid-spanid-flags
// 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01

The queue hop is where most implementations lose the thread, and it is exactly the case where tracing matters most — a request that enqueues work and returns is the request whose failure is hardest to explain. The W3C header format became a recommendation in February 2020, which is what makes cross-vendor propagation possible at all. Without propagation, tracing is per-service profiling with extra infrastructure.