— Developer Tools

Free OpenTelemetry Trace Viewer

Paste a trace as OTLP, Jaeger or Zipkin JSON to see its spans as a waterfall, where the time went, and what failed.

— Samples
Spans 7Services 3Errors 3Valid
Live

What is an OpenTelemetry Trace Viewer?

A trace records one request’s path through your services as spans, each with a start, an end and a parent. This viewer turns trace JSON into a waterfall, so you can see what ran when, what waited on what, and where the time went.

It reads OTLP JSON from the OpenTelemetry Collector and Grafana Tempo, Jaeger’s JSON download and Zipkin v2 span arrays. Times are kept to the nanosecond, the tree is rebuilt from parent IDs, and each span’s self time excludes the time its children covered.

Key Features

Span Waterfall

Spans are drawn as bars on one timeline, nested under their parents, with failed spans marked.

Self Time per Span

Summary ranks spans by time not spent in children, which points at the code that was actually slow.

Errors and Exceptions

Errors lists every failed span with its status message and the exception type and message recorded on it.

Three Trace Formats

OTLP, Jaeger and Zipkin JSON are detected automatically, including base64 IDs from protobuf JSON.

Traces Stay Private

Trace files are read in your browser, so URLs, queries and attributes in them aren’t uploaded.

Perfect for everyone

  • Backend and platform engineers debugging latency
  • SREs reviewing incidents
  • Developers instrumenting services with OpenTelemetry

How to Use the OpenTelemetry Trace Viewer

Export a trace, paste it, and switch between the three views.

1

Export the Trace

Use the Collector’s file exporter, download JSON from Jaeger’s trace page, or fetch a trace from the Tempo or Zipkin API.

2

Read the Waterfall

Each bar starts where the span began and is as long as it ran. Indentation shows which span called which.

3

Find the Slow Span

Summary lists the spans with the most self time. The table adds kind, status and self time for every span.

4

Check What Failed

Errors shows each failed span, its status message and any exception event, from the deepest cause upward.

Worked Examples

Traces, Read

Each row is a trace file in one of the three formats, and every answer is this viewer’s output in the mode on the chip. Guess the slowest span before you reveal it.

REF_001Waterfall, OTLP

“{"resourceSpans":[{"resource":{"attributes":[{"key":"service.name","value":{"stringValue":"frontend"}}]},"scopeSpans":[{"spans":[{"traceId":"5b8efff798038103d269b633813fc60c","spanId":"eee19b7ec3c1b174","name":"GET /cart","kind":2,"startTimeUnixNano":"1792919642000000000","endTimeUnixNano":"1792919642048600000"}]}]},{"resource":{"attributes":[{"key":"service.name","value":{"stringValue":"cart"}}]},"scopeSpans":[{"spans":[{"traceId":"5b8efff798038103d269b633813fc60c","spanId":"1f0f4bd7a3c58e21","parentSpanId":"eee19b7ec3c1b174","name":"GET /cart/items","kind":2,"startTimeUnixNano":"1792919642003200000","endTimeUnixNano":"1792919642044100000"},{"traceId":"5b8efff798038103d269b633813fc60c","spanId":"7a85c2e9d0b41f63","parentSpanId":"1f0f4bd7a3c58e21","name":"redis GET","kind":3,"startTimeUnixNano":"1792919642004000000","endTimeUnixNano":"1792919642005100000"}]}]}]}”

REF_002Summary, OTLP

“{"resourceSpans":[{"resource":{"attributes":[{"key":"service.name","value":{"stringValue":"frontend"}}]},"scopeSpans":[{"spans":[{"traceId":"5b8efff798038103d269b633813fc60c","spanId":"eee19b7ec3c1b174","name":"GET /cart","kind":2,"startTimeUnixNano":"1792919642000000000","endTimeUnixNano":"1792919642048600000"}]}]},{"resource":{"attributes":[{"key":"service.name","value":{"stringValue":"cart"}}]},"scopeSpans":[{"spans":[{"traceId":"5b8efff798038103d269b633813fc60c","spanId":"1f0f4bd7a3c58e21","parentSpanId":"eee19b7ec3c1b174","name":"GET /cart/items","kind":2,"startTimeUnixNano":"1792919642003200000","endTimeUnixNano":"1792919642044100000"},{"traceId":"5b8efff798038103d269b633813fc60c","spanId":"7a85c2e9d0b41f63","parentSpanId":"1f0f4bd7a3c58e21","name":"redis GET","kind":3,"startTimeUnixNano":"1792919642004000000","endTimeUnixNano":"1792919642005100000"}]}]}]}”

