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: [
{