Talaria

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:

text
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

production

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.

Browser injects traceparent on allowlisted origins. PHP continues the inbound context and injects it on outbound HTTP.

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 / spanId so 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 traceparent on 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 — TalariaHttpClient injects on outbound HTTP.
  • Events — IngestEventInput accepts traceId and spanId so 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 spans

    A 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 dependencies

    Every 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 replay

    Performance without grouping is a chart. Grouping without traces is a stack. Replay without either is a video. Talaria joins all three on one issue.

Turn tracing on

Opt into enableTracing on an official SDK, then inspect transactions next to the issues they belong to.