Skip to content

Commit dc77d55

Browse files
committed
fix(elasticsearch): fixed templating issue with elasticsearch, fixes grafana#5135
1 parent 1da149d commit dc77d55

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

public/app/features/templating/templateSrv.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ function (angular, _) {
4242
return value.replace(/([\!\*\+\-\=<>\s\&\|\(\)\[\]\{\}\^\~\?\:\\/"])/g, "\\$1");
4343
}
4444

45+
this.luceneFormat = function(value) {
46+
if (typeof value === 'string') {
47+
return luceneEscape(value);
48+
}
49+
var quotedValues = _.map(value, function(val) {
50+
return '\"' + luceneEscape(val) + '\"';
51+
});
52+
return '(' + quotedValues.join(' OR ') + ')';
53+
};
54+
4555
this.formatValue = function(value, format, variable) {
4656
// for some scopedVars there is no variable
4757
variable = variable || {};
@@ -60,13 +70,7 @@ function (angular, _) {
6070
return '(' + escapedValues.join('|') + ')';
6171
}
6272
case "lucene": {
63-
if (typeof value === 'string') {
64-
return luceneEscape(value);
65-
}
66-
var quotedValues = _.map(value, function(val) {
67-
return '\"' + luceneEscape(val) + '\"';
68-
});
69-
return '(' + quotedValues.join(' OR ') + ')';
73+
return this.luceneFormat(value, format, variable);
7074
}
7175
case "pipe": {
7276
if (typeof value === 'string') {

public/app/plugins/datasource/elasticsearch/datasource.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes
7878
range[timeField]["format"] = "epoch_millis";
7979
}
8080

81-
var queryInterpolated = templateSrv.replace(queryString);
81+
var queryInterpolated = templateSrv.replace(queryString, {}, 'lucene');
8282
var filter = { "bool": { "must": [{ "range": range }] } };
8383
var query = { "bool": { "should": [{ "query_string": { "query": queryInterpolated } }] } };
8484
var data = {
@@ -204,6 +204,14 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes
204204
});
205205
};
206206

207+
function escapeForJson(value) {
208+
return value.replace(/\"/g, '\\"');
209+
}
210+
211+
function luceneThenJsonFormat(value) {
212+
return escapeForJson(templateSrv.luceneFormat(value));
213+
}
214+
207215
this.getFields = function(query) {
208216
return this._get('/_mapping').then(function(res) {
209217
var fields = {};
@@ -246,7 +254,7 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes
246254
var header = this.getQueryHeader('count', range.from, range.to);
247255
var esQuery = angular.toJson(this.queryBuilder.getTermsQuery(queryDef));
248256

249-
esQuery = esQuery.replace("$lucene_query", queryDef.query || '*');
257+
esQuery = esQuery.replace("$lucene_query", escapeForJson(queryDef.query || '*'));
250258
esQuery = esQuery.replace(/\$timeFrom/g, range.from.valueOf());
251259
esQuery = esQuery.replace(/\$timeTo/g, range.to.valueOf());
252260
esQuery = header + '\n' + esQuery + '\n';
@@ -260,7 +268,7 @@ function (angular, _, moment, kbn, ElasticQueryBuilder, IndexPattern, ElasticRes
260268
};
261269

262270
this.metricFindQuery = function(query) {
263-
query = templateSrv.replace(query);
271+
query = templateSrv.replace(query, {}, luceneThenJsonFormat);
264272
query = angular.fromJson(query);
265273
if (!query) {
266274
return $q.when([]);

0 commit comments

Comments
 (0)