diff --git a/public/app/plugins/datasource/elasticsearch/elastic_response.js b/public/app/plugins/datasource/elasticsearch/elastic_response.js index 73050ce7f2b..a7c8e6d14bf 100644 --- a/public/app/plugins/datasource/elasticsearch/elastic_response.js +++ b/public/app/plugins/datasource/elasticsearch/elastic_response.js @@ -76,8 +76,12 @@ function (_, queryDef) { newSeries = { datapoints: [], metric: metric.type, field: metric.field, props: props}; for (i = 0; i < esAgg.buckets.length; i++) { bucket = esAgg.buckets[i]; - value = bucket[metric.id].value; - newSeries.datapoints.push([value, bucket.key]); + + value = bucket[metric.id]; + if (value !== undefined) { + newSeries.datapoints.push([value.value, bucket.key]); + } + } seriesList.push(newSeries); break; diff --git a/public/app/plugins/datasource/elasticsearch/metric_agg.js b/public/app/plugins/datasource/elasticsearch/metric_agg.js index 2073fbc3a55..ab1afa6a017 100644 --- a/public/app/plugins/datasource/elasticsearch/metric_agg.js +++ b/public/app/plugins/datasource/elasticsearch/metric_agg.js @@ -35,6 +35,10 @@ function (angular, _, queryDef) { } switch($scope.agg.type) { + case 'moving_avg': { + $scope.agg.aggregation = $scope.agg.aggregation || 'sum'; + break; + } case 'percentiles': { $scope.agg.settings.percents = $scope.agg.settings.percents || [25,50,75,95,99]; $scope.settingsLinkText = 'values: ' + $scope.agg.settings.percents.join(','); @@ -79,19 +83,9 @@ function (angular, _, queryDef) { }; $scope.getMetrics = function() { - console.log($scope.target.metrics); + var aggs = [{ text: 'Sum', type: 'sum'}, { text: 'Average', type: 'avg'}]; - var mets = _.filter($scope.target.metrics, function(x) { - return x.type !== 'moving_avg'; - }); - - mets = _.map(mets, function(m) { - return { text: m.type, type: m.id }; - }); - - console.log(mets); - - return $q.when(mets) + return $q.when(aggs) .then(uiSegmentSrv.transformToSegments(false)); }; diff --git a/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html b/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html index 09f48e487eb..fd487d52d3b 100644 --- a/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html +++ b/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html @@ -10,7 +10,7 @@
  • - +
  • {{settingsLinkText}} diff --git a/public/app/plugins/datasource/elasticsearch/query_builder.js b/public/app/plugins/datasource/elasticsearch/query_builder.js index e388ad63fdb..5d1492640dd 100644 --- a/public/app/plugins/datasource/elasticsearch/query_builder.js +++ b/public/app/plugins/datasource/elasticsearch/query_builder.js @@ -167,36 +167,28 @@ function () { continue; } - var metricAgg = {field: metric.field}; + var aggField = {}; + var metricAgg = null; + if (metric.type === 'moving_avg') { + var subBucket = metric.id + "_mavg"; + + var af = {}; + af[metric.aggregation] = {field: metric.field}; + nestedAggs.aggs[subBucket] = af; + + metricAgg = { buckets_path: subBucket }; + } else { + metricAgg = {field: metric.field}; + } + for (var prop in metric.settings) { if (metric.settings.hasOwnProperty(prop) && metric.settings[prop] !== null) { metricAgg[prop] = metric.settings[prop]; } } - var aggField = {}; - if (metric.type === 'moving_avg') { - var pipeAgg = ''; - for(var aggname in nestedAggs.aggs) { - var agg = nestedAggs.aggs[aggname]; - for(prop in agg) { - if (agg.hasOwnProperty(prop) && agg[prop] !== null) { - if (metric.field === prop) { - pipeAgg = aggname; - break; - } - } - } - } - - if (pipeAgg !== '') { - aggField[metric.type] = { buckets_path: pipeAgg }; - nestedAggs.aggs[metric.id] = aggField; - } - } else { - aggField[metric.type] = metricAgg; - nestedAggs.aggs[metric.id] = aggField; - } + aggField[metric.type] = metricAgg; + nestedAggs.aggs[metric.id] = aggField; } return query; diff --git a/public/app/plugins/datasource/elasticsearch/query_def.js b/public/app/plugins/datasource/elasticsearch/query_def.js index 1f7d352a2cc..ec5141c1e8d 100644 --- a/public/app/plugins/datasource/elasticsearch/query_def.js +++ b/public/app/plugins/datasource/elasticsearch/query_def.js @@ -13,7 +13,7 @@ function (_) { {text: "Min", value: 'min', requiresField: true}, {text: "Extended Stats", value: 'extended_stats', requiresField: true}, {text: "Percentiles", value: 'percentiles', requiresField: true}, - {text: "Moving Avg", value: 'moving_avg', requiresField: false, requiresBucketsPath: true}, + {text: "Moving Avg", value: 'moving_avg', requiresField: true, requiresBucketsPath: true}, {text: "Unique Count", value: "cardinality", requiresField: true}, {text: "Raw Document", value: "raw_document", requiresField: false} ], diff --git a/public/app/plugins/datasource/elasticsearch/specs/query_builder_specs.ts b/public/app/plugins/datasource/elasticsearch/specs/query_builder_specs.ts index 931d9a3613e..0bda6ab73b1 100644 --- a/public/app/plugins/datasource/elasticsearch/specs/query_builder_specs.ts +++ b/public/app/plugins/datasource/elasticsearch/specs/query_builder_specs.ts @@ -158,15 +158,11 @@ describe('ElasticQueryBuilder', function() { it('with moving average', function() { var query = builder.build({ metrics: [ - { - id: '1', - type: 'sum', - field: '@value', - }, { id: '2', type: 'moving_avg', - field: 'sum' + field: '@value', + aggregation: 'sum' } ], bucketAggs: [ @@ -175,8 +171,9 @@ describe('ElasticQueryBuilder', function() { }); var firstLevel = query.aggs["3"]; + console.log(JSON.stringify(query)); expect(firstLevel.aggs["2"]).not.to.be(undefined); expect(firstLevel.aggs["2"].moving_avg).not.to.be(undefined); - expect(firstLevel.aggs["2"].moving_avg.buckets_path).to.be("1"); + expect(firstLevel.aggs["2"].moving_avg.buckets_path).to.be("99"); }); });