diff --git a/pkg/tsdb/elasticsearch/time_series_query.go b/pkg/tsdb/elasticsearch/time_series_query.go index 7f472eb741a..a8c496a0615 100644 --- a/pkg/tsdb/elasticsearch/time_series_query.go +++ b/pkg/tsdb/elasticsearch/time_series_query.go @@ -454,7 +454,16 @@ func (p *timeSeriesQueryParser) parseMetrics(model *simplejson.Json) ([]*MetricA metric.Hide = metricJSON.Get("hide").MustBool(false) metric.ID = metricJSON.Get("id").MustString() metric.PipelineAggregate = metricJSON.Get("pipelineAgg").MustString() - metric.Settings = simplejson.NewFromAny(metricJSON.Get("settings").MustMap()) + // In legacy editors, we were storing empty settings values as "null" + // The new editor doesn't store empty strings at all + // We need to ensures backward compatibility with old queries and remove empty fields + settings := metricJSON.Get("settings").MustMap() + for k, v := range settings { + if v == "null" { + delete(settings, k) + } + } + metric.Settings = simplejson.NewFromAny(settings) metric.Meta = simplejson.NewFromAny(metricJSON.Get("meta").MustMap()) metric.Type, err = metricJSON.Get("type").String() if err != nil { diff --git a/pkg/tsdb/elasticsearch/time_series_query_test.go b/pkg/tsdb/elasticsearch/time_series_query_test.go index e3cb75019bc..f6c3e61815d 100644 --- a/pkg/tsdb/elasticsearch/time_series_query_test.go +++ b/pkg/tsdb/elasticsearch/time_series_query_test.go @@ -39,7 +39,6 @@ func TestExecuteTimeSeriesQuery(t *testing.T) { require.Equal(t, dateHistogramAgg.ExtendedBounds.Min, fromMs) require.Equal(t, dateHistogramAgg.ExtendedBounds.Max, toMs) }) - t.Run("Should clean settings from null values (from frontend tests)", func(t *testing.T) { c := newFakeClient() _, err := executeTsdbQuery(c, `{ @@ -52,8 +51,7 @@ func TestExecuteTimeSeriesQuery(t *testing.T) { firstLevel := sr.Aggs[0] secondLevel := firstLevel.Aggregation.Aggs[0] require.Equal(t, secondLevel.Aggregation.Aggregation.(*es.MetricAggregation).Settings["script"], "1") - // FIXME: This is a bug in implementation, missing is set to "null" instead of being removed - // require.Equal(t, secondLevel.Aggregation.Aggregation.(*es.MetricAggregation).Settings["missing"], nil) + require.NotContains(t, secondLevel.Aggregation.Aggregation.(*es.MetricAggregation).Settings, "missing") }) t.Run("With multiple bucket aggs", func(t *testing.T) { diff --git a/public/app/plugins/datasource/elasticsearch/QueryBuilder.test.ts b/public/app/plugins/datasource/elasticsearch/QueryBuilder.test.ts index e05cc478f34..b091f5a9c00 100644 --- a/public/app/plugins/datasource/elasticsearch/QueryBuilder.test.ts +++ b/public/app/plugins/datasource/elasticsearch/QueryBuilder.test.ts @@ -22,7 +22,7 @@ describe('ElasticQueryBuilder', () => { // The following `missing: null as any` is because previous versions of the DS where // storing null in the query model when inputting an empty string, // which were then removed in the query builder. - // The new version doesn't store empty strings at all. This tests ensures backward compatinility. + // The new version doesn't store empty strings at all. This tests ensures backward compatibility. metrics: [{ type: 'avg', id: '0', settings: { missing: null as any, script: '1' } }], timeField: '@timestamp', bucketAggs: [{ type: 'date_histogram', field: '@timestamp', id: '1' }],