# Freshness indicator > The viewer is about to act on a number and doesn't know how old it is. - Canonical: https://patterns.konigi.com/dashboards/freshness-indicator - Group: Meta information - Level: implementation - Status: published - Updated: September 10, 2026 - Also called: last updated, stale-data warning, live pulse --- ## Problem Someone is about to page an engineer, approve a refund, or tell a room of people what the number is. They can see the value. They cannot see whether it describes right now or twenty minutes ago, and the two lead to different decisions. ## Solution There are three different times involved, and most dashboards surface at most one of them: 1. When the page last ran its queries 2. When the underlying data last arrived 3. What window the value actually covers The first is easy and nearly useless on its own. A dashboard set to refresh every thirty seconds is giving the viewer feedback about the dashboard, not about the data, and a refresh that succeeds against a stalled pipeline produces a confidently current-looking page full of old numbers. The second is the one that matters and the one that fails quietly. Prometheus is precise about this: an instant query returns the newest sample less than the lookback period ago, five minutes by default, tunable with `--query.lookback-delta`. So a value that arrived four minutes ago and one that arrived four seconds ago render identically. Nothing on the panel distinguishes them. The failure mode at the far end is better behaved. When a target goes away, its series is marked stale, no value is returned, and it disappears from the graph at its last collected sample. Absence is at least visible. The dangerous case is the middle: a source that is degraded rather than dead, still inside the lookback window, still drawing. Nielsen's first heuristic is the general form. Keep people informed about what is going on, through appropriate feedback, within a reasonable amount of time. On a dashboard the thing they need informing about is the data's age, not the page's. ## Use when Any number someone will act on inside minutes, and any number shown on a screen the viewer didn't personally load. Wallboards especially, because nobody in the room knows when the tab was opened. ## Don't use when Never skip it outright, but scale it down. On a monthly strategic report the cadence is understood and a loud "updated 4 seconds ago" is noise pretending to be rigour. ## Trade-offs Relative timestamps read well and depend on the viewer's clock, which on a wallboard PC nobody has looked at in a year is its own hazard. Absolute timestamps are honest and force a timezone decision. A green "live" dot is the most common lie in this pattern: it usually means a socket is open, not that data is arriving, and it survives exactly the failure it appears to rule out. And the freshness display can itself go stale, which is the joke that writes itself and still ships. ## Checklist - Does this show when the data arrived, or only when the page refreshed? - If the source went quiet five minutes ago, what does the panel look like? What about an hour? - Is a stale value visually distinguishable from a current one, or only from a missing one? - What is the expected arrival cadence, and does the indicator know it well enough to say "late"? - Does a "live" indicator track data arriving, or just a connection being open? - Relative or absolute time, and whose clock and timezone is it using? - On a wallboard, can someone across the room tell whether the page is current? - Does auto-refresh mask staleness by making the page feel alive? - When a query fails, does the last good value stay on screen, and is it labelled as last-good? - Who notices if the freshness indicator itself stops updating? ## Compare **Grafana** puts a refresh interval on the dashboard and reports on itself: the control tells you the page will re-query every thirty seconds, and says nothing about whether anything new arrived when it did. **Netdata** sidesteps the display entirely by drawing per second, so freshness is legible as motion and a frozen chart is its own alarm. **Sentry** works in events rather than samples, so "last seen" is a property of the issue and travels with it into the list, the detail view, and the alert. **Honeycomb** makes the question mostly disappear by being query-first: you asked for a window, the answer is that window, and there is no ambient "now" quietly drifting underneath the result. ## Related Data source badge answers where, which is the other half of the provenance question. Error and stale state is what should happen once the answer to "how old" becomes "too old". Time-range picker sets the window the number covers, which is the third of the three times above. Loading state is the moment before this one. KPI tile is the container that most often shows a number with no age attached to it at all. ## 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. **Where The Cool Dashboards Live / Chicago L Trains** — captured September 10, 2026, Grafana Play (signed out; no version string exposed). wallboard, sparse density, dark theme, wall. A live departures board for one platform, built out of stat panels against the CTA Train Tracker API, and it is the clearest wallboard in the gallery: four rows, type large enough to read across a concourse, no chrome inside the board and nothing to hover. The next train gets three times the height of the three behind it, which is the layout saying "start here" without a word of copy. The interesting problem is the colour. Pink, Green and Orange are the CTA's own line colours, inherited from the world outside the screen and already known to every rider—which is the best possible reason to use a palette. But the status chip beside them is also green when a train is on time, so on the second row "Cottage Grove" is green because it is the Green Line and "On Time" is green because it is on time, side by side, meaning two unrelated things. Hotspots in this capture: - [Wallboard mode](https://patterns.konigi.com/dashboards/wallboard-mode) — The next train, three times the height of the rest. Readable at ten feet with no pointer. - [Panel grid](https://patterns.konigi.com/dashboards/panel-grid) — Rows two to four at a third the size. Panel size is carrying the priority. - [Semantic status color](https://patterns.konigi.com/dashboards/semantic-status-color) — Green for on time, next to green for the Green Line. One hue, two unrelated jobs, one row. - [Freshness indicator](https://patterns.konigi.com/dashboards/freshness-indicator) *(this pattern)* — A countdown rather than a clock time, which is the right call and hides how old the feed is. - [Data table](https://patterns.konigi.com/dashboards/data-table) — The raw feed under the board, including the rgb string each line colour came from. **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) — Red, and it names the cause: no metrics received, check configuration. - [Freshness indicator](https://patterns.konigi.com/dashboards/freshness-indicator) *(this pattern)* — 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. ### Honeycomb Query-first; heatmaps and BubbleUp replace the dashboard-of-panels model with draw-a-region cross-filtering. **Query / HEATMAP(duration_ms)** — captured September 10, 2026, Honeycomb sandbox, public dataset (signed out; no version string exposed). analytical, medium density, light theme, desktop-web. My heatmap entry cites Honeycomb as the argument for log-scale y-buckets, so it's worth recording that this is Honeycomb's own sandbox rendering the same chart on a linear axis. The result is the failure the argument warns about: the ticks run 0 to 3500 evenly, the dense band where almost every request actually lives is squashed into the bottom sixth of the panel, and the top half is mostly empty. What survives anyway is the thing a percentile can't tell you. The solid band under a second doesn't move across the whole window, while from about 07:00 a separate purple tail climbs to 3000ms and keeps going. Two populations, one of them fine and one of them deteriorating. A p95 line over this data would have risen and said nothing about which. The other thing worth stealing: the footer reports elapsed query time and that it examined 11,710,335 rows, so the panel tells you what it cost and how much it looked at. Cookie banner and a no-signup onboarding modal were removed to take the shot; nothing of the product's own UI was. Hotspots in this capture: - [Heatmap](https://patterns.konigi.com/dashboards/heatmap) — Linear y-axis, so the band holding most requests is six percent of the panel height and the empty top half gets the rest. - [Dashboard builder](https://patterns.konigi.com/dashboards/dashboard-builder) — No panel to configure—the query is the page. WHERE trace.parent_id does-not-exist is how you say root spans only. - [Tabs as genres](https://patterns.konigi.com/dashboards/tabs-as-genres) — Five readings of one result: overview, BubbleUp, correlations, traces, raw. Each tab is a different question, not a different subject. - [Search across panels](https://patterns.konigi.com/dashboards/search-across-panels) — The schema is the navigation, and it opens with a filter box rather than a tree you're expected to browse. - [Time-range picker](https://patterns.konigi.com/dashboards/time-range-picker) — Absolute, with the granularity stated beside it, and arrows that step to the previous window rather than retyping it. - [Data source badge](https://patterns.konigi.com/dashboards/data-source-badge) — Elapsed query time and 11,710,335 rows examined. The panel reporting its own cost and scope, which almost nothing else does. - [Freshness indicator](https://patterns.konigi.com/dashboards/freshness-indicator) *(this pattern)* — When data last arrived, not when the page last ran. The one of the three ages that actually matters. ### Netdata Per-second charts, hundreds per node, with a per-chart anomaly ribbon instead of a band on the series. **Metrics / System** — captured September 10, 2026, Netdata Agent v2.10.0-686-nightly (public registry node, signed out). operational, dense density, dark theme, desktop-web. Structurally the opposite of Grafana, and worth the comparison. Nobody built this page. The right rail says "showing 720 of total 720 charts" and the tree beneath it—System, Compute, Memory, Storage, Network, Hardware, Processes, then Apps, Users, Groups, O/S Services, and every application it found—is generated from what the agent collects. The canvas is the same hierarchy rendered downward, four levels deep, headings prefixed with dashes: System, then Compute, then CPU, then the chart. There is no editorial layer at all, which means nothing is missing and nothing is prioritised. The header also does something most products won't: it reports "Live 1, Stale 8" beside the node count, so eight of the nine machines behind this view are not currently reporting and the page says so rather than drawing their last known values. Hotspots in this capture: - [Sidebar and canvas](https://patterns.konigi.com/dashboards/sidebar-and-canvas) — The rail is the dashboard. A generated tree of every metric family the agent found. - [Search across panels](https://patterns.konigi.com/dashboards/search-across-panels) — 720 charts, so search is the navigation and the tree is the filing system nobody browses. - [Header KPI strip](https://patterns.konigi.com/dashboards/header-kpi-strip) — Twelve tiles in two rows, in four different layouts. It reads as twelve things rather than one strip. - [Gauge and dial](https://patterns.konigi.com/dashboards/gauge) — Arcs for disk reads and writes, where the maximum is invented—this is a rate, not a capacity. - [Semantic grouping](https://patterns.konigi.com/dashboards/semantic-grouping) — Sections generated by the collector rather than chosen. Consistent, and about nothing in particular. - [Freshness indicator](https://patterns.konigi.com/dashboards/freshness-indicator) *(this pattern)* — Live 1, Stale 8. Most products would have drawn all nine and said nothing. - [Dashboard builder](https://patterns.konigi.com/dashboards/dashboard-builder) — A query builder inline in the panel header: group by, aggregation, node and dimension count. - [Compare periods](https://patterns.konigi.com/dashboards/compare-periods) — Offered per chart rather than per dashboard, which is the scoping trap: one panel shifted, the rest not. ## Related patterns - [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. - [Error and stale state](https://patterns.konigi.com/dashboards/error-and-stale-state) — One panel's query failed and the viewer must not mistake it for a zero. - [Time-range picker](https://patterns.konigi.com/dashboards/time-range-picker) — Every question about a metric starts with 'over what window', and the control has to be fast for the common windows. - [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. - [KPI tile](https://patterns.konigi.com/dashboards/kpi-tile) — A person needs to know the current value of one number, and whether it's fine, before they look at anything else. ## Sources - [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/) - [Grafana, Use dashboards (refresh and time controls)](https://grafana.com/docs/grafana/latest/visualizations/dashboards/use-dashboards/) --- Screenshots on patterns.konigi.com are reproduced for commentary and criticism. Product names and marks belong to their owners.