How request context survives HTTP, RPC, and direct service-to-service calls and what breaks when propagation is inconsistent.
Trace context propagation across synchronous boundaries is what keeps a request visible when one service directly calls another. In HTTP, RPC, and similar request-response patterns, the boundary looks simple, but the observability failure mode is common: one service emits clean spans and logs, the next service starts a fresh trace, and the end-to-end path fragments even though the business workflow is continuous.
Propagation is therefore not only about passing a header. It is also about making sure middleware, client libraries, proxies, retries, and error handlers preserve the same contextual chain. If any of those layers drop or overwrite context, the trace can appear healthy locally while still being broken globally.
sequenceDiagram
participant Client
participant API
participant Payments
participant Ledger
Client->>API: request + context
API->>Payments: outbound call + propagated context
Payments->>Ledger: outbound call + propagated context
Ledger-->>Payments: response
Payments-->>API: response
API-->>Client: response
The strongest pattern is simple:
Manual propagation can work, but it tends to drift. Middleware, interceptors, or framework hooks are usually safer because they reduce the number of places where developers must remember to forward context by hand.
1sync_propagation_policy:
2 ingress:
3 - extract_trace_context
4 - extract_request_id
5 outbound_http:
6 - inject_traceparent
7 - inject_request_id
8 retries:
9 - preserve_original_trace_context
10 logging:
11 - include_trace_id
12 - include_request_id
During investigation, weak sync propagation often appears as:
The issue is rarely “observability is missing everywhere.” It is more often that one link in the synchronous chain is not respecting context.
If a front-end gateway span exists and a database span exists, but the intermediate service call is missing from the same trace, what is the most likely problem?
The stronger answer is broken synchronous propagation or incomplete instrumentation at the service-to-service boundary. The request path exists, but the trace chain does not.