Problem
The error-rate panel shows zero. Either nothing is failing, or the thing that counts failures is itself down. Those are opposite conclusions and the panel looks identical for both.
Solution
Make failure loud, and make degraded distinct from both healthy and empty. Three states have to be separable on sight: this is fine, this is nothing, this is broken.
The distinction the pattern exists for is that a failed query has no value, and any rendering that produces a number is a lie. A panel that falls back to zero, or holds the last value silently, or averages across a gap, has manufactured data. On an error-rate panel that manufactured value reads as good news.
Staleness is the harder half, because it degrades rather than breaks. Prometheus is precise about the mechanics: an instant query returns the newest sample less than the lookback period ago, five minutes by default, so a metric that stopped arriving four minutes ago still renders and looks current. Past that, a target that went away has its series marked stale, no value is returned, and it disappears from the graph at its last collected sample. Absence is at least visible. The dangerous window is the one in between.
Grafana’s alerting side shows what taking this seriously looks like: No Data is a distinct state with four explicit mappings—Set No Data state, Set Alerting state, Set Normal state, Keep last state—and the default creates a DatasourceNoData instance rather than treating silence as health. The same rigour rarely reaches the panel, where a missing value renders as a hyphen.
Partial failure needs its own answer. A panel querying six series where two sources failed is showing a real chart of incomplete data, which is the most persuasive wrong answer a dashboard can produce. The panel has to say four of six, and it usually says nothing.
NN/g’s first heuristic covers the whole family: keep people informed about what is going on, with appropriate feedback, in reasonable time. A degraded panel that says nothing is failing that in the case where it matters most.
Use when
Always, on anything queried. Especially on any panel whose healthy state is a low number or a zero, where a failure and good news look the same.
Don’t use when
There is no case for skipping it. The only real decision is loudness, and that scales with consequence: a degraded panel on a wallboard driving on-call decisions needs to be unmissable, while one on an exploratory page can be quieter.
Trade-offs
Error states cost space and get designed last, so they are usually a tooltip on an icon nobody hovers. Loud failure on a flaky source produces a page that cries wolf, and viewers learn to ignore the error styling. Holding the last known value is genuinely useful and genuinely dangerous, and the only safe version is one clearly labelled as last-known with its age. And distinguishing all the states—loading, empty, partial, stale, failed—takes five designs for a panel most people only ever design one state of.
Checklist
- Can a failed query ever render as a number, including as zero?
- Is stale visually distinct from current, and does the panel say how old?
- What is the staleness window, and does the display know it?
- On partial failure, does the panel say how many series are missing?
- Is error distinguishable from empty, and empty from healthy-zero?
- Does the error say what failed and what to do, or only that something did?
- Does the failure state survive being seen from across a room?
- If the last known value is shown, is it labelled as such with a timestamp?
- Does a panel failure surface anywhere other than the panel?
- Does the alerting rule on this metric handle no-data the same way the panel does?
Compare
Grafana is two products on this question, and the gap is instructive. Its alerting side makes No Data an explicit four-way decision with a default that refuses to call silence healthy; its panel side renders a missing value as a hyphen by default. Prometheus solves the far end well with stale markers, so a departed target vanishes rather than flatlining, and leaves the five-minute middle to whoever builds the display. Datadog carries monitor status alongside the data so a degraded source can colour the panel from outside the query, rather than the panel having to infer trouble from its own empty result. Netdata makes staleness self-evident through motion: a per-second chart that stops moving is visibly stopped, which is the cheapest honest signal in this whole family.
Related
Empty state is the sibling this pattern is most often confused with, and the confusion is the bug. Loading state is what precedes both. Freshness indicator answers “as of when” before the answer becomes “too old”. Data source badge says which source is the one that failed. Alert rule is what should fire when a panel has been in this state longer than anyone noticed.