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.