# Error and stale state > One panel's query failed and the viewer must not mistake it for a zero. - Canonical: https://patterns.konigi.com/dashboards/error-and-stale-state - Group: Product mechanics - Level: implementation - Status: published - Updated: September 10, 2026 - Also called: data source down, partial data, degraded panel --- ## 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. ## Examples ### Grafana (Grafana Labs) The reference implementation for panel grids, template variables, and stat panels; most other tools are defined by how they differ from it. **Grafana SLO / SLO Overview** — captured September 10, 2026, Grafana Play (signed out; no version string exposed). tactical, dense density, dark theme, desktop-web. Twenty-eight objectives, each a row carrying a 28-day indicator, the budget remaining, and a sparkline. The budget column is where it comes apart. Four rows read −1900%, −1815%, −1093% and −463%. A budget is the amount of failure an objective permits, so it bottoms out at −100% and everything past that is the display reporting how wrong the target was rather than how broken the service is. Those four sit in the same column, in the same type, as a row reading 99.8%. Two rows above them an objective reports "No data" in the same red, which is a third thing again and looks like the second. Meanwhile eleven rows sit at exactly 100.0% with a full budget—objectives that cannot fire. The sparkline column is scaled per row, so one row's axis runs 0 to 200% and its neighbour's runs 96 to 100, and the shapes are not comparable down the page even though the layout invites exactly that. Hotspots in this capture: - [Metric targets](https://patterns.konigi.com/dashboards/metric-targets) — The budget column: the derived quantity that turns a target from a binary into a rate. - [Target and progress](https://patterns.konigi.com/dashboards/target-and-progress) — Budget left, −1900%. Past −100% the number is measuring the objective, not the service. - [Error and stale state](https://patterns.konigi.com/dashboards/error-and-stale-state) *(this pattern)* — No data, in the same red as a breach. A third state wearing the second one's colour. - [Small multiples](https://patterns.konigi.com/dashboards/small-multiples) — A column of sparklines, each on its own axis. One runs 0–200%, the next 96–100%. - [Header KPI strip](https://patterns.konigi.com/dashboards/header-kpi-strip) — Five tiles counting targets, objectives and series. None of them says whether any of it is met. **Linux node / fleet overview** — captured September 9, 2026, Grafana Play (signed out; no version string exposed). operational, medium density, dark theme, desktop-web. Captured while Play's demo data source was returning nothing, which makes this a better example of empty and error states than of the fleet overview it is meant to be. Three things are worth noticing. The top-left tile is red and reads "No metrics received - Check configuration", which is an actual diagnosis and the best thing on the page. The tile beside it exists to report when data last arrived, and it says "No data", so the freshness indicator has no freshness to report and doesn't say why. And every chart below says "No data" while the network panel says "No errors". A viewer scanning this page cannot tell from the words alone whether the network is clean or whether it is as unknown as everything else, which is the exact confusion the empty-state pattern exists to prevent. Hotspots in this capture: - [Header KPI strip](https://patterns.konigi.com/dashboards/header-kpi-strip) — Three status tiles across the top, before any chart. - [Error and stale state](https://patterns.konigi.com/dashboards/error-and-stale-state) *(this pattern)* — Red, and it names the cause: no metrics received, check configuration. - [Freshness indicator](https://patterns.konigi.com/dashboards/freshness-indicator) — The tile whose job is 'as of when', reporting No data instead. - [Data source badge](https://patterns.konigi.com/dashboards/data-source-badge) — Integration version, the only tile on the row still able to answer. - [Empty state](https://patterns.konigi.com/dashboards/empty-state) — No data, centred, with no distinction from a genuine zero. ## Related patterns - [Empty state](https://patterns.konigi.com/dashboards/empty-state) — There's nothing to show, and the page has to say why and what to do. - [Loading and skeleton state](https://patterns.konigi.com/dashboards/loading-state) — Forty panels are querying and the page shouldn't look broken for two seconds. - [Freshness indicator](https://patterns.konigi.com/dashboards/freshness-indicator) — The viewer is about to act on a number and doesn't know how old it is. - [Data source badge](https://patterns.konigi.com/dashboards/data-source-badge) — The viewer needs to know where a panel's data comes from and whether that source is healthy. - [Alert rule attached to panel](https://patterns.konigi.com/dashboards/alert-rule) — The chart shows the line to watch; the viewer wants to be told when it's crossed. ## Sources - [Grafana, No Data and Error states in alerting](https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rule-evaluation/nodata-and-error-states/) - [Prometheus, Querying basics (staleness and the lookback delta)](https://prometheus.io/docs/prometheus/latest/querying/basics/) - [Nielsen Norman Group, Visibility of System Status](https://www.nngroup.com/articles/visibility-system-status/) --- Screenshots on patterns.konigi.com are reproduced for commentary and criticism. Product names and marks belong to their owners.