A correlation id that survives a language boundary

Two services generating their own request identifiers means two traces for one request and no way to connect them.

the decision: the edge generates it, everybody reads it,
nobody creates one if it is present.

  nginx    proxy_set_header X-Request-Id $request_id;
  PHP      reads it, logs it, forwards it
  sidecar  reads it, logs it, forwards it

and the field name is identical in both log formats —
trace_id, not traceId, because two spellings are two
fields in any log store.

Deciding where the identifier originates is the whole conversation, and generating it at the edge means one place creates and everybody else propagates. Forwarding is the part that gets missed: a service that logs the id and does not pass it on breaks the chain at exactly the boundary you wanted to see across.