From a3e4abfd5ebb4ef5077d7640a0d88c3d0824d6aa Mon Sep 17 00:00:00 2001 From: Adam Heinz Date: Mon, 31 Aug 2015 08:25:05 -0400 Subject: [PATCH] Added group by to Elasticsearch data source. --- .../datasource/elasticsearch/datasource.js | 21 ++++-- .../elasticsearch/partials/query.editor.html | 72 ++----------------- .../datasource/elasticsearch/queryBuilder.js | 12 +++- .../datasource/elasticsearch/queryCtrl.js | 10 +++ 4 files changed, 40 insertions(+), 75 deletions(-) diff --git a/public/app/plugins/datasource/elasticsearch/datasource.js b/public/app/plugins/datasource/elasticsearch/datasource.js index 3debe69497a..20aa399bb2d 100644 --- a/public/app/plugins/datasource/elasticsearch/datasource.js +++ b/public/app/plugins/datasource/elasticsearch/datasource.js @@ -313,16 +313,23 @@ function (angular, _, config, kbn, moment, ElasticQueryBuilder) { }; ElasticDatasource.prototype._getTimeSeries = function(results) { + var _aggregation2timeSeries = function(aggregation) { + var datapoints = aggregation.date_histogram.buckets.map(function(entry) { + return [entry.stats.avg, entry.key]; + }); + return { target: aggregation.key, datapoints: datapoints }; + }; var data = []; + if (results && results.aggregations) { for (var target in results.aggregations) { - if (results.aggregations.hasOwnProperty(target) && - results.aggregations[target].date_histogram && - results.aggregations[target].date_histogram.buckets) { - var datapoints = results.aggregations[target].date_histogram.buckets.map(function(entry) { - return [entry.metric.avg, entry.key]; - }); - data.push({ target: target, datapoints: datapoints }); + if (!results.aggregations.hasOwnProperty(target)) { + continue; + } + if (results.aggregations[target].date_histogram && results.aggregations[target].date_histogram.buckets) { + data.push(_aggregation2timeSeries(results.aggregations[target])); + } else if (results.aggregations[target].terms && results.aggregations[target].terms.buckets) { + [].push.apply(data, results.aggregations[target].terms.buckets.map(_aggregation2timeSeries)); } } } diff --git a/public/app/plugins/datasource/elasticsearch/partials/query.editor.html b/public/app/plugins/datasource/elasticsearch/partials/query.editor.html index b9450f3d3ef..63abb5f1f76 100644 --- a/public/app/plugins/datasource/elasticsearch/partials/query.editor.html +++ b/public/app/plugins/datasource/elasticsearch/partials/query.editor.html @@ -75,22 +75,6 @@
- -
- - - +
+ diff --git a/public/app/plugins/datasource/elasticsearch/queryBuilder.js b/public/app/plugins/datasource/elasticsearch/queryBuilder.js index 256212219cc..86f48005a05 100644 --- a/public/app/plugins/datasource/elasticsearch/queryBuilder.js +++ b/public/app/plugins/datasource/elasticsearch/queryBuilder.js @@ -29,7 +29,7 @@ function () { "min_doc_count": 0, }, "aggs": { - "metric": { + "stats": { "stats": { "field": target.valueField } @@ -38,6 +38,16 @@ function () { } } }; + if (target.groupByField) { + query["aggs"][target.termKey + "_" + target.termValue]["aggs"] = { + "terms": { + "terms": { + "field": target.groupByField + }, + "aggs": query["aggs"][target.termKey + "_" + target.termValue]["aggs"] + } + }; + } } }); query = JSON.stringify(query); diff --git a/public/app/plugins/datasource/elasticsearch/queryCtrl.js b/public/app/plugins/datasource/elasticsearch/queryCtrl.js index f0ecb028d4a..ab40fc30f19 100644 --- a/public/app/plugins/datasource/elasticsearch/queryCtrl.js +++ b/public/app/plugins/datasource/elasticsearch/queryCtrl.js @@ -44,6 +44,11 @@ function (angular, _, ElasticQueryBuilder) { } $scope.termValueSegment = new MetricSegment({value: target.termValue}); + if (!target.groupByField) { + target.groupByField = 'host.raw'; + } + $scope.groupByFieldSegment = new MetricSegment({value: target.groupByField}); + if (!target.measurement) { $scope.measurementSegment = MetricSegment.newSelectMeasurement(); } else { @@ -93,6 +98,11 @@ function (angular, _, ElasticQueryBuilder) { $scope.$parent.get_data(); }; + $scope.groupByFieldChanged = function() { + $scope.target.groupBy = $scope.groupByFieldSegment.value; + $scope.$parent.get_data(); + }; + $scope.fixTagSegments = function() { var count = $scope.tagSegments.length; var lastSegment = $scope.tagSegments[Math.max(count-1, 0)];