Trace Viewer for OpenTelemetry, Jaeger & Zipkin JSON
Open a trace export: waterfall, critical path, self time, N+1 calls and LLM token costs.
Try before you buy.
- Free preview: the waterfall of the first spans (up to 50, at most half) under a MySmartCoPilot mark, with the totals of the whole trace: duration, spans, services and errors.
- Locked until you unlock it: download and copy.
- Unlock: Pro pass, ₹179 for 30 days or ₹79 for 1 week, a one-time payment that never renews. Unlock: Pro pass, $5.99 for 30 days or $2.99 for 1 week, a one-time payment that never renews.
Ways to unlock shows how to get the full result.
Printing this result is locked in the free preview.
Your trace
Or paste the JSON
Totals
Found in the file
Waterfall
Critical path
The chain of work the end of the trace waited for: walking back from the end, the time belongs to the last child to finish, and between children to the parent itself.
Self time
A span’s own time is its duration minus the time its children cover.
By service
By operation
Errors and repeated calls
Error spans
N+1 patterns
LLM and agent spans
Read from the OpenTelemetry GenAI attributes (gen_ai.*, older names included) and OpenInference attributes (llm.*). Messages appear only where your instrumentation recorded them.
Tokens and cost
Compare with another trace
Save and share
Locked in the free preview. Opens the ways to unlock this result.
Locked in the free preview. Batch runs unlock with a pass.
Locked in the free preview. Query results unlock with a pass.
About the Trace Viewer for OpenTelemetry, Jaeger & Zipkin JSON
Open a trace export — OTLP/JSON from an OpenTelemetry collector or SDK (also one request per line, as the collector’s file exporter writes), the JSON the Jaeger UI downloads, or Zipkin v2 JSON — and read it as a waterfall coloured by service, with every span’s attributes, resource, events and links a click away. Files up to about 100 MB are read in a background worker; a file with several traces lists them, and spans whose parent is missing and children that start before their parent (clock skew between hosts) are pointed out.
Beyond the waterfall you get the critical path (the chain of work the end of the trace waited for), self time per service and operation, the error spans, N+1 patterns (five or more similar calls one after another under one parent, database statements grouped with their values replaced), and a comparison with a second trace, operation by operation. Spans that follow the OpenTelemetry GenAI conventions or OpenInference become a readable timeline of model and tool calls with their messages, token totals per model and a cost estimate at the prices you enter.
Nothing is uploaded. Without a pass the result is a free preview: the waterfall of the first spans (up to 50, and at most half of a smaller trace) and the totals of the whole trace; the full waterfall, the tables, the LLM timeline and the exports (SVG and PNG pictures, a Markdown summary, a sanitised copy) unlock with a Pro pass.
How to use it
- Get the trace as a file from your own tools: your collector’s file exporter, the Jaeger UI (a trace’s JSON) or Zipkin (a trace’s JSON). Drop the file here, choose it, or paste the JSON.
- If the file holds several traces, pick one; the largest comes first.
- Read the waterfall: collapse subtrees, find spans by name, service or attribute value, or show errors only. Choose a span to see its attributes, events and links.
- Check the critical path and self-time tables to see where the time went, and the N+1 list for loops of queries.
- For LLM traces, open the messages of each model call and enter the price per million tokens of each model to see what the trace cost.
- To share the trace safely, choose what to redact. With a Pro pass the sanitised copy, the SVG and PNG waterfall and the Markdown summary can be downloaded; the free preview shows the first spans (up to 50, at most half of the trace).
Examples
POST /checkout · 1.84 s · 18 spans in 5 services
Critical path: chat model call 420 ms (22.8%), the failed payment call 410 ms (22.3%), the retry 180 ms … The order service makes 8 sequential SELECT … WHERE order_id = ? AND line_no = ? (248 ms together).
This is the sample trace on this page: try it.
invoke_agent → chat → execute_tool → chat (gen_ai.* attributes)
example-model-large: 2 calls, 2,512 input tokens (2,000 cached), 84 output tokens; at 3 / 0.30 / 15 per million tokens: 0.0034
Redact credentials, prompts, URL query strings, user identity
"http.request.header.cookie": "[REDACTED]", "url.full": "https://shop.example/checkout?session=[REDACTED]&promo=[REDACTED]"
Common uses
- Finding the slow part of a request when the tracing backend is not at hand, or the trace came from a colleague or a customer.
- Spotting N+1 queries and retries that a trace shows but a dashboard hides.
- Reading what an LLM agent did — each model call, tool call and message — and what its tokens cost.
- Comparing a slow and a fast run of the same request, operation by operation.
- Sharing a trace without its cookies, API keys, prompts or customer data.
What the viewer reads
- OTLP/JSON:
resourceSpans→scopeSpans→spans, with hex trace and span ids and times in Unix nanoseconds as strings or numbers, as the OTLP specification defines its JSON encoding. Files with base64 ids (against the spec, but some exporters write them) and the olderinstrumentationLibrarySpansare read too, and the page says so. - Jaeger:
data[]withspans(references,startTimeanddurationin microseconds,tags,logs) andprocesses. This is the format the Jaeger UI uses internally, which Jaeger itself documents as unofficial; Jaeger’s documented v3 query API answers in OTLP/JSON, which is read as OTLP. - Zipkin v2: an array of spans (or of traces) with
traceId,id,parentId,timestampanddurationin microseconds,localEndpoint.serviceName,tagsandannotations.
Times are kept exact to the nanosecond: OTLP’s 19-digit nanosecond values are read as whole numbers before anything is subtracted.
Critical path and self time
The critical path starts at the end of the main root span and walks back: the time belongs to the child that finished last before that point, then — inside that child — to its own last child, and so on; between children it belongs to the parent itself. A child that runs longer than its parent is clipped to its parent first, so asynchronous work and clock skew cannot stretch the path. This is the method the Jaeger UI uses. Self time is a span’s duration minus the time its children cover (overlapping children counted once), which tells you where the work itself happened rather than where it waited.
LLM and agent spans
Model calls are read from the OpenTelemetry GenAI attributes — gen_ai.operation.name, gen_ai.request.model and gen_ai.response.model, gen_ai.usage.input_tokens, gen_ai.usage.output_tokens and gen_ai.usage.cache_read.input_tokens, gen_ai.response.finish_reasons, gen_ai.response.time_to_first_chunk, and the opt-in gen_ai.input.messages, gen_ai.output.messages and gen_ai.system_instructions — and from the names older instrumentations used (gen_ai.system, gen_ai.usage.prompt_tokens, the indexed gen_ai.prompt.0.content and gen_ai.completion.0.content, the gen_ai.content.prompt and gen_ai.content.completion events). OpenInference spans are read from openinference.span.kind, llm.model_name, llm.token_count.prompt and .completion and the indexed llm.input_messages and llm.output_messages. The GenAI conventions are still marked as in development, so names may change; the viewer reads both. Cached input tokens are part of the input count, and are charged at the cached price when you enter one.
Sources
- OTLP specification — the JSON encoding of traces
- GenAI semantic conventions — the gen_ai.* attributes
- OpenInference semantic conventions — the llm.* attributes
- Zipkin API — the v2 span model
- Jaeger APIs — the internal JSON and the v3 query API
Limitations
- The viewer reads exported files; it does not connect to a collector, Jaeger or Zipkin.
- Very large files (hundreds of thousands of spans) take a moment and a good deal of memory on a phone; the waterfall then shows 400 rows at a time. Values longer than 20,000 characters are shortened in the viewer (the sanitised copy keeps them whole).
- Times are shown as the hosts recorded them: clock skew is reported, not corrected.
- The N+1 check groups calls by name or by their database statement; calls whose statements differ in more than their values are not grouped.
- Costs use only the prices you enter; the viewer knows no price list.
- The sanitised copy rewrites attribute values (of spans, resources, events and links); span names, status messages and exception messages stay as they are, so read them before you share the file.
- OTLP times written as JSON numbers instead of strings keep only the precision a JSON number has, about a quarter of a microsecond, in the viewer and in the sanitised copy.
Privacy
On this device: nothing is sent
Everything happens in your browser. What you enter or open here is not uploaded or stored by MySmartCoPilot.
Frequently asked questions
What do I get without a pass?
Without a pass, Trace Viewer for OpenTelemetry, Jaeger & Zipkin JSON shows the waterfall of the first spans (up to 50, at most half) under a MySmartCoPilot mark, with the totals of the whole trace: duration, spans, services and errors. Until you unlock it, the result can’t be downloaded or copied. A Pro, Premium or Ultimate pass, a one-time payment that never renews, unlocks the full result. The pricing page lists the passes and their prices.
Is my trace uploaded?
No. The file is read in your browser (large ones in a background worker of this page) and nothing is sent anywhere. Prices you enter are remembered in this browser only.
How do I get a trace file?
From an OpenTelemetry collector, add the file exporter to the traces pipeline and open the file it writes. In the Jaeger UI, open the trace and download its JSON. In Zipkin, open the trace and download it as JSON. An SDK’s console or OTLP JSON output works too.
Why do some spans start before their parent?
Usually because the two spans were recorded on different hosts whose clocks differ by a few milliseconds. The viewer shows the times as recorded and lists those spans under “Found in the file”.
What is the difference between duration, self time and time on the critical path?
Duration is when a span started and ended. Self time leaves out the time its children cover. Time on the critical path is the part of the span the end of the trace actually waited for — work running in parallel with something slower is not on it.
What does the free preview show?
The waterfall of the first spans — up to 50, and never more than half of the trace — with their details, under a MySmartCoPilot mark, and the totals of the whole trace: duration, spans, services, errors and depth, and what was found in the file. The full waterfall, the critical path and self-time tables, errors and N+1 lists, the LLM timeline and costs, the comparison and the exports need a Pro pass.
Which attributes does the sanitised copy remove?
Those you choose: credentials and cookies (Authorization, Cookie, Set-Cookie, API keys, passwords, tokens), prompts and completions, the values of URL query strings, the values in database statements, user and network identity, and any keys you add (a trailing * matches a prefix). The copy keeps the file’s format, so it opens in the same tools.