From 283280f32983bb81a1c49cae9c2aa8769558784a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Philippe=20Qu=C3=A9m=C3=A9ner?= Date: Wed, 17 Jul 2024 18:22:45 +0200 Subject: [PATCH] fix(querier): use most specific timerange available (#90540) * fix(querier): use most specific timerange available * return zero values --- pkg/registry/apis/query/parser.go | 23 ++++++----- pkg/registry/apis/query/parser_test.go | 55 +++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 11 deletions(-) diff --git a/pkg/registry/apis/query/parser.go b/pkg/registry/apis/query/parser.go index 66d43162818..9ad09373fef 100644 --- a/pkg/registry/apis/query/parser.go +++ b/pkg/registry/apis/query/parser.go @@ -70,14 +70,6 @@ func (p *queryParser) parseRequest(ctx context.Context, input *query.QueryDataRe RefIDTypes: make(map[string]string, len(input.Queries)), } - // Ensure a valid time range - if input.From == "" { - input.From = "now-6h" - } - if input.To == "" { - input.To = "now" - } - for _, q := range input.Queries { _, found := queryRefIDs[q.RefID] if found { @@ -123,7 +115,7 @@ func (p *queryParser) parseRequest(ctx context.Context, input *query.QueryDataRe PluginId: ds.Type, UID: ds.UID, Request: &data.QueryDataRequest{ - TimeRange: input.TimeRange, + TimeRange: getTimeRangeForQuery(&input.TimeRange, q.TimeRange), Debug: input.Debug, // no queries }, @@ -189,6 +181,19 @@ func (p *queryParser) parseRequest(ctx context.Context, input *query.QueryDataRe return rsp, nil } +func getTimeRangeForQuery(parentTimerange, queryTimerange *data.TimeRange) data.TimeRange { + if queryTimerange != nil && queryTimerange.From != "" && queryTimerange.To != "" { + return *queryTimerange + } + if parentTimerange != nil && parentTimerange.To != "" && parentTimerange.From != "" { + return *parentTimerange + } + return data.TimeRange{ + From: "0", + To: "0", + } +} + func (p *queryParser) getValidDataSourceRef(ctx context.Context, ds *data.DataSourceRef, id int64) (*data.DataSourceRef, error) { if ds == nil { if id == 0 { diff --git a/pkg/registry/apis/query/parser_test.go b/pkg/registry/apis/query/parser_test.go index d172c13788a..3476fae74a7 100644 --- a/pkg/registry/apis/query/parser_test.go +++ b/pkg/registry/apis/query/parser_test.go @@ -45,7 +45,7 @@ func TestQuerySplitting(t *testing.T) { require.Empty(t, split.Requests) }) - t.Run("applies default time range", func(t *testing.T) { + t.Run("applies zero time range if time range is missing", func(t *testing.T) { split, err := parser.parseRequest(ctx, &query.QueryDataRequest{ QueryDataRequest: data.QueryDataRequest{ TimeRange: data.TimeRange{}, // missing @@ -62,10 +62,61 @@ func TestQuerySplitting(t *testing.T) { }) require.NoError(t, err) require.Len(t, split.Requests, 1) - require.Equal(t, "now-6h", split.Requests[0].Request.From) + require.Equal(t, "0", split.Requests[0].Request.From) + require.Equal(t, "0", split.Requests[0].Request.To) + }) + t.Run("applies query time range if present", func(t *testing.T) { + split, err := parser.parseRequest(ctx, &query.QueryDataRequest{ + QueryDataRequest: data.QueryDataRequest{ + TimeRange: data.TimeRange{}, // missing + Queries: []data.DataQuery{{ + CommonQueryProperties: data.CommonQueryProperties{ + RefID: "A", + Datasource: &data.DataSourceRef{ + Type: "x", + UID: "abc", + }, + TimeRange: &data.TimeRange{ + From: "now-1d", + To: "now", + }, + }, + }}, + }, + }) + require.NoError(t, err) + require.Len(t, split.Requests, 1) + require.Equal(t, "now-1d", split.Requests[0].Request.From) require.Equal(t, "now", split.Requests[0].Request.To) }) + t.Run("applies query time range if all time ranges are present", func(t *testing.T) { + split, err := parser.parseRequest(ctx, &query.QueryDataRequest{ + QueryDataRequest: data.QueryDataRequest{ + TimeRange: data.TimeRange{ + From: "now-1h", + To: "now", + }, + Queries: []data.DataQuery{{ + CommonQueryProperties: data.CommonQueryProperties{ + RefID: "A", + Datasource: &data.DataSourceRef{ + Type: "x", + UID: "abc", + }, + TimeRange: &data.TimeRange{ + From: "now-1d", + To: "now", + }, + }, + }}, + }, + }) + require.NoError(t, err) + require.Len(t, split.Requests, 1) + require.Equal(t, "now-1d", split.Requests[0].Request.From) + require.Equal(t, "now", split.Requests[0].Request.To) + }) t.Run("verify tests", func(t *testing.T) { files, err := os.ReadDir("testdata") require.NoError(t, err)