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
This commit is contained in:
Ivana Huckova 2022-12-14 14:19:03 +01:00 committed by GitHub
parent d3ef86bd90
commit 70e34e7f32
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 8 deletions

View File

@ -67,6 +67,7 @@ func (e *timeSeriesQuery) processQuery(q *Query, ms *es.MultiSearchRequestBuilde
return err return err
} }
interval := e.intervalCalculator.Calculate(e.dataQueries[0].TimeRange, minInterval, q.MaxDataPoints) interval := e.intervalCalculator.Calculate(e.dataQueries[0].TimeRange, minInterval, q.MaxDataPoints)
defaultTimeField := e.client.GetTimeField()
b := ms.Search(interval) b := ms.Search(interval)
b.Size(0) b.Size(0)
@ -109,7 +110,7 @@ func (e *timeSeriesQuery) processQuery(q *Query, ms *es.MultiSearchRequestBuilde
bucketAgg.Settings = simplejson.NewFromAny( bucketAgg.Settings = simplejson.NewFromAny(
bucketAgg.generateSettingsForDSL(), bucketAgg.generateSettingsForDSL(),
) )
_ = addDateHistogramAgg(aggBuilder, bucketAgg, from, to) _ = addDateHistogramAgg(aggBuilder, bucketAgg, from, to, defaultTimeField)
} }
return nil return nil
} }
@ -123,7 +124,7 @@ func (e *timeSeriesQuery) processQuery(q *Query, ms *es.MultiSearchRequestBuilde
) )
switch bucketAgg.Type { switch bucketAgg.Type {
case dateHistType: case dateHistType:
aggBuilder = addDateHistogramAgg(aggBuilder, bucketAgg, from, to) aggBuilder = addDateHistogramAgg(aggBuilder, bucketAgg, from, to, defaultTimeField)
case histogramType: case histogramType:
aggBuilder = addHistogramAgg(aggBuilder, bucketAgg) aggBuilder = addHistogramAgg(aggBuilder, bucketAgg)
case filtersType: case filtersType:
@ -255,8 +256,13 @@ func (bucketAgg BucketAgg) generateSettingsForDSL() map[string]interface{} {
return bucketAgg.Settings.MustMap() return bucketAgg.Settings.MustMap()
} }
func addDateHistogramAgg(aggBuilder es.AggBuilder, bucketAgg *BucketAgg, timeFrom, timeTo int64) es.AggBuilder { func addDateHistogramAgg(aggBuilder es.AggBuilder, bucketAgg *BucketAgg, timeFrom, timeTo int64, timeField string) es.AggBuilder {
aggBuilder.DateHistogram(bucketAgg.ID, bucketAgg.Field, func(a *es.DateHistogramAgg, b 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.FixedInterval = bucketAgg.Settings.Get("interval").MustString("auto")
a.MinDocCount = bucketAgg.Settings.Get("min_doc_count").MustInt(0) a.MinDocCount = bucketAgg.Settings.Get("min_doc_count").MustInt(0)
a.ExtendedBounds = &es.ExtendedBounds{Min: timeFrom, Max: timeTo} a.ExtendedBounds = &es.ExtendedBounds{Min: timeFrom, Max: timeTo}

View File

@ -1714,10 +1714,9 @@ func TestSettingsCasting(t *testing.T) {
}`, from, to, 15*time.Second) }`, from, to, 15*time.Second)
assert.Nil(t, err) assert.Nil(t, err)
// FIXME: This should be @timestamp, but Field is empty sr := c.multisearchRequests[0].Requests[0]
// sr := c.multisearchRequests[0].Requests[0] dateHistogramAgg := sr.Aggs[0].Aggregation.Aggregation.(*es.DateHistogramAgg)
// dateHistogramAgg := sr.Aggs[0].Aggregation.Aggregation.(*es.DateHistogramAgg) assert.Equal(t, dateHistogramAgg.Field, "@timestamp")
// assert.Equal(t, dateHistogramAgg.Field, "@timestamp")
}) })
t.Run("Should use field from bucket agg when specified", func(t *testing.T) { t.Run("Should use field from bucket agg when specified", func(t *testing.T) {