Problem
A slow request can pass through many services. People need to see where its time was spent.
Solution
Show each recorded unit of work as a horizontal bar on a shared time axis. Use bar position for start time, length for duration, and indentation for parent-child relationships.
Make overlapping work and gaps easy to inspect. A gap can indicate waiting or work that was not measured; avoid labeling a cause the trace cannot establish.
Let people expand nested work, inspect attributes, and link to related logs. Provide a way to examine short operations that disappear beside much longer ones.
Use when
People need to investigate one request and its recorded work across components or services.
Don’t use when
The question is about the population rather than the instance. One trace is an anecdote; a p99 that moved needs a heatmap or a distribution first, and the waterfall afterwards to explain one example of it.
Trade-offs
One trace may not represent the broader problem. Deep nesting and large differences in duration can hide important operations. Missing measurements and inconsistent clocks can also make the apparent timing misleading.
Checklist
- Can the viewer get here from an aggregate, or must they already have a trace ID?
- Is the root span’s total duration stated as a number, not just a bar?
- Is the gap between a parent and the sum of its children visible or does the layout hide it?
- What happens with several hundred spans, and what is collapsed by default?
- Are errored spans distinguishable at a glance, and does the status field drive that?
- Can the viewer see span attributes without leaving the waterfall?
- Are repeated identical spans grouped, or does one N+1 loop fill the screen?
- Does the axis handle three orders of magnitude, and is a log option available?
- Can this trace be reached from, and get back to, the logs for the same request?
- Is clock skew across hosts handled or at least flagged?
Compare
Jaeger is the reference implementation most people picture and keeps the view deliberately plain: a timeline, a collapsible tree, and span detail on click, with the trace ID as the unit of navigation. Honeycomb treats the waterfall as the last step of an analysis loop rather than an entry point, so you arrive holding a group of events you already narrowed down, and the single trace is evidence for a conclusion rather than a place to start guessing. Datadog links the waterfall to the service it belongs to in both directions, so a slow span carries you back out to that service’s dashboards and monitors. Sentry comes at it from the error rather than the metric, attaching the trace to an exception so the question is why this request failed rather than why it was slow.
Related
Service map combines relationships across requests. Drill-down brings people to a selected trace. Hover detail reveals short attributes without leaving the view.
Percentile summary can identify slow requests worth inspecting. Log tail provides related events.