REF_003Errors, timeout with exception event

“{"resourceSpans":[{"resource":{"attributes":[{"key":"service.name","value":{"stringValue":"checkout"}}]},"scopeSpans":[{"spans":[{"traceId":"0af7651916cd43dd8448eb211c80319c","spanId":"b7ad6b7169203331","name":"POST /api/orders","kind":2,"startTimeUnixNano":"1792919642000000000","endTimeUnixNano":"1792919643250400000","status":{"code":2,"message":"upstream timeout"}},{"traceId":"0af7651916cd43dd8448eb211c80319c","spanId":"c1d2e3f4a5b6c7d8","parentSpanId":"b7ad6b7169203331","name":"charge card","kind":3,"startTimeUnixNano":"1792919642002100000","endTimeUnixNano":"1792919643248900000","status":{"code":2},"events":[{"name":"exception","timeUnixNano":"1792919643248700000","attributes":[{"key":"exception.type","value":{"stringValue":"TimeoutError"}},{"key":"exception.message","value":{"stringValue":"no response after 1200 ms"}}]}]}]}]}]}”

REF_004Waterfall, Jaeger download

“{"data":[{"traceID":"3f2a9c","spans":[{"traceID":"3f2a9c","spanID":"3f2a9c","operationName":"GET /","references":[],"startTime":1792919642000000,"duration":31200,"processID":"p1"},{"traceID":"3f2a9c","spanID":"8b1d07","operationName":"render home","references":[{"refType":"CHILD_OF","spanID":"3f2a9c"}],"startTime":1792919642002400,"duration":26100,"processID":"p1"}],"processes":{"p1":{"serviceName":"web"}}}]}”

REF_005Waterfall, Zipkin v2

“[{"traceId":"86154a4ba6e91385","id":"86154a4ba6e91385","name":"get /users/42","timestamp":1792919642000000,"duration":64000,"kind":"SERVER","localEndpoint":{"serviceName":"api"}},{"traceId":"86154a4ba6e91385","parentId":"86154a4ba6e91385","id":"4d1e00c0db9010db","name":"select users","timestamp":1792919642004000,"duration":52000,"kind":"CLIENT","localEndpoint":{"serviceName":"api"},"tags":{"db.system":"mysql"}}]”

REF_006Summary, parent span missing

“{"resourceSpans":[{"resource":{"attributes":[{"key":"service.name","value":{"stringValue":"worker"}}]},"scopeSpans":[{"spans":[{"traceId":"d4cda95b652f4a1592b449d5929fda1b","spanId":"6e0c63257de34c92","parentSpanId":"f067aa0ba902b7ff","name":"process job","kind":5,"startTimeUnixNano":"1792919642000000000","endTimeUnixNano":"1792919642840000000"},{"traceId":"d4cda95b652f4a1592b449d5929fda1b","spanId":"a3ce929d0e0e4736","parentSpanId":"6e0c63257de34c92","name":"resize image","kind":1,"startTimeUnixNano":"1792919642012500000","endTimeUnixNano":"1792919642790000000"}]}]}]}”

REF_007Waterfall, parallel calls

“{"resourceSpans":[{"resource":{"attributes":[{"key":"service.name","value":{"stringValue":"search"}}]},"scopeSpans":[{"spans":[{"traceId":"9e107d9d372bb6826bd81d3542a419d6","spanId":"aa11bb22cc33dd44","name":"GET /search","kind":2,"startTimeUnixNano":"1792919642000000000","endTimeUnixNano":"1792919642120000000"},{"traceId":"9e107d9d372bb6826bd81d3542a419d6","spanId":"bb22cc33dd44ee55","parentSpanId":"aa11bb22cc33dd44","name":"query products","kind":3,"startTimeUnixNano":"1792919642005000000","endTimeUnixNano":"1792919642098000000"},{"traceId":"9e107d9d372bb6826bd81d3542a419d6","spanId":"cc33dd44ee55ff66","parentSpanId":"aa11bb22cc33dd44","name":"query reviews","kind":3,"startTimeUnixNano":"1792919642005200000","endTimeUnixNano":"1792919642061400000"},{"traceId":"9e107d9d372bb6826bd81d3542a419d6","spanId":"dd44ee55ff660077","parentSpanId":"aa11bb22cc33dd44","name":"query prices","kind":3,"startTimeUnixNano":"1792919642005300000","endTimeUnixNano":"1792919642110900000"}]}]}]}”

