diff --git a/pkg/tsdb/elasticsearch/models.go b/pkg/tsdb/elasticsearch/models.go index fd5a958fdcf..8f34eecf620 100644 --- a/pkg/tsdb/elasticsearch/models.go +++ b/pkg/tsdb/elasticsearch/models.go @@ -45,6 +45,7 @@ var metricAggType = map[string]string{ "percentiles": "Percentiles", "cardinality": "Unique Count", "moving_avg": "Moving Average", + "moving_fn": "Moving Function", "cumulative_sum": "Cumulative Sum", "derivative": "Derivative", "bucket_script": "Bucket Script", @@ -64,6 +65,7 @@ var extendedStats = map[string]string{ var pipelineAggType = map[string]string{ "moving_avg": "moving_avg", + "moving_fn": "moving_fn", "cumulative_sum": "cumulative_sum", "derivative": "derivative", "bucket_script": "bucket_script", diff --git a/public/app/plugins/datasource/elasticsearch/metric_agg.ts b/public/app/plugins/datasource/elasticsearch/metric_agg.ts index d819bfa28d9..590d11067eb 100644 --- a/public/app/plugins/datasource/elasticsearch/metric_agg.ts +++ b/public/app/plugins/datasource/elasticsearch/metric_agg.ts @@ -44,6 +44,7 @@ export class ElasticMetricAggCtrl { $scope.settingsLinkText = ''; $scope.variablesLinkText = ''; $scope.aggDef = _.find($scope.metricAggTypes, { value: $scope.agg.type }); + $scope.isValidAgg = $scope.aggDef != null; if (queryDef.isPipelineAgg($scope.agg.type)) { if (queryDef.isPipelineAggWithMultipleBucketPaths($scope.agg.type)) { @@ -105,6 +106,13 @@ export class ElasticMetricAggCtrl { $scope.updateMovingAvgModelSettings(); break; } + case 'moving_fn': { + const movingFunctionOptions = queryDef.getPipelineOptions($scope.agg); + _.each(movingFunctionOptions, opt => { + $scope.agg.settings[opt.text] = $scope.agg.settings[opt.text] || opt.default; + }); + break; + } case 'raw_document': case 'raw_data': { $scope.agg.settings.size = $scope.agg.settings.size || 500; @@ -115,7 +123,7 @@ export class ElasticMetricAggCtrl { break; } } - if ($scope.aggDef.supportsInlineScript) { + if ($scope.aggDef?.supportsInlineScript) { // I know this stores the inline script twice // but having it like this simplifes the query_builder const inlineScript = $scope.agg.inlineScript; diff --git a/public/app/plugins/datasource/elasticsearch/partials/metric_agg.html b/public/app/plugins/datasource/elasticsearch/partials/metric_agg.html index 3fc34233e26..ab5f5c5e133 100644 --- a/public/app/plugins/datasource/elasticsearch/partials/metric_agg.html +++ b/public/app/plugins/datasource/elasticsearch/partials/metric_agg.html @@ -10,12 +10,18 @@ -
+
+
+ +
+
-
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
diff --git a/public/app/plugins/datasource/elasticsearch/query_def.ts b/public/app/plugins/datasource/elasticsearch/query_def.ts index 43295c6a0fb..eff18efe6ce 100644 --- a/public/app/plugins/datasource/elasticsearch/query_def.ts +++ b/public/app/plugins/datasource/elasticsearch/query_def.ts @@ -57,6 +57,14 @@ export const metricAggTypes = [ requiresField: false, isPipelineAgg: true, minVersion: 2, + maxVersion: 60, + }, + { + text: 'Moving Function', + value: 'moving_fn', + requiresField: false, + isPipelineAgg: true, + minVersion: 70, }, { text: 'Derivative', @@ -151,6 +159,7 @@ export const pipelineOptions: any = { { text: 'predict', default: undefined }, { text: 'minimize', default: false }, ], + moving_fn: [{ text: 'window', default: 5 }, { text: 'script' }], derivative: [{ text: 'unit', default: undefined }], cumulative_sum: [{ text: 'format', default: undefined }], bucket_script: [], @@ -175,8 +184,10 @@ export const movingAvgModelSettings: any = { export function getMetricAggTypes(esVersion: any) { return _.filter(metricAggTypes, f => { - if (f.minVersion) { - return f.minVersion <= esVersion; + if (f.minVersion || f.maxVersion) { + const minVersion = f.minVersion || 0; + const maxVersion = f.maxVersion || esVersion; + return esVersion >= minVersion && esVersion <= maxVersion; } else { return true; } diff --git a/public/app/plugins/datasource/elasticsearch/specs/query_def.test.ts b/public/app/plugins/datasource/elasticsearch/specs/query_def.test.ts index f08db7c09fe..59e213e9cc2 100644 --- a/public/app/plugins/datasource/elasticsearch/specs/query_def.test.ts +++ b/public/app/plugins/datasource/elasticsearch/specs/query_def.test.ts @@ -162,8 +162,21 @@ describe('ElasticQueryDef', () => { }); describe('using esversion 5', () => { + const metricAggTypes = queryDef.getMetricAggTypes(5); test('should get pipeline aggs', () => { - expect(queryDef.getMetricAggTypes(5).length).toBe(15); + expect(metricAggTypes.length).toBe(15); + }); + }); + describe('using esversion 70', () => { + const metricAggTypes = queryDef.getMetricAggTypes(70); + test('should get pipeline aggs', () => { + expect(metricAggTypes.length).toBe(15); + }); + test('should get pipeline aggs with moving function', () => { + expect(metricAggTypes.some(m => m.value === 'moving_fn')).toBeTruthy(); + }); + test('should get pipeline aggs without moving average', () => { + expect(metricAggTypes.some(m => m.value === 'moving_avg')).toBeFalsy(); }); }); });