observabilitycost-optimizationfinopsaws

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.

The C3X Team··7 min read

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

ServiceQuery 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 groupBytes scannedCost per run
15 minutes~1.04 GB$0.005
1 hour~4.2 GB$0.021
24 hours100 GB$0.50
7 days700 GB$3.50
30 days3,000 GB$15.00
90 days9,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

ControlEffect
Default refresh to 1 minute or slower6x to 12x fewer executions
Cap dashboard time ranges at 24 hoursCaps per-run scan cost
Convert log-scan widgets to metric filtersRemoves the scan meter entirely
Prometheus recording rulesPrecompute expensive aggregations
Athena workgroup scan limitsHard stop on runaway queries
Quarterly dashboard auditRemoves 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.

Try C3X on your own Terraform

Free and open source. No API key required. One command to install, one command to estimate.