Last updated: July 24, 2026
Recording Rule Limits
Recording rules pre-compute frequently needed or expensive PromQL expressions and store the results as new time series. Because each rule re-runs its expression on a fixed interval, Dash0 enforces limits on the relationship between a rule's query window and its group's evaluation interval, along with a maximum query window and a set of expression constraints. These limits keep evaluation costs predictable and protect query performance across your organization.
Recording rules are defined as code. See the dash0_recording_rule Terraform resource and the Prometheus recording rule specification for the definition format. The limits below are validated when a recording rule group is created or updated, so a rule that violates a limit is rejected at apply time.
What Is the Query Window
The query window is the largest range that any matrix selector or subquery looks back over, across every rule in the group. It is not the group's evaluation interval.
12345# Query window is 5m.rate(http_requests_total[5m])# Query window is 1w (168h), the widest range wins.avg_over_time(job:http_requests:rate5m[1w])
Because the interval is set per group and the floor is based on the widest window in the group, a single wide-window rule raises the minimum interval for the whole group.
Minimum Evaluation Interval per Query Window
The wider the query window, the more data each evaluation scans, so Dash0 requires a longer minimum interval as the window grows:
| Query window | Minimum interval | Minimum interval (recording-rule inputs) |
|---|---|---|
| 1h 10m or less | 1m | 1m |
| More than 1h 10m, up to 8h 10m | 5m | 5m |
| More than 8h 10m, up to 24h 10m | 10m | 5m |
| More than 24h 10m | 1h | 5m |
An interval below 1 minute is never allowed, regardless of query window.
The boundaries use a strict "greater than" comparison, so a window that lands exactly on a boundary stays in the lower band. A [1h] selector sits at one hour, which is within the "1h 10m or less" band, so the 1-minute minimum applies. The extra 10 minutes on each boundary exists so that common round windows such as [1h], [8h], and [24h] do not fall into a stricter band.
Relaxed Floors for Rules Built on Recording Rules
The right-hand column applies when every metric a rule references is itself the output of another active recording rule in the same dataset. In that case, the 10-minute and 1-hour floors relax to the 5-minute floor.
This is safe because the inner recording rule was already validated when it was created. Its own interval bounds how often its output is produced, and its own bounded selectors bound its cardinality, so the outer rule that reads that output inherits those bounds.
This relaxation supports layered rules, such as a long-term aggregation built on top of a shorter pre-computed rate:
12# Long-term mean of an existing 5m rate, evaluated every 5m.avg_over_time(job:http_requests:rate5m[1w])
The relaxation does not apply if the rule references any raw (non-recording-rule) metric. A rule that mixes a recording-rule output with a raw metric is held to the standard floors in the left column. A rule later in the same group may reference the output of an earlier rule in that group.
Maximum Query Window
A recording rule's query window may not exceed 30 days. A rule whose widest matrix-selector or subquery range is larger than 30 days is rejected.
Expression Constraints for Wide Windows
When a rule's query window is greater than 1h 10m, Dash0 applies additional constraints on the expression to keep each evaluation bounded. Rules with a query window of 1h 10m or less are not subject to these constraints.
- Distinct metric names: A single rule may reference at most 7 distinct metric names.
- Bounded matrix selectors: Every matrix selector must be bounded by at least one of the following: a label matcher other than the metric name (for example,
metric{service="auth"}[1h]), an enclosing range function (such asrateoravg_over_time), an enclosing aggregation withby (...)orwithout (...), or an inner metric that is itself a recording-rule output. A bare selector on a raw metric with no matcher or wrapping is rejected. oroperators: A single rule may use at most 10oroperators.- No self-reference: A rule's own record name may not appear in its own expression.
Further Reading
dash0_recording_ruleTerraform Resource — Define recording rule groups in the Prometheus rule format with Terraform.- Check Rule Limits — Query window and interval limits for check rules, which alert on PromQL conditions.
- Optimize PromQL Query Performance — Write efficient PromQL expressions that scan less data.
- Query Metrics in the Query Builder — Explore metrics, including the time series that recording rules produce.