diff --git a/rules/ast/query_analyzer.go b/rules/ast/query_analyzer.go index 4945c61cca..1eb84a1a18 100644 --- a/rules/ast/query_analyzer.go +++ b/rules/ast/query_analyzer.go @@ -73,7 +73,11 @@ func (analyzer *QueryAnalyzer) Visit(node Node) { } n.fingerprints = fingerprints for _, fingerprint := range fingerprints { - analyzer.IntervalRanges[*fingerprint] = true + // Only add the fingerprint to IntervalRanges if not yet present in FullRanges. + // Full ranges always contain more points and span more time than interval ranges. + if _, alreadyInFullRanges := analyzer.FullRanges[*fingerprint]; !alreadyInFullRanges { + analyzer.IntervalRanges[*fingerprint] = true + } } case *MatrixLiteral: fingerprints, err := analyzer.storage.GetFingerprintsForLabelSet(n.labels) @@ -85,6 +89,10 @@ func (analyzer *QueryAnalyzer) Visit(node Node) { for _, fingerprint := range fingerprints { if analyzer.FullRanges[*fingerprint] < n.interval { analyzer.FullRanges[*fingerprint] = n.interval + // Delete the fingerprint from IntervalRanges. Full ranges always contain + // more points and span more time than interval ranges, so we don't need + // an interval range for the same fingerprint, should we have one. + delete(analyzer.IntervalRanges, *fingerprint) } } } @@ -94,12 +102,6 @@ func (analyzer *QueryAnalyzer) Visit(node Node) { // each node to collect fingerprints. func (analyzer *QueryAnalyzer) AnalyzeQueries(node Node) { Walk(analyzer, node) - // Find and dedupe overlaps between full and stepped ranges. Full ranges - // always contain more points *and* span more time than stepped ranges, so - // throw away stepped ranges for fingerprints which have full ranges. - for fingerprint := range analyzer.FullRanges { - delete(analyzer.IntervalRanges, fingerprint) - } } func viewAdapterForInstantQuery(node Node, timestamp clientmodel.Timestamp, storage *metric.TieredStorage, queryStats *stats.TimerGroup) (*viewAdapter, error) {