Rewrite query builder to allow for multiple time series.

This commit is contained in:
Adam Heinz 2015-07-02 15:25:00 -04:00
parent 923f9345a7
commit c193208cd2
2 changed files with 55 additions and 72 deletions

View File

@ -295,46 +295,29 @@ function (angular, _, config, kbn, moment, ElasticQueryBuilder) {
}; };
ElasticDatasource.prototype.query = function(options) { ElasticDatasource.prototype.query = function(options) {
var self = this; var queryBuilder = new ElasticQueryBuilder;
var allQueries = options.targets.map(function(target) { var query = queryBuilder.build(options.targets);
if (target.hide) { return []; } query = query.replace(/\$interval/g, options.interval);
var queryBuilder = new ElasticQueryBuilder(target); query = query.replace(/\$rangeFrom/g, options.range.from);
var query = queryBuilder.build(); query = query.replace(/\$rangeTo/g, options.range.to);
console.log(target); query = query.replace(/\$maxDataPoints/g, options.maxDataPoints);
query = query.replace(/\$interval/g, target.interval || options.interval); query = templateSrv.replace(query, options.scopedVars);
query = query.replace(/\$rangeFrom/g, options.range.from); return this._post('/_search?search_type=count', query).then(this._getTimeSeries);
query = query.replace(/\$rangeTo/g, options.range.to); };
query = query.replace(/\$maxDataPoints/g, options.maxDataPoints);
query = query.replace(/\$keyField/g, target.keyField);
query = query.replace(/\$valueField/g, target.valueField);
query = query.replace(/\$termKey/g, target.termKey);
query = query.replace(/\$termValue/g, target.termValue);
query = templateSrv.replace(query, options.scopedVars);
return query;
}).join("\n");
console.log(allQueries); ElasticDatasource.prototype._getTimeSeries = function(results) {
var data = [];
return this._post('/_search?search_type=count', allQueries).then(function(results) { if (results && results.facets) {
if (!results || !results.facets) { for (var target in results.facets) {
return { data: [] }; if (results.facets.hasOwnProperty(target) && results.facets[target].entries) {
var datapoints = results.facets[target].entries.map(function(entry) {
return [entry.mean, entry.time];
});
data.push({ target: target, datapoints: datapoints });
}
} }
return { data: self._getTimeSeries(results.facets) }; }
}); return { data: data };
};
ElasticDatasource.prototype._getTimeSeries = function(facets) {
var self = this;
var targets = ['metric'];
var data = targets.map(function(target) {
var datapoints = facets[target].entries.map(self._getDatapoint);
return { target: target, datapoints: datapoints };
});
return data;
};
ElasticDatasource.prototype._getDatapoint = function(entry) {
return [entry.mean, entry.time];
}; };
return ElasticDatasource; return ElasticDatasource;

View File

@ -3,51 +3,51 @@ define([
function () { function () {
'use strict'; 'use strict';
function ElasticQueryBuilder(target) { function ElasticQueryBuilder() {
this.target = target;
} }
ElasticQueryBuilder.prototype.build = function() { ElasticQueryBuilder.prototype.build = function(targets) {
var target = this.target;
var query = { var query = {
"facets": { "facets": {},
"metric": { "size": "$maxDataPoints"
};
var self = this;
targets.forEach(function(target) {
if (!target.hide) {
query["facets"][target.termKey + "_" + target.termValue] = {
"date_histogram": { "date_histogram": {
"interval": "$interval", "interval": target.interval || "$interval",
"key_field": "$keyField", "key_field": target.keyField,
"min_doc_count": 0, "min_doc_count": 0,
"value_field": "$valueField" "value_field": target.valueField
} },
} "facet_filter": {
},
"query": {
"filtered": {
"filter": {
"and": [ "and": [
{ self._buildRangeFilter(target),
"range": { self._buildTermFilter(target)
"@timestamp": {
"gte": "$rangeFrom",
"lte": "$rangeTo"
}
}
},
{
"term": {
"$termKey": "$termValue",
}
}
] ]
} }
} };
}, }
"size": "$maxDataPoints", });
"sort": "@timestamp"
};
query = JSON.stringify(query); query = JSON.stringify(query);
target.query = query;
return query; return query;
}; };
ElasticQueryBuilder.prototype._buildRangeFilter = function(target) {
var filter = {"range":{}};
filter["range"][target.keyField] = {
"gte": "$rangeFrom",
"lte": "$rangeTo"
};
return filter;
};
ElasticQueryBuilder.prototype._buildTermFilter = function(target) {
var filter = {"term":{}};
filter["term"][target.termKey] = target.termValue;
return filter;
};
return ElasticQueryBuilder; return ElasticQueryBuilder;
}); });