diff --git a/public/app/features/org/datasourceEditCtrl.js b/public/app/features/org/datasourceEditCtrl.js index 08f05c50772..09dd8606092 100644 --- a/public/app/features/org/datasourceEditCtrl.js +++ b/public/app/features/org/datasourceEditCtrl.js @@ -1,8 +1,9 @@ define([ 'angular', 'config', + 'lodash', ], -function (angular, config) { +function (angular, config, _) { 'use strict'; var module = angular.module('grafana.controllers'); diff --git a/public/app/plugins/datasource/elasticsearch/bucketAgg.js b/public/app/plugins/datasource/elasticsearch/bucketAgg.js index ef512f3a406..52dce608b13 100644 --- a/public/app/plugins/datasource/elasticsearch/bucketAgg.js +++ b/public/app/plugins/datasource/elasticsearch/bucketAgg.js @@ -53,6 +53,8 @@ function (angular, _, queryDef) { if ($scope.agg.size === '0') { $scope.settingsLinkText += ' (' + $scope.agg.order + ')'; } + } else if ($scope.agg.type === 'date_histogram') { + delete $scope.agg.field; } return true; diff --git a/public/app/plugins/datasource/elasticsearch/datasource.js b/public/app/plugins/datasource/elasticsearch/datasource.js index 1e3e4331998..80e286241be 100644 --- a/public/app/plugins/datasource/elasticsearch/datasource.js +++ b/public/app/plugins/datasource/elasticsearch/datasource.js @@ -21,7 +21,11 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern) { this.url = datasource.url; this.name = datasource.name; this.index = datasource.index; + this.timeField = datasource.jsonData.timeField; this.indexPattern = new IndexPattern(datasource.index, datasource.jsonData.interval); + this.queryBuilder = new ElasticQueryBuilder({ + timeField: this.timeField + }); } ElasticDatasource.prototype._request = function(method, url, data) { @@ -145,25 +149,24 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern) { }; ElasticDatasource.prototype.query = function(options) { - var queryBuilder = new ElasticQueryBuilder(); var payload = ""; + var target; var sentTargets = []; var header = this.getQueryHeader(options.range); var timeFrom = this.translateTime(options.range.from); var timeTo = this.translateTime(options.range.to); - _.each(options.targets, function(target) { - if (target.hide) { - return; - } + for (var i = 0; i < options.targets.length; i++) { + target = options.targets[i]; + if (target.hide) {return;} - var esQuery = queryBuilder.build(target, timeFrom, timeTo); + var esQuery = this.queryBuilder.build(target, timeFrom, timeTo); payload += header + '\n'; payload += angular.toJson(esQuery) + '\n'; sentTargets.push(target); - }); + } payload = payload.replace(/\$interval/g, options.interval); payload = payload.replace(/\$timeFrom/g, this.translateTime(options.range.from)); diff --git a/public/app/plugins/datasource/elasticsearch/metricAgg.js b/public/app/plugins/datasource/elasticsearch/metricAgg.js index 1fa2ebea516..d68598eae84 100644 --- a/public/app/plugins/datasource/elasticsearch/metricAgg.js +++ b/public/app/plugins/datasource/elasticsearch/metricAgg.js @@ -41,7 +41,7 @@ function (angular, _, queryDef) { } case 'extended_stats': { $scope.agg.stats = $scope.agg.stats || ['std_deviation']; - $scope.settingsLinkText = 'stats: ' + $scope.agg.stats.join(','); + $scope.settingsLinkText = 'Stats: ' + $scope.agg.stats.join(','); } } }; diff --git a/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html b/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html index 4ea6f53c402..fa4d5f3658f 100644 --- a/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html +++ b/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html @@ -5,8 +5,10 @@ Then by
  • - - + +
  • +
  • +
  • {{settingsLinkText}} diff --git a/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html b/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html index e0f0512bfed..bf8dba00318 100644 --- a/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html +++ b/public/app/plugins/datasource/elasticsearch/partials/metricAgg.html @@ -4,10 +4,10 @@ Metric
  • - +
  • - +
  • {{settingsLinkText}} diff --git a/public/app/plugins/datasource/elasticsearch/partials/query.editor.html b/public/app/plugins/datasource/elasticsearch/partials/query.editor.html index 74d9df874a1..834bc61c57f 100644 --- a/public/app/plugins/datasource/elasticsearch/partials/query.editor.html +++ b/public/app/plugins/datasource/elasticsearch/partials/query.editor.html @@ -45,7 +45,7 @@ Query
  • - +
  • diff --git a/public/app/plugins/datasource/elasticsearch/queryBuilder.js b/public/app/plugins/datasource/elasticsearch/queryBuilder.js index dbf63f69125..09e72dee9eb 100644 --- a/public/app/plugins/datasource/elasticsearch/queryBuilder.js +++ b/public/app/plugins/datasource/elasticsearch/queryBuilder.js @@ -4,11 +4,13 @@ define([ function (angular) { 'use strict'; - function ElasticQueryBuilder() { } + function ElasticQueryBuilder(options) { + this.timeField = options.timeField; + } - ElasticQueryBuilder.prototype.getRangeFilter = function(timeField) { + ElasticQueryBuilder.prototype.getRangeFilter = function() { var filter = {}; - filter[timeField] = {"gte": "$timeFrom", "lte": "$timeTo"}; + filter[this.timeField] = {"gte": "$timeFrom", "lte": "$timeTo"}; return filter; }; @@ -59,7 +61,7 @@ function (angular) { }, "filter": { "bool": { - "must": [{"range": this.getRangeFilter(target.timeField)}] + "must": [{"range": this.getRangeFilter()}] } } } @@ -76,7 +78,7 @@ function (angular) { case 'date_histogram': { esAgg["date_histogram"] = { "interval": target.interval || "$interval", - "field": aggDef.field, + "field": this.timeField, "min_doc_count": 1, "extended_bounds": { "min": "$timeFrom", "max": "$timeTo" } }; diff --git a/public/app/plugins/datasource/elasticsearch/queryCtrl.js b/public/app/plugins/datasource/elasticsearch/queryCtrl.js index e259f7fa43b..21574250625 100644 --- a/public/app/plugins/datasource/elasticsearch/queryCtrl.js +++ b/public/app/plugins/datasource/elasticsearch/queryCtrl.js @@ -1,9 +1,8 @@ define([ 'angular', 'lodash', - './queryBuilder', ], -function (angular, _, ElasticQueryBuilder) { +function (angular, _) { 'use strict'; var module = angular.module('grafana.controllers'); @@ -14,12 +13,8 @@ function (angular, _, ElasticQueryBuilder) { var target = $scope.target; if (!target) { return; } - target.timeField = target.timeField || '@timestamp'; target.metrics = target.metrics || [{ type: 'count', id: '1' }]; - target.bucketAggs = target.bucketAggs || [{ type: 'date_histogram', field: '@timestamp', id: '2'}]; - - $scope.queryBuilder = new ElasticQueryBuilder(target); - $scope.rawQueryOld = angular.toJson($scope.queryBuilder.build($scope.target), true); + target.bucketAggs = target.bucketAggs || [{ type: 'date_histogram', id: '2'}]; }; $scope.getFields = function() { @@ -29,7 +24,7 @@ function (angular, _, ElasticQueryBuilder) { }; $scope.queryUpdated = function() { - var newJson = angular.toJson($scope.queryBuilder.build($scope.target), true); + var newJson = angular.toJson($scope.datasource.queryBuilder.build($scope.target), true); if (newJson !== $scope.oldQueryRaw) { $scope.rawQueryOld = newJson; $scope.get_data(); diff --git a/public/css/less/tightform.less b/public/css/less/tightform.less index 7581f6eac55..38ae5531d9d 100644 --- a/public/css/less/tightform.less +++ b/public/css/less/tightform.less @@ -210,3 +210,6 @@ select.tight-form-input { padding-left: 66px; } +.tight-form-item-large { width: 115px; } +.tight-form-item-xlarge { width: 150px; } +.tight-form-item-xxlarge { width: 200px; } diff --git a/public/test/specs/elasticsearch-querybuilder-specs.js b/public/test/specs/elasticsearch-querybuilder-specs.js index b28f5eea41f..1f31db95424 100644 --- a/public/test/specs/elasticsearch-querybuilder-specs.js +++ b/public/test/specs/elasticsearch-querybuilder-specs.js @@ -4,10 +4,13 @@ define([ 'use strict'; describe('ElasticQueryBuilder', function() { + var builder; + + beforeEach(function() { + builder = new ElasticQueryBuilder({timeField: '@timestamp'}); + }); it('with defaults', function() { - var builder = new ElasticQueryBuilder(); - var query = builder.build({ metrics: [{type: 'Count', id: '0'}], timeField: '@timestamp', @@ -19,8 +22,6 @@ define([ }); it('with multiple bucket aggs', function() { - var builder = new ElasticQueryBuilder(); - var query = builder.build({ metrics: [{type: 'count', id: '1'}], timeField: '@timestamp', @@ -36,8 +37,6 @@ define([ it('with select field', function() { - var builder = new ElasticQueryBuilder(); - var query = builder.build({ metrics: [{type: 'avg', field: '@value', id: '1'}], bucketAggs: [{type: 'date_histogram', field: '@timestamp', id: '2'}], @@ -48,8 +47,6 @@ define([ }); it('with term agg and order by metric agg', function() { - var builder = new ElasticQueryBuilder(); - var query = builder.build({ metrics: [{type: 'count', id: '1'}, {type: 'avg', field: '@value', id: '5'}], bucketAggs: [ @@ -66,8 +63,6 @@ define([ }); it('with metric percentiles', function() { - var builder = new ElasticQueryBuilder(); - var query = builder.build({ metrics: [ {