From ada9bfcae8140f53bd12139a58fc90a636029212 Mon Sep 17 00:00:00 2001 From: Mauro Stettler Date: Sun, 22 Nov 2015 21:39:56 +0900 Subject: [PATCH 1/2] keep track of elastic search version and generate query according to version --- public/app/features/org/datasourceEditCtrl.js | 6 ++++++ .../plugins/datasource/elasticsearch/datasource.js | 4 +++- .../datasource/elasticsearch/partials/config.html | 13 ++++++++++++- .../datasource/elasticsearch/query_builder.js | 11 +++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/public/app/features/org/datasourceEditCtrl.js b/public/app/features/org/datasourceEditCtrl.js index e2d5cc3d75d..4d17707792f 100644 --- a/public/app/features/org/datasourceEditCtrl.js +++ b/public/app/features/org/datasourceEditCtrl.js @@ -24,6 +24,12 @@ function (angular, _, config) { {name: 'Yearly', value: 'Yearly', example: '[logstash-]YYYY'}, ]; + $scope.elasticsearchVersions = [ + {name: '0.x', value: 0}, + {name: '1.x', value: 1}, + {name: '2.x', value: 2}, + ]; + $scope.init = function() { $scope.isNew = true; $scope.datasources = []; diff --git a/public/app/plugins/datasource/elasticsearch/datasource.js b/public/app/plugins/datasource/elasticsearch/datasource.js index 9c749b9459e..6f68951e06c 100644 --- a/public/app/plugins/datasource/elasticsearch/datasource.js +++ b/public/app/plugins/datasource/elasticsearch/datasource.js @@ -23,9 +23,11 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes this.name = datasource.name; this.index = datasource.index; this.timeField = datasource.jsonData.timeField; + this.elasticsearchVersion = datasource.jsonData.elasticsearchVersion; this.indexPattern = new IndexPattern(datasource.index, datasource.jsonData.interval); this.queryBuilder = new ElasticQueryBuilder({ - timeField: this.timeField + timeField: this.timeField, + elasticsearchVersion: this.elasticsearchVersion }); } diff --git a/public/app/plugins/datasource/elasticsearch/partials/config.html b/public/app/plugins/datasource/elasticsearch/partials/config.html index d1cb05801d6..ef596a4deef 100644 --- a/public/app/plugins/datasource/elasticsearch/partials/config.html +++ b/public/app/plugins/datasource/elasticsearch/partials/config.html @@ -20,7 +20,7 @@
-
+
  • Time field name @@ -31,3 +31,14 @@
+
+
    +
  • + Elasticsearch version +
  • +
  • + +
  • +
