From 2a6eb78e92fc1f5e8d4d91b5bab82e1bbda0c541 Mon Sep 17 00:00:00 2001 From: Alan Protasio Date: Thu, 22 Sep 2022 14:18:18 -0700 Subject: [PATCH 1/3] Cortex should still send the request to upstream when Start == end Signed-off-by: Alan Protasio --- .../tripperware/queryrange/split_by_interval.go | 2 +- .../queryrange/split_by_interval_test.go | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/pkg/querier/tripperware/queryrange/split_by_interval.go b/pkg/querier/tripperware/queryrange/split_by_interval.go index 9fadb72b7d9..212c77cd790 100644 --- a/pkg/querier/tripperware/queryrange/split_by_interval.go +++ b/pkg/querier/tripperware/queryrange/split_by_interval.go @@ -76,7 +76,7 @@ func splitQuery(r tripperware.Request, interval time.Duration) ([]tripperware.Re return nil, err } var reqs []tripperware.Request - for start := r.GetStart(); start < r.GetEnd(); start = nextIntervalBoundary(start, r.GetStep(), interval) + r.GetStep() { + for start := r.GetStart(); start <= r.GetEnd(); start = nextIntervalBoundary(start, r.GetStep(), interval) + r.GetStep() { end := nextIntervalBoundary(start, r.GetStep(), interval) if end+r.GetStep() >= r.GetEnd() { end = r.GetEnd() diff --git a/pkg/querier/tripperware/queryrange/split_by_interval_test.go b/pkg/querier/tripperware/queryrange/split_by_interval_test.go index e0e47f4d165..3451570ce42 100644 --- a/pkg/querier/tripperware/queryrange/split_by_interval_test.go +++ b/pkg/querier/tripperware/queryrange/split_by_interval_test.go @@ -84,6 +84,23 @@ func TestSplitQuery(t *testing.T) { }, interval: day, }, + { + input: &PrometheusRequest{ + Start: 60 * 60 * seconds, + End: 60 * 60 * seconds, + Step: 15 * seconds, + Query: "foo", + }, + expected: []tripperware.Request{ + &PrometheusRequest{ + Start: 60 * 60 * seconds, + End: 60 * 60 * seconds, + Step: 15 * seconds, + Query: "foo", + }, + }, + interval: day, + }, { input: &PrometheusRequest{ Start: 0, From 796504f0658577f3867a5d13b0516ae296efa643 Mon Sep 17 00:00:00 2001 From: Alan Protasio Date: Thu, 22 Sep 2022 14:27:03 -0700 Subject: [PATCH 2/3] Changelog Signed-off-by: Alan Protasio --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d24c5a6ea95..ffd29bce2aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ * [BUGFIX] Memberlist: Add join with no retrying when starting service. #4804 * [BUGFIX] Ruler: Fix /ruler/rule_groups returns YAML with extra fields. #4767 * [BUGFIX] Respecting `-tracing.otel.sample-ratio` configuration when enabling OpenTelemetry tracing with X-ray. #4862 +* [BUGFIX] QueryFrontend: fixed query_range requests when query has `start` equals to `end`. #4877 ## 1.13.0 2022-07-14 From 878bfeadda0e7e6dc9b4859da0bc3015b755fa7c Mon Sep 17 00:00:00 2001 From: Alan Protasio Date: Thu, 22 Sep 2022 15:16:11 -0700 Subject: [PATCH 3/3] Fix test Signed-off-by: Alan Protasio --- pkg/querier/tripperware/queryrange/split_by_interval.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/querier/tripperware/queryrange/split_by_interval.go b/pkg/querier/tripperware/queryrange/split_by_interval.go index 212c77cd790..6bf87bf13d0 100644 --- a/pkg/querier/tripperware/queryrange/split_by_interval.go +++ b/pkg/querier/tripperware/queryrange/split_by_interval.go @@ -69,6 +69,11 @@ func (s splitByInterval) Do(ctx context.Context, r tripperware.Request) (tripper } func splitQuery(r tripperware.Request, interval time.Duration) ([]tripperware.Request, error) { + // If Start == end we should just run the original request + if r.GetStart() == r.GetEnd() { + return []tripperware.Request{r}, nil + } + // Replace @ modifier function to their respective constant values in the query. // This way subqueries will be evaluated at the same time as the parent query. query, err := evaluateAtModifierFunction(r.GetQuery(), r.GetStart(), r.GetEnd()) @@ -76,7 +81,7 @@ func splitQuery(r tripperware.Request, interval time.Duration) ([]tripperware.Re return nil, err } var reqs []tripperware.Request - for start := r.GetStart(); start <= r.GetEnd(); start = nextIntervalBoundary(start, r.GetStep(), interval) + r.GetStep() { + for start := r.GetStart(); start < r.GetEnd(); start = nextIntervalBoundary(start, r.GetStep(), interval) + r.GetStep() { end := nextIntervalBoundary(start, r.GetStep(), interval) if end+r.GetStep() >= r.GetEnd() { end = r.GetEnd()