From a1dcd5f069041ae256f6aca18751f0cc87556907 Mon Sep 17 00:00:00 2001 From: Adam Heinz Date: Wed, 1 Jul 2015 08:54:06 -0400 Subject: [PATCH] Initial prototype returning time series from (partially hardcoded) Elasticsearch data source. --- .../datasource/elasticsearch/datasource.js | 43 ++++++++++++++- .../datasource/elasticsearch/queryBuilder.js | 54 +++++++++++++++++++ 2 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 public/app/plugins/datasource/elasticsearch/queryBuilder.js diff --git a/public/app/plugins/datasource/elasticsearch/datasource.js b/public/app/plugins/datasource/elasticsearch/datasource.js index bd23f0cc2b2..9c1eacc78c2 100644 --- a/public/app/plugins/datasource/elasticsearch/datasource.js +++ b/public/app/plugins/datasource/elasticsearch/datasource.js @@ -4,9 +4,10 @@ define([ 'config', 'kbn', 'moment', + './queryBuilder', './directives' ], -function (angular, _, config, kbn, moment) { +function (angular, _, config, kbn, moment, ElasticQueryBuilder) { 'use strict'; var module = angular.module('grafana.services'); @@ -292,8 +293,46 @@ function (angular, _, config, kbn, moment) { }); }; - return ElasticDatasource; + ElasticDatasource.prototype.query = function(options) { + var self = this; + var allQueries = _.map(options.targets, function(target) { + if (target.hide) { return []; } + var queryBuilder = new ElasticQueryBuilder(target); + var query = queryBuilder.build(); + query = query.replace(/\$interval/g, target.interval || options.interval); + query = query.replace(/\$rangeFrom/g, options.range.from); + query = query.replace(/\$rangeTo/g, options.range.to); + query = query.replace(/\$maxDataPoints/g, options.maxDataPoints); + return query; + + }).join("\n"); + + // replace templated variables + // allQueries = templateSrv.replace(allQueries, options.scopedVars); + return this._post('/_search?search_type=count', allQueries).then(function(results) { + if (!results || !results.facets) { + return { data: [] }; + } + return { data: self._getTimeSeries(results.facets) }; + }); + }; + + 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; }); }); diff --git a/public/app/plugins/datasource/elasticsearch/queryBuilder.js b/public/app/plugins/datasource/elasticsearch/queryBuilder.js new file mode 100644 index 00000000000..0d77be464f5 --- /dev/null +++ b/public/app/plugins/datasource/elasticsearch/queryBuilder.js @@ -0,0 +1,54 @@ +define([ +], +function () { + 'use strict'; + + function ElasticQueryBuilder(target) { + this.target = target; + } + + ElasticQueryBuilder.prototype.build = function() { + var target = this.target; + var query = { + "facets": { + "metric": { + "date_histogram": { + "interval": "$interval", + "key_field": "@timestamp", + "min_doc_count": 0, + "value_field": "metric" + } + } + }, + "fields": [], + "query": { + "filtered": { + "filter": { + "and": [ + { + "range": { + "@timestamp": { + "gte": "$rangeFrom", + "lte": "$rangeTo" + } + } + }, + { + "term": { + "service": "cpu", + } + } + ] + } + } + }, + "size": "$maxDataPoints", + "sort": "@timestamp" + }; + query = JSON.stringify(query); + target.query = query; + return query; + }; + + return ElasticQueryBuilder; +});