REF_008Summary, self time of parallel calls

“{"resourceSpans":[{"resource":{"attributes":[{"key":"service.name","value":{"stringValue":"search"}}]},"scopeSpans":[{"spans":[{"traceId":"9e107d9d372bb6826bd81d3542a419d6","spanId":"aa11bb22cc33dd44","name":"GET /search","kind":2,"startTimeUnixNano":"1792919642000000000","endTimeUnixNano":"1792919642120000000"},{"traceId":"9e107d9d372bb6826bd81d3542a419d6","spanId":"bb22cc33dd44ee55","parentSpanId":"aa11bb22cc33dd44","name":"query products","kind":3,"startTimeUnixNano":"1792919642005000000","endTimeUnixNano":"1792919642098000000"},{"traceId":"9e107d9d372bb6826bd81d3542a419d6","spanId":"cc33dd44ee55ff66","parentSpanId":"aa11bb22cc33dd44","name":"query reviews","kind":3,"startTimeUnixNano":"1792919642005200000","endTimeUnixNano":"1792919642061400000"},{"traceId":"9e107d9d372bb6826bd81d3542a419d6","spanId":"dd44ee55ff660077","parentSpanId":"aa11bb22cc33dd44","name":"query prices","kind":3,"startTimeUnixNano":"1792919642005300000","endTimeUnixNano":"1792919642110900000"}]}]}]}”

REF_009A single span, not a trace file

“{"traceId":"5b8efff798038103","name":"GET /cart","timestamp":"2026-10-25T09:14:02Z"}”

REF_010ISO dates instead of nanoseconds

“{"resourceSpans":[{"scopeSpans":[{"spans":[{"traceId":"5b8efff798038103d269b633813fc60c","spanId":"eee19b7ec3c1b174","name":"GET /cart","startTimeUnixNano":"2026-10-25T09:14:02Z","endTimeUnixNano":"2026-10-25T09:14:02.048Z"}]}]}]}”

Span Fields

What’s Inside an OpenTelemetry Span

An OTLP span carries a few required fields and several optional ones. These ten are the ones that shape the waterfall.

01 / TRACEID

traceId

16 bytes, written as 32 hex characters in OTLP JSON. Every span of one request shares it.

“How long is a trace ID in hex?”

02 / SPANID

spanId

8 bytes, or 16 hex characters, unique within the trace. Children point at it.

“How long is a span ID in hex?”

03 / PARENTSPANID

parentSpanId

The span that caused this one. Empty on the root span, the first span of the request.

“Which span has no parent?”

04 / NAME

name

A low-cardinality label such as GET /orders/:id, not the full URL. Similar operations should share a name.

“Should a span name contain an order ID?”

05 / KIND

kind

Server, client, producer, consumer or internal. It says whether the span handled a request, made one, or did local work.

“Which kind makes an outgoing HTTP call?”

06 / STARTTIMEUNIXNANO

startTimeUnixNano and endTimeUnixNano

Nanoseconds since 1970, written as strings in JSON because they’re too large for a JavaScript number.

“Why are times strings in OTLP JSON?”

07 / STATUS

status

Unset, OK or Error, with an optional message. Instrumentation sets Error, and OK is usually set only by application code.

“What status does a successful span usually have?”

08 / ATTRIBUTES

attributes

Key-value details such as http.response.status_code or db.system, named by the semantic conventions.

“Which attribute names the database?”

09 / EVENTS

events

Timestamped records inside a span. An event named exception carries exception.type, exception.message and the stack trace.

“What is an exception recorded as?”

10 / SERVICENAME

service.name

A resource attribute shared by every span from one process. It’s how traces are split by service.

“Is service.name a span or resource attribute?”

