From 974d49b0b9f38712db8dd157180e914d75299410 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Tue, 26 May 2015 22:48:02 +0300 Subject: [PATCH] Handle templated queries. --- zabbix/datasource.js | 47 ++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/zabbix/datasource.js b/zabbix/datasource.js index 442bac5..69fdf3c 100644 --- a/zabbix/datasource.js +++ b/zabbix/datasource.js @@ -47,30 +47,24 @@ function (angular, _, kbn) { var item_key = templateSrv.replace(target.item.name); var hostname = templateSrv.replace(target.host.name); - var keys = []; - if (item_key[0] === '{') { - // Convert multiple mettrics to array - // "{metric1,metcic2,...,metricN}" --> [metric1, metcic2,..., metricN] - keys= item_key.slice(1, -1).split(','); - } else { - keys.push(item_key); - } + // extract all keys + var pattern = /([\w.]+(?:\[[^\[]*\])|[\w.]+)/g; + var keys = item_key.match(pattern); var self = this; - var results = []; - _.each(keys, function (key) { - results.push(this.findZabbixItem(hostname, key).then(function (items) { + return _.map(keys, function (key) { + return this.findZabbixItem(hostname, key).then(function (items) { if (items.length) { var item = items[0]; + var itemname = expandItemName(item); return self.performTimeSeriesQuery(item, from, to).then(_.partial( - self.handleZabbixAPIResponse, item.name)); + self.handleZabbixAPIResponse, itemname)); } else { return []; } - })); + }); }, this); - return results; } }, this); @@ -358,7 +352,7 @@ function (angular, _, kbn) { // Return empty object else { var d = $q.defer(); - d.resolve({ data: [] }); + d.resolve([]); return d.promise; } }; @@ -618,3 +612,26 @@ function (angular, _, kbn) { return ZabbixAPIDatasource; }); }); + + +/** + * Expand item parameters, for example: + * CPU $2 time ($3) --> CPU system time (avg1) + * + * @param item: zabbix api item object + * @return: expanded item name (string) + */ +function expandItemName(item) { + var name = item.name; + var key = item.key_; + + // extract params from key: + // "system.cpu.util[,system,avg1]" --> ["", "system", "avg1"] + var key_params = key.substring(key.indexOf('[') + 1, key.lastIndexOf(']')).split(','); + + // replace item parameters + for (var i = key_params.length; i >= 1; i--) { + name = name.replace('$' + i, key_params[i - 1]); + }; + return name; +}; \ No newline at end of file