When the Dashboards Lie: Stale and Cached Metrics During an Outage
Diagnose the incident-response failure mode where dashboards show stale, cached, or frozen metrics during an outage — misleading responders into chasing the wrong cause. Detect, verify, and prevent it.
- #incident-response
- #sre
- #troubleshooting
Stuck on this Incident Response error? Get the free incident triage checklist
A one-page PDF — the exact steps to isolate, fix, and verify a production error like this one. No spam, unsubscribe anytime.
Overview
One of the most dangerous incident-response failure modes is not a system that is down — it is a dashboard that is wrong. During an outage, responders trust their observability stack implicitly. But dashboards can lie: they freeze on the last data point before a metrics pipeline stalled, serve cached panels that are minutes old, drop the very data points you need because the monitoring system is degraded by the same event, or render a gap as flatline-green. The responder, staring at reassuring numbers, concludes the wrong thing — and either stands down too early or chases a phantom while the real problem burns.
This is a process-and-tooling failure mode, not a code error. The core hazard is misplaced trust in the signal. When your monitoring shares fate with your production systems — same network, same cloud region, same time-series database under the same load — the moment you most need accurate telemetry is exactly the moment it is most likely to be stale or missing. Teams that survive these incidents have learned to treat the dashboard as a claim to be verified, not ground truth, and to build observability that fails loudly rather than silently freezing on a comforting lie.
Symptoms
Suspect stale or lying dashboards when:
- Metrics look suspiciously flat. A perfectly horizontal line during a chaotic incident usually means “no new data,” not “perfectly stable.”
- The dashboard timestamp or “last updated” is minutes old while the incident is unfolding in real time.
- Graphs contradict reality. Error rate reads near-zero while customers, support tickets, and synthetic checks all say the service is down.
- Panels disagree with each other. One dashboard shows a spike, another shows nothing, because they query at different resolutions or from different (partially failed) data sources.
- A metrics gap renders as green. A drop in data points is displayed as “healthy” rather than “unknown,” hiding the outage window.
- Alerts never fired for an incident customers clearly felt — because the alerting pipeline was starved of the same data the dashboards were.
Common Root Causes
- Monitoring shares fate with production. The metrics pipeline runs in the same region, network, or cluster as the failing system, so the outage degrades observability too.
- Time-series database saturation. During a load spike, the TSDB (Prometheus, etc.) falls behind on ingestion or times out on queries, so panels serve stale or partial data.
- Caching layers in the dashboard tool. Query caches or CDN-fronted panels serve results from before the incident began.
- Scrape/agent failures. The collector or exporter on the affected hosts stopped reporting, so the last successful value is held or the series simply ends.
- Misleading gap handling. Panels configured to connect nulls or default missing data to zero paint an outage as a healthy flatline.
- Push-metric buffering. Systems that push metrics buffer them locally during a network partition, so data arrives late and out of order — or never.
- Client-side or browser caching of a dashboard tab left open from before the incident.
Diagnostic Workflow
The meta-skill here is verifying your instruments before trusting them.
1. Confirm the data is live before believing it. Check the freshness of the metric itself, not just the panel. In Prometheus, query how long ago each series last reported:
# Seconds since each target last successfully scraped
time() - timestamp(up)
# Targets that are down or not reporting at all
up == 0
A large or growing value means the dashboard is showing you history, not now.
2. Check the health of the monitoring pipeline itself. Look at the TSDB’s own metrics for ingestion lag, dropped samples, and query timeouts:
# Prometheus falling behind on scrapes / rejecting samples
rate(prometheus_target_scrapes_sample_out_of_order_total[5m])
scrape_duration_seconds > 5
rate(prometheus_tsdb_head_samples_appended_total[1m]) # flat = ingestion stalled
If the monitoring stack is unhealthy, treat every dashboard downstream of it as suspect.
3. Triangulate with an independent signal. Never resolve an incident on a single, possibly-frozen dashboard. Cross-check against sources that do not share fate with the metrics pipeline: external synthetic checks, the load balancer’s own logs, a manual curl of the endpoint, customer reports, or the cloud provider’s status.
# Independent ground-truth probe, run from outside the affected environment
curl -w 'code=%{http_code} total=%{time_total}s\n' -o /dev/null -s https://api.example.com/health
4. Bypass the cache. Force a fresh query: hard-refresh the dashboard, shorten the time range to the last few minutes, drop any query cache, and re-run the underlying query directly against the data source rather than through the cached panel.
5. Read gaps as “unknown,” not “fine.” When you see a flatline, explicitly ask whether it is a real steady state or an absence of data. Configure panels to render nulls as gaps so this is visible rather than hidden.
Example Root Cause Analysis
Incident: A payments API outage lasted 22 minutes, but the on-call initially declared it a false alarm. The primary Grafana dashboard showed error rate flat at ~0.1% and request throughput steady throughout the window.
Investigation: Customer complaints and the external synthetic monitor (running from a different provider) both showed hard failures. The team found that the incident began with a network partition in the affected availability zone. The Prometheus server also ran in that AZ; its scrapes of the payment pods timed out, so the last successful sample was held and the throughput panel — configured to connect nulls — drew a smooth line across the gap. Error rate looked low because almost no new failure samples were being ingested; the requests failing hardest never made it into the metrics at all. Alerting was starved of the same data, which is why no alert fired.
Root cause: Shared-fate observability plus misleading gap handling. The monitoring pipeline was degraded by the same partition as the service, and the dashboard rendered missing data as healthy rather than unknown.
Remediation: Prometheus was moved to remote-write into a store outside the production AZ, with a dead-man’s-switch alert that fires when the metrics pipeline itself goes quiet. Panels were reconfigured to render nulls as gaps and to show a “no recent data” warning when series go stale. External synthetic monitoring became the required independent ground truth for declaring or standing down on customer-facing incidents.
Prevention Best Practices
- Break shared fate. Run the monitoring pipeline (or at least a copy via remote-write) outside the blast radius of the systems it watches — different region/account/provider.
- Add a dead-man’s switch. Alert when the metrics pipeline goes silent, so an absence of data pages you instead of hiding as green.
- Render missing data as gaps, never zero. Configure dashboards so “no data” is visually distinct from “healthy.”
- Show freshness on every critical panel. Surface a “last updated / data age” indicator so responders can see at a glance whether they are looking at now or history.
- Always keep an independent ground-truth signal. External synthetics, LB logs, and manual probes that do not depend on your TSDB let you verify what the internal dashboards claim.
- Right-size and protect the TSDB. Ensure your metrics store has headroom so it does not fall behind precisely when load spikes.
- Train responders to distrust flatlines. Make “verify the signal is live” a standard first move in triage, not an afterthought.
Quick Reference
| Signal | What it usually means | First action |
|---|---|---|
| Perfectly flat line during chaos | No new data, not stability | Query time() - timestamp(up) for data age |
| Dashboard vs. customer reality mismatch | Metrics pipeline degraded | Trust the independent signal; verify TSDB health |
| Panels disagree with each other | Different sources/resolutions, partial failure | Re-run queries directly; check each data source |
| Error rate ~0 during an outage | Failing requests not being sampled | Cross-check LB logs and synthetics |
| Gap shown as green/flatline | Null-as-zero rendering | Re-read as “unknown”; reconfigure to show gaps |
| No alert fired for a real outage | Alerting starved of data | Add a dead-man’s-switch on pipeline silence |
Conclusion
During an incident, your dashboards are witnesses, and witnesses can be confidently wrong. Stale, cached, and frozen metrics send responders down the wrong path or lull them into standing down while customers suffer — precisely because monitoring so often shares fate with the systems it watches. The defense is a habit and an architecture: verify the signal is live before you trust it, keep at least one independent ground-truth source outside the blast radius, make missing data fail loudly instead of rendering as reassuring green, and page on the silence of your metrics pipeline itself. Trust your instruments only after you have confirmed the instruments are telling the truth.
Fixed it? Get 500 Incident Response & DevOps AI prompts — free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.
Did this fix your issue?
Get 500 Battle-Tested DevOps AI Prompts — Free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.