Where Trace JSON Comes From

Most tracing tools can export a trace as JSON. These are the sources this viewer reads.

OpenTelemetry Collector

The file exporter writes one OTLP JSON object per line. Paste a single line, which holds one batch of spans.

OTLP over HTTP

Request bodies sent to /v1/traces with the JSON content type are OTLP JSON, so a captured payload pastes straight in.

Grafana Tempo

The trace by ID API returns OTLP JSON with batches of resource spans, which reads the same way.

Jaeger

The Download JSON option on a trace page writes the data and processes shape, with times in microseconds.

Zipkin

The v2 API returns a flat array of spans with parentId, timestamp and duration in microseconds.

Console Exporters

SDK console exporters print each language’s own span format, not OTLP. Use an OTLP file or HTTP exporter instead.

How to Read a Waterfall

The shape of the bars says more than any single number. Look for these patterns.

Tip 01

A Staircase Means Sequential Calls

Children that start as the previous one ends ran one after another. Running independent calls in parallel can shorten the request.

Tip 02

Stacked Bars Mean Parallel Work

Children that overlap ran at the same time, so the slowest one sets the pace, not the total.

Tip 03

Gaps Are Untraced Time

Space inside a parent with no child bar is the parent’s own work, or work nobody instrumented. Self time measures it.

Tip 04

Client Versus Server Spans

When a client span is much longer than the matching server span, the difference is network, queueing or connection setup.

Tip 05

Many Tiny Repeated Spans

Dozens of identical short queries under one span usually mean an N+1 query that a single batch call would replace.

Tip 06

A Long Tail After the Last Child

Time between the last child ending and the parent ending is spent after the calls, often serialising a large response.

Span Attributes Worth Checking First

OpenTelemetry’s semantic conventions give common attributes fixed names, so the same detail is in the same place in every service. These say the most about a slow or failed span.

http.request.method and url.path

What a server span handled. Older instrumentation writes http.method and http.target instead.

http.response.status_code

The status sent or received. A 5xx on a server span marks it as failed, while a 4xx usually doesn’t.

server.address and server.port

Where a client span was sent. A different host than expected often explains a slow call.

db.system and db.query.text

The database and the statement, if capture is on. Compare repeated statements to spot N+1 queries.

rpc.system and rpc.method

gRPC and other RPC calls, with the service and method that a client span called.

messaging.system and messaging.destination.name

Queue and topic details on producer and consumer spans, such as kafka and the topic name.

error.type

A short class of failure, such as timeout or a status code, set when an operation ends in error.

Tracing Pitfalls

When a trace looks wrong, the cause is often in how it was collected, not in the service.

Tip 01

Clock Skew Between Hosts

Each service stamps its own spans, so a child can appear to start before its parent. Keep hosts synced with NTP.

Tip 02

Broken Context Propagation

If a service doesn’t forward the traceparent header, its spans start a new trace. They’ll show up as separate traces here.

Tip 03

Sampled Out Spans

Head sampling decides per service, so mismatched settings drop parts of a trace. Missing parents are marked.

Tip 04

Spans That Never Ended

A span not ended in code is never exported. Its children then look like orphans.

Tip 05

Microseconds Versus Nanoseconds

OTLP uses nanoseconds and Jaeger and Zipkin microseconds. Mixing them up makes spans a thousand times too long or short.

Tip 06

High-Cardinality Span Names

Names that include IDs make every span unique, which breaks grouping in your tracing backend.

Tip 07

Sensitive Attributes

SQL text, URLs and headers recorded as attributes can carry personal data. Redact them in the Collector before export.

When to View a Trace File

Whenever you have trace JSON but not the UI it came from.

Sharing a Trace in an Incident

Pass a trace file to a colleague without access to your tracing backend, and look at it together.

Checking New Instrumentation

Export from a local Collector and confirm spans nest correctly, carry service names and end on time.

Debugging the Collector Pipeline

Read what the Collector actually received or exported, before processors or the backend change it.

Comparing Tracing Formats

See the same request from Jaeger and OTLP sources side by side while migrating to OpenTelemetry.

Attaching Evidence to a Bug

Download the summary or waterfall and attach it to a ticket so the slow span is obvious.

Frequently Asked Questions