From 70e34e7f32d0f75634dcc388877ecaafe2869a0b Mon Sep 17 00:00:00 2001 From: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Date: Wed, 14 Dec 2022 14:19:03 +0100 Subject: [PATCH] Elasticsearch: Fix defaulting to time field if no field is specified in aggregation (#60238) * Elasticsearch: Add test for using timeField from datasource when not specified in query * Add default to timefield * Merge fix --- pkg/tsdb/elasticsearch/time_series_query.go | 14 ++++++++++---- pkg/tsdb/elasticsearch/time_series_query_test.go | 7 +++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/pkg/tsdb/elasticsearch/time_series_query.go b/pkg/tsdb/elasticsearch/time_series_query.go index 33437452946..75bdf086689 100644 --- a/pkg/tsdb/elasticsearch/time_series_query.go +++ b/pkg/tsdb/elasticsearch/time_series_query.go @@ -67,6 +67,7 @@ func (e *timeSeriesQuery) processQuery(q *Query, ms *es.MultiSearchRequestBuilde return err } interval := e.intervalCalculator.Calculate(e.dataQueries[0].TimeRange, minInterval, q.MaxDataPoints) + defaultTimeField := e.client.GetTimeField() b := ms.Search(interval) b.Size(0) @@ -109,7 +110,7 @@ func (e *timeSeriesQuery) processQuery(q *Query, ms *es.MultiSearchRequestBuilde bucketAgg.Settings = simplejson.NewFromAny( bucketAgg.generateSettingsForDSL(), ) - _ = addDateHistogramAgg(aggBuilder, bucketAgg, from, to) + _ = addDateHistogramAgg(aggBuilder, bucketAgg, from, to, defaultTimeField) } return nil } @@ -123,7 +124,7 @@ func (e *timeSeriesQuery) processQuery(q *Query, ms *es.MultiSearchRequestBuilde ) switch bucketAgg.Type { case dateHistType: - aggBuilder = addDateHistogramAgg(aggBuilder, bucketAgg, from, to) + aggBuilder = addDateHistogramAgg(aggBuilder, bucketAgg, from, to, defaultTimeField) case histogramType: aggBuilder = addHistogramAgg(aggBuilder, bucketAgg) case filtersType: @@ -255,8 +256,13 @@ func (bucketAgg BucketAgg) generateSettingsForDSL() map[string]interface{} { return bucketAgg.Settings.MustMap() } -func addDateHistogramAgg(aggBuilder es.AggBuilder, bucketAgg *BucketAgg, timeFrom, timeTo int64) es.AggBuilder { - aggBuilder.DateHistogram(bucketAgg.ID, bucketAgg.Field, func(a *es.DateHistogramAgg, b es.AggBuilder) { +func addDateHistogramAgg(aggBuilder es.AggBuilder, bucketAgg *BucketAgg, timeFrom, timeTo int64, timeField string) es.AggBuilder { + // If no field is specified, use the time field + field := bucketAgg.Field + if field == "" { + field = timeField + } + aggBuilder.DateHistogram(bucketAgg.ID, field, func(a *es.DateHistogramAgg, b es.AggBuilder) { a.FixedInterval = bucketAgg.Settings.Get("interval").MustString("auto") a.MinDocCount = bucketAgg.Settings.Get("min_doc_count").MustInt(0) a.ExtendedBounds = &es.ExtendedBounds{Min: timeFrom, Max: timeTo} diff --git a/pkg/tsdb/elasticsearch/time_series_query_test.go b/pkg/tsdb/elasticsearch/time_series_query_test.go index c361fb2fab2..9450f8b1d21 100644 --- a/pkg/tsdb/elasticsearch/time_series_query_test.go +++ b/pkg/tsdb/elasticsearch/time_series_query_test.go @@ -1714,10 +1714,9 @@ func TestSettingsCasting(t *testing.T) { }`, from, to, 15*time.Second) assert.Nil(t, err) - // FIXME: This should be @timestamp, but Field is empty - // sr := c.multisearchRequests[0].Requests[0] - // dateHistogramAgg := sr.Aggs[0].Aggregation.Aggregation.(*es.DateHistogramAgg) - // assert.Equal(t, dateHistogramAgg.Field, "@timestamp") + sr := c.multisearchRequests[0].Requests[0] + dateHistogramAgg := sr.Aggs[0].Aggregation.Aggregation.(*es.DateHistogramAgg) + assert.Equal(t, dateHistogramAgg.Field, "@timestamp") }) t.Run("Should use field from bucket agg when specified", func(t *testing.T) {