Correlation ids cost nothing and answer everything

One identifier, generated at the edge, attached to every log line the request produces in every service — and an incident becomes one query instead of four SSH sessions.

// middleware: accept an inbound one, or make one
$id = $request->header('X-Correlation-Id') ?: bin2hex(random_bytes(8));

// on every outbound call
$this->http->post($url, ['headers' => ['X-Correlation-Id' => $id]]);

// on every dispatched job, or the trail stops at the queue
dispatch((new ProcessOrder($id))->withCorrelation($correlationId));

// and in the response, so a support ticket can quote it

The queue hop is where most implementations lose the thread, and it is exactly the case where tracing matters most — the interesting failure happens on another machine, minutes later. Returning the id in the response and showing it on the error page turns a vague bug report into a lookup. Accepting an inbound header means the trail can start at the load balancer or in a mobile client, which is worth having.