Dashboards and queries: the observability cost that runs while nobody watches
An auto-refreshing dashboard is a scheduled job that bills every thirty seconds forever. Most teams have dozens, half of them unopened for months. Here is what they cost.
Quick answer
Query cost is a separate meter most teams never look at. CloudWatch Logs Insights charges $0.005 per GB scanned, so a query sweeping a 90-day window of a log group ingesting 100 GB/day scans 9,000 GB and costs $45 per execution. On a 30-second auto-refresh that is 86,400 runs per month and $3.9 million in theory, which is why dashboards must use narrow time windows. CloudWatch dashboards themselves are $3.00 per month beyond the first three. The rule: dashboards should read pre-aggregated metrics, never raw log scans.
Everyone understands that ingesting data costs money. Far fewer teams track what it costs to look at the data, and on log platforms that second meter can exceed the first. A dashboard is not a passive view. It is a scheduled query that executes on a timer, in the background, in every open browser tab, whether or not a human is reading it.
The query meters
| Service | Query charge |
|---|---|
| CloudWatch Logs Insights | $0.005 per GB scanned |
| CloudWatch dashboards | $3.00 per dashboard-month over 3 |
| CloudWatch GetMetricData API | $0.01 per 1,000 metrics requested |
| Azure Monitor search jobs | ~$0.005 per GB scanned |
| Amazon Athena | $5.00 per TB scanned |
| Managed Prometheus queries | ~$0.10 per billion samples processed |
| Amazon Managed Grafana | $9 per editor, $5 per viewer per month |
The GetMetricData row deserves a moment. At $0.01 per 1,000 metrics requested, a dashboard with 40 widgets each pulling 25 metrics requests 1,000 metrics per refresh, costing $0.01 each time. On a 10-second refresh that is 259,200 refreshes per month and $2,592 for a single dashboard. This is a real and frequently encountered bill, and it comes entirely from a refresh-interval dropdown.
Log scan arithmetic
Logs Insights bills on bytes scanned, and the scan is determined by the time range and the log groups selected, not by how selective your filter is. A filter that matches three lines still scans every byte in the window.
| Time range on a 100 GB/day log group | Bytes scanned | Cost per run |
|---|---|---|
| 15 minutes | ~1.04 GB | $0.005 |
| 1 hour | ~4.2 GB | $0.021 |
| 24 hours | 100 GB | $0.50 |
| 7 days | 700 GB | $3.50 |
| 30 days | 3,000 GB | $15.00 |
| 90 days | 9,000 GB | $45.00 |
Now put that on a refresh timer. A dashboard widget running a 7-day Logs Insights query on a 5-minute refresh executes 8,640 times per month at $3.50, which is $30,240 per month for one widget. Teams do discover this, usually about six weeks in, when the CloudWatch line on the bill overtakes the compute line. It is the single most common source of a surprise monitoring bill.
The structural fix
Dashboards should never scan raw logs. If a number belongs on a dashboard, it belongs in a metric. CloudWatch metric filters extract values from logs at ingestion time and publish them as metrics at $0.30 per metric-month, after which the dashboard reads the metric instead of rescanning the logs. A widget that cost $30,240 per month as a log query costs $0.30 per month as a metric plus a fraction of a cent in GetMetricData calls.
The same logic applies with Prometheus: use recording rules to precompute expensive aggregations rather than running the raw query on every dashboard refresh. A recording rule evaluates once per interval and stores a small series; the dashboard then reads a cheap series instead of processing billions of samples on each load.
The unwatched dashboard problem
Dashboards accumulate. A team creates one per incident, per service, per experiment, and rarely deletes any. Typical audits find that 40% to 60% of dashboards have not been opened in 90 days. At $3.00 per CloudWatch dashboard-month, 120 dashboards cost $351 per month with perhaps 60 of them dead, which is small. The problem is that dead dashboards with log-scan widgets still cost query charges if anything loads them, including embedded views, TV wallboards left on in an empty office, and browser tabs pinned since March.
The wallboard case is worth naming specifically. A screen in a corridor running a dashboard on a 10-second refresh, 24 hours a day, executes 259,200 queries a month. If any of those widgets scan logs, the corridor screen is the most expensive display in the building. Set wallboards to a 1 or 5 minute refresh and make sure their widgets read metrics.
Controls that actually work
| Control | Effect |
|---|---|
| Default refresh to 1 minute or slower | 6x to 12x fewer executions |
| Cap dashboard time ranges at 24 hours | Caps per-run scan cost |
| Convert log-scan widgets to metric filters | Removes the scan meter entirely |
| Prometheus recording rules | Precompute expensive aggregations |
| Athena workgroup scan limits | Hard stop on runaway queries |
| Quarterly dashboard audit | Removes 40% to 60% of dashboards |
The Athena workgroup limit is underused and excellent. Setting a per-query data scan limit of, say, 100 GB means a badly written unpartitioned query fails at $0.50 instead of succeeding at $500. It converts a cost incident into an error message, which is the right trade.
Dashboards, metric filters, Athena workgroups with their scan limits, and Grafana workspaces are all Terraform resources. Price them from the plan against the resource catalog, and pair that with a review habit that asks of every new widget whether it reads a metric or scans a log. That single question, asked in code review, eliminates almost all query-cost incidents before they happen.
FAQ
How much do observability dashboards cost to run?
More than their listed price, because they execute queries on a timer. CloudWatch dashboards are $3.00 per month beyond the first three, but the GetMetricData API charges $0.01 per 1,000 metrics requested. A 40-widget dashboard pulling 25 metrics each requests 1,000 metrics per refresh; on a 10-second refresh that is 259,200 refreshes per month and about $2,592 for one dashboard.
Why are log query dashboards so expensive?
CloudWatch Logs Insights bills $0.005 per GB scanned, determined by the time range and log groups selected rather than how selective the filter is. On a log group ingesting 100 GB/day, a 7-day query scans 700 GB and costs $3.50 per run. On a 5-minute refresh that is 8,640 runs per month, roughly $30,240 for a single widget. A 90-day query costs $45 per execution.
How do I make dashboards cheap?
Have them read metrics, never raw logs. CloudWatch metric filters extract values at ingestion time and publish them as metrics at $0.30 per metric-month, so a widget that cost $30,240 per month as a log query costs $0.30 as a metric. In Prometheus, use recording rules to precompute expensive aggregations once per interval rather than reprocessing billions of samples on every dashboard load.
What refresh interval should dashboards use?
One minute or slower for almost everything, which is 6x to 12x fewer executions than a 5 or 10 second refresh. Wallboards deserve particular attention: a corridor screen refreshing every 10 seconds runs 259,200 queries a month, and if any widget scans logs it becomes the most expensive display in the building. Reserve fast refresh for incident-response views opened deliberately and closed afterwards.
How do I prevent runaway query costs?
Set hard limits rather than relying on discipline. Athena workgroups support a per-query data scan limit, so a 100 GB cap makes an unpartitioned query fail at $0.50 instead of succeeding at $500, turning a cost incident into an error message. Cap dashboard time ranges at 24 hours, default refresh intervals to a minute or slower, and audit dashboards quarterly since 40% to 60% typically go unopened for 90 days.
How does C3X help with observability query cost?
Dashboards, metric filters, Athena workgroups and their scan limits, and Grafana workspaces are Terraform resources created in pull requests. C3X prices them from the plan, which puts a number on the monitoring surface being added. Combined with a review question asking whether each new widget reads a metric or scans a log, that catches nearly all query-cost incidents before they reach production.
What to do next
Keep dashboards from quietly billing. C3X reads your Terraform and prices dashboards, filters, and workgroups against a live catalog. Start with the quickstart.
Share this post
Try C3X on your own Terraform
Free and open source. No API key required. One command to install, one command to estimate.