diff --git a/CHANGELOG.md b/CHANGELOG.md index 8eb89a7057c..46b901aafd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # 2.6.0 (2015-12-04) +### New Features +* **Elasticsearch**: Support for pipeline aggregations Moving average and derivative, closes [#3451](https://github.com/grafana/grafana/issues/3451) + ### Bug Fixes * **metric editors**: Fix for clicking typeahead auto dropdown option, fixes [#3428](https://github.com/grafana/grafana/issues/3428) * **influxdb**: Fixed issue showing Group By label only on first query, fixes [#3453](https://github.com/grafana/grafana/issues/3453) diff --git a/public/app/plugins/datasource/elasticsearch/elastic_response.js b/public/app/plugins/datasource/elasticsearch/elastic_response.js index 73050ce7f2b..32120a4519a 100644 --- a/public/app/plugins/datasource/elasticsearch/elastic_response.js +++ b/public/app/plugins/datasource/elasticsearch/elastic_response.js @@ -15,6 +15,9 @@ function (_, queryDef) { for (y = 0; y < target.metrics.length; y++) { metric = target.metrics[y]; + if (metric.hide) { + continue; + } switch(metric.type) { case 'count': { @@ -76,8 +79,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; @@ -193,7 +200,14 @@ function (_, queryDef) { }); } - if (series.field) { + if (series.field && queryDef.isPipelineAgg(series.metric)) { + var appliedAgg = _.findWhere(target.metrics, { id: series.field }); + if (appliedAgg) { + metricName += ' ' + queryDef.describeMetric(appliedAgg); + } else { + metricName = 'Unset'; + } + } else if (series.field) { metricName += ' ' + series.field; } diff --git a/public/app/plugins/datasource/elasticsearch/metric_agg.js b/public/app/plugins/datasource/elasticsearch/metric_agg.js index c4e04dad325..df5d8e00a80 100644 --- a/public/app/plugins/datasource/elasticsearch/metric_agg.js +++ b/public/app/plugins/datasource/elasticsearch/metric_agg.js @@ -13,14 +13,21 @@ function (angular, _, queryDef) { $scope.metricAggTypes = queryDef.metricAggTypes; $scope.extendedStats = queryDef.extendedStats; + $scope.pipelineAggOptions = []; $scope.init = function() { $scope.agg = metricAggs[$scope.index]; $scope.validateModel(); + $scope.updatePipelineAggOptions(); + }; + + $scope.updatePipelineAggOptions = function() { + $scope.pipelineAggOptions = queryDef.getPipelineAggOptions($scope.target); }; $rootScope.onAppEvent('elastic-query-updated', function() { $scope.index = _.indexOf(metricAggs, $scope.agg); + $scope.updatePipelineAggOptions(); $scope.validateModel(); }, $scope); @@ -30,7 +37,18 @@ function (angular, _, queryDef) { $scope.settingsLinkText = ''; $scope.aggDef = _.findWhere($scope.metricAggTypes, {value: $scope.agg.type}); - if (!$scope.agg.field) { + if (queryDef.isPipelineAgg($scope.agg.type)) { + $scope.agg.pipelineAgg = $scope.agg.pipelineAgg || 'select metric'; + $scope.agg.field = $scope.agg.pipelineAgg; + + var pipelineOptions = queryDef.getPipelineOptions($scope.agg); + if (pipelineOptions.length > 0) { + _.each(pipelineOptions, function(opt) { + $scope.agg.settings[opt.text] = $scope.agg.settings[opt.text] || opt.default; + }); + $scope.settingsLinkText = 'Options'; + } + } else if (!$scope.agg.field) { $scope.agg.field = 'select field'; } @@ -65,12 +83,18 @@ function (angular, _, queryDef) { $scope.toggleOptions = function() { $scope.showOptions = !$scope.showOptions; + $scope.updatePipelineAggOptions(); + }; + + $scope.onChangeInternal = function() { + $scope.onChange(); }; $scope.onTypeChange = function() { $scope.agg.settings = {}; $scope.agg.meta = {}; $scope.showOptions = false; + $scope.updatePipelineAggOptions(); $scope.onChange(); }; @@ -94,6 +118,14 @@ function (angular, _, queryDef) { $scope.onChange(); }; + $scope.toggleShowMetric = function() { + $scope.agg.hide = !$scope.agg.hide; + if (!$scope.agg.hide) { + delete $scope.agg.hide; + } + $scope.onChange(); + }; + $scope.init(); }); diff --git a/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html b/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html index 65030af5655..a55fadf3d5b 100644 --- a/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html +++ b/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html @@ -1,16 +1,27 @@ -