In the request · 3 min read · Updated 2026-08-14
Distributed tracing with W3C Trace Context
One trace ID from the browser, through PHP, into the query that failed — carried on a standard header named traceparent.
A frontend span and a backend span are useless next to each other if they do not share an identity. Distributed tracing is that identity, propagated on the wire. In 2026 the wire format is not a vendor header. It is W3C Trace Context.
The problem
Users experience one action. Your architecture is at least two processes: a browser and an API, often a worker behind that. If each SDK invents its own X-Request-Id, you can grep logs and still not open one waterfall. Correlation IDs are necessary and insufficient.
What it is
W3C Trace Context defines traceparent as:
00-{traceId}-{spanId}-{flags}Version 00, a 32-character hex trace ID, a 16-character hex parent span ID, and flags (sampled is the bit that matters). tracestate is optional vendor baggage. Talaria parses inbound traceparent before falling back to X-Request-Id. We do not invent a X-Talaria-Trace header.
Trace context
W3C traceparent
00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
Browser
pageload + fetch
API
GET /checkout
MySQL
SELECT orders
Same trace ID on every hop. The span ID in the header is the parent the next service attaches to.
What it gives a team
- A single waterfall from click to SQL when both sides use a Talaria SDK (or OTLP into the same project).
- Errors that carry
traceId/spanIdso View trace on an event is not a search problem. - Interoperability. Anything that already speaks W3C can participate without a Talaria-specific contract.
How Talaria does it
- Browser — injects
traceparenton same-origin and allowlisted fetch/XHR when tracing is on. - PHP / Silverstripe — middleware extracts inbound context, starts or continues the server transaction, and Guzzle injects on outbound calls.
- Dart / Flutter —
TalariaHttpClientinjects on outbound HTTP. - Events —
IngestEventInputacceptstraceIdandspanIdso exceptions join the waterfall.
How to read it
If you see two roots with different trace IDs for one user action, injection failed (origin not allowlisted, tracing off on one side, or a proxy stripping headers). If you see one trace with a browser pageload and a PHP server span as siblings instead of parent/child, the server started a new root instead of continuing — usually missing or malformed traceparent.
Turn it on
Enable tracing on both the browser and the server SDK. Allowlist the API origin in the browser SDK if it is cross-origin. Confirm the API does not strip unknown headers.
What this is not
Context propagation does not create a mesh. Services that are not instrumented appear only as client spans on the caller (dependencies). Tail sampling across a fleet still needs a collector. Baggage beyond trace identity is not a Talaria product feature.
Related guides
Signals · 3 min
Transactions, traces, and spansA trace is one request’s path. A span is a timed unit of work. A transaction is the root span Talaria meters.
In the request · 3 min
External dependenciesEvery outbound call is a peer: HTTP hosts, databases, Redis, queues. Watch their error rate and p95 the same way you watch your own routes.
Triage loop · 3 min
From error to trace to replayPerformance without grouping is a chart. Grouping without traces is a stack. Replay without either is a video. Talaria joins all three on one issue.