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.
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.
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.
Read the Waterfall
Each bar starts where the span began and is as long as it ran. Indentation shows which span called which.
Find the Slow Span
Summary lists the spans with the most self time. The table adds kind, status and self time for every span.
Check What Failed
Errors shows each failed span, its status message and any exception event, from the deepest cause upward.
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.
“{"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"}]}]}]}”
“{"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"}]}]}]}”
“{"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"}}]}]}]}]}]}”
“{"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"}}}]}”
“[{"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"}}]”
“{"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"}]}]}]}”
“{"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"}]}]}]}”
“{"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"}]}]}]}”
“{"traceId":"5b8efff798038103","name":"GET /cart","timestamp":"2026-10-25T09:14:02Z"}”
“{"resourceSpans":[{"scopeSpans":[{"spans":[{"traceId":"5b8efff798038103d269b633813fc60c","spanId":"eee19b7ec3c1b174","name":"GET /cart","startTimeUnixNano":"2026-10-25T09:14:02Z","endTimeUnixNano":"2026-10-25T09:14:02.048Z"}]}]}]}”
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.
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?”
spanId
8 bytes, or 16 hex characters, unique within the trace. Children point at it.
“How long is a span ID in hex?”
parentSpanId
The span that caused this one. Empty on the root span, the first span of the request.
“Which span has no parent?”
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?”
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?”
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?”
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?”
attributes
Key-value details such as http.response.status_code or db.system, named by the semantic conventions.
“Which attribute names the database?”
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?”
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.
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.
Stacked Bars Mean Parallel Work
Children that overlap ran at the same time, so the slowest one sets the pace, not the total.
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.
Client Versus Server Spans
When a client span is much longer than the matching server span, the difference is network, queueing or connection setup.
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.
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.
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.
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.
Sampled Out Spans
Head sampling decides per service, so mismatched settings drop parts of a trace. Missing parents are marked.
Spans That Never Ended
A span not ended in code is never exported. Its children then look like orphans.
Microseconds Versus Nanoseconds
OTLP uses nanoseconds and Jaeger and Zipkin microseconds. Mixing them up makes spans a thousand times too long or short.
High-Cardinality Span Names
Names that include IDs make every span unique, which breaks grouping in your tracing backend.
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.