+
+
diff --git a/public/app/plugins/datasource/elasticsearch/query_builder.js b/public/app/plugins/datasource/elasticsearch/query_builder.js index 129c52d3f02..f67cc716a42 100644 --- a/public/app/plugins/datasource/elasticsearch/query_builder.js +++ b/public/app/plugins/datasource/elasticsearch/query_builder.js @@ -6,11 +6,18 @@ function (angular) { function ElasticQueryBuilder(options) { this.timeField = options.timeField; + this.elasticsearchVersion = options.elasticsearchVersion; } ElasticQueryBuilder.prototype.getRangeFilter = function() { var filter = {}; filter[this.timeField] = {"gte": "$timeFrom", "lte": "$timeTo"}; + + // elastic search versions above 2.0 require the time format to be specified + if (this.elasticsearchVersion >= 2) { + filter[this.timeField]["format"] = "epoch_millis"; + } + return filter; }; @@ -129,6 +136,10 @@ function (angular) { "min_doc_count": 0, "extended_bounds": { "min": "$timeFrom", "max": "$timeTo" } }; + // elastic search versions above 2.0 require the time format to be specified + if (this.elasticsearchVersion >= 2) { + esAgg["date_histogram"]["format"] = "epoch_millis"; + } break; } case 'filters': { From a30ceefa6bacff9936972f41e77070d04005d2d5 Mon Sep 17 00:00:00 2001 From: Mauro Stettler Date: Wed, 25 Nov 2015 16:23:28 +0900 Subject: [PATCH 2/2] add tests for elastic search versioning in query builder and make es version 2 default --- public/app/features/org/datasourceEditCtrl.js | 2 +- .../datasource/elasticsearch/query_builder.js | 4 +-- .../specs/query_builder_specs.ts | 33 +++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/public/app/features/org/datasourceEditCtrl.js b/public/app/features/org/datasourceEditCtrl.js index 4d17707792f..dd526f69308 100644 --- a/public/app/features/org/datasourceEditCtrl.js +++ b/public/app/features/org/datasourceEditCtrl.js @@ -13,7 +13,7 @@ function (angular, _, config) { $scope.httpConfigPartialSrc = 'app/features/org/partials/datasourceHttpConfig.html'; - var defaults = {name: '', type: 'graphite', url: '', access: 'proxy' }; + var defaults = {name: '', type: 'graphite', url: '', access: 'proxy', jsonData: {'elasticsearchVersion': 2} }; $scope.indexPatternTypes = [ {name: 'No pattern', value: undefined}, diff --git a/public/app/plugins/datasource/elasticsearch/query_builder.js b/public/app/plugins/datasource/elasticsearch/query_builder.js index f67cc716a42..045df314b33 100644 --- a/public/app/plugins/datasource/elasticsearch/query_builder.js +++ b/public/app/plugins/datasource/elasticsearch/query_builder.js @@ -13,7 +13,7 @@ function (angular) { var filter = {}; filter[this.timeField] = {"gte": "$timeFrom", "lte": "$timeTo"}; - // elastic search versions above 2.0 require the time format to be specified + // elastic search versions 2.x require the time format to be specified if (this.elasticsearchVersion >= 2) { filter[this.timeField]["format"] = "epoch_millis"; } @@ -136,7 +136,7 @@ function (angular) { "min_doc_count": 0, "extended_bounds": { "min": "$timeFrom", "max": "$timeTo" } }; - // elastic search versions above 2.0 require the time format to be specified + // elastic search versions 2.x require the time format to be specified if (this.elasticsearchVersion >= 2) { esAgg["date_histogram"]["format"] = "epoch_millis"; } 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 bcae7d6e852..25aab0a084c 100644 --- a/public/app/plugins/datasource/elasticsearch/specs/query_builder_specs.ts +++ b/public/app/plugins/datasource/elasticsearch/specs/query_builder_specs.ts @@ -44,6 +44,39 @@ describe('ElasticQueryBuilder', function() { expect(query.aggs["2"].aggs["3"].date_histogram.field).to.be("@timestamp"); }); + it('with es1.x and es2.x date histogram queries check time format', function() { + var builder_2x = new ElasticQueryBuilder({ + timeField: '@timestamp', + elasticsearchVersion: 2 + }); + + var query_params = { + metrics: [], + bucketAggs: [ + {type: 'date_histogram', field: '@timestamp', id: '1'} + ], + }; + + // format should not be specified in 1.x queries + expect("format" in builder.build(query_params)["aggs"]["1"]["date_histogram"]).to.be(false); + + // 2.x query should specify format to be "epoch_millis" + expect(builder_2x.build(query_params)["aggs"]["1"]["date_histogram"]["format"]).to.be("epoch_millis"); + }); + + it('with es1.x and es2.x range filter check time format', function() { + var builder_2x = new ElasticQueryBuilder({ + timeField: '@timestamp', + elasticsearchVersion: 2 + }); + + // format should not be specified in 1.x queries + expect("format" in builder.getRangeFilter()["@timestamp"]).to.be(false); + + // 2.x query should specify format to be "epoch_millis" + expect(builder_2x.getRangeFilter()["@timestamp"]["format"]).to.be("epoch_millis"); + }); + it('with select field', function() { var query = builder.build({ metrics: [{type: 'avg', field: '@value', id: '1'}],