diff --git a/src/datasource-zabbix/datasource.js b/src/datasource-zabbix/datasource.js index 37beaa1..4c7ccfd 100644 --- a/src/datasource-zabbix/datasource.js +++ b/src/datasource-zabbix/datasource.js @@ -134,8 +134,9 @@ export class ZabbixAPIDatasource { if (!target.mode || target.mode === 0) { // Build query in asynchronous manner - return self.queryProcessor.build(groupFilter, hostFilter, appFilter, itemFilter) - .then(function(items) { + return self.queryProcessor + .build(groupFilter, hostFilter, appFilter, itemFilter, 'num') + .then(items => { // Add hostname for items from multiple hosts var addHostName = utils.isRegex(target.host.filter); var getHistory; @@ -207,35 +208,39 @@ export class ZabbixAPIDatasource { // Query text data else if (target.mode === 2) { - return self.queryProcessor.build(groupFilter, hostFilter, appFilter, itemFilter) - .then(function(items) { - var deferred = self.q.defer(); + return self.queryProcessor + .build(groupFilter, hostFilter, appFilter, itemFilter, 'text') + .then(items => { if (items.length) { - self.zabbixAPI.getLastValue(items[0].itemid).then(function(lastvalue) { - if (target.textFilter) { - var text_extract_pattern = new RegExp(self.replaceTemplateVars(target.textFilter, options.scopedVars)); - var result = text_extract_pattern.exec(lastvalue); - if (result) { - if (target.useCaptureGroups) { - result = result[1]; - } else { - result = result[0]; - } - } - deferred.resolve(result); - } else { - deferred.resolve(lastvalue); - } + var textItemsPromises = _.map(items, item => { + return self.zabbixAPI.getLastValue(item.itemid); }); + return self.q.all(textItemsPromises) + .then(result => { + return _.map(result, (lastvalue, index) => { + var extractedValue; + if (target.textFilter) { + var text_extract_pattern = new RegExp(self.replaceTemplateVars(target.textFilter, options.scopedVars)); + extractedValue = text_extract_pattern.exec(lastvalue); + if (extractedValue) { + if (target.useCaptureGroups) { + extractedValue = extractedValue[1]; + } else { + extractedValue = extractedValue[0]; + } + } + } else { + extractedValue = lastvalue; + } + return { + target: items[index].name, + datapoints: [[extractedValue, to * 1000]] + }; + }); + }); } else { - deferred.resolve(null); + return self.q.when([]); } - return deferred.promise.then(function(text) { - return { - target: target.item.name, - datapoints: [[text, to * 1000]] - }; - }); }); } } diff --git a/src/datasource-zabbix/queryProcessor.service.js b/src/datasource-zabbix/queryProcessor.service.js index c56fda9..35d2401 100644 --- a/src/datasource-zabbix/queryProcessor.service.js +++ b/src/datasource-zabbix/queryProcessor.service.js @@ -14,13 +14,13 @@ angular.module('grafana.services').factory('QueryProcessor', function($q) { /** * Build query in asynchronous manner */ - build(groupFilter, hostFilter, appFilter, itemFilter) { + build(groupFilter, hostFilter, appFilter, itemFilter, itemtype) { var self = this; if (this.cache._initialized) { - return this.$q.when(self.buildFromCache(groupFilter, hostFilter, appFilter, itemFilter)); + return this.$q.when(self.buildFromCache(groupFilter, hostFilter, appFilter, itemFilter, itemtype)); } else { return this.cache.refresh().then(function() { - return self.buildFromCache(groupFilter, hostFilter, appFilter, itemFilter); + return self.buildFromCache(groupFilter, hostFilter, appFilter, itemFilter, itemtype); }); } } @@ -64,8 +64,8 @@ angular.module('grafana.services').factory('QueryProcessor', function($q) { /** * Build query - convert target filters to array of Zabbix items */ - buildFromCache(groupFilter, hostFilter, appFilter, itemFilter, showDisabledItems) { - return this.getItems(groupFilter, hostFilter, appFilter, showDisabledItems) + buildFromCache(groupFilter, hostFilter, appFilter, itemFilter, itemtype, showDisabledItems) { + return this.getItems(groupFilter, hostFilter, appFilter, itemtype, showDisabledItems) .then(items => { return getByFilter(items, itemFilter); }); @@ -108,7 +108,7 @@ angular.module('grafana.services').factory('QueryProcessor', function($q) { }); } - getItems(groupFilter, hostFilter, appFilter, showDisabledItems) { + getItems(groupFilter, hostFilter, appFilter, itemtype, showDisabledItems) { var self = this; return this.getHosts(groupFilter) .then(hosts => { @@ -133,7 +133,7 @@ angular.module('grafana.services').factory('QueryProcessor', function($q) { .then(apps => { if (apps.appFilterEmpty) { return self.cache - .getItems(apps.hostids, undefined) + .getItems(apps.hostids, undefined, itemtype) .then(items => { if (showDisabledItems) { items = _.filter(items, {'status': '0'}); @@ -143,7 +143,7 @@ angular.module('grafana.services').factory('QueryProcessor', function($q) { } else { var appids = _.map(apps, 'applicationid'); return self.cache - .getItems(undefined, appids) + .getItems(undefined, appids, itemtype) .then(items => { if (showDisabledItems) { items = _.filter(items, {'status': '0'}); diff --git a/src/datasource-zabbix/zabbixAPI.service.js b/src/datasource-zabbix/zabbixAPI.service.js index 3f6ea94..df8bcf4 100644 --- a/src/datasource-zabbix/zabbixAPI.service.js +++ b/src/datasource-zabbix/zabbixAPI.service.js @@ -152,7 +152,7 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { * @param {String} itemtype 'num' or 'text' * @return {[type]} array of items */ - getItems(hostids, appids, itemtype='num') { + getItems(hostids, appids, itemtype) { var params = { output: [ 'name', 'key_', @@ -163,10 +163,7 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { ], sortfield: 'name', webitems: true, - filter: { - // Return only numeric items by default - value_type: [0, 3] - }, + filter: {}, selectHosts: [ 'hostid', 'name' @@ -178,6 +175,10 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { if (appids) { params.applicationids = appids; } + if (itemtype === 'num') { + // Return only numeric metrics + params.filter.value_type = [0, 3]; + } if (itemtype === 'text') { // Return only text metrics params.filter.value_type = [1, 2, 4]; diff --git a/src/datasource-zabbix/zabbixCache.service.js b/src/datasource-zabbix/zabbixCache.service.js index fe5e593..3092b08 100644 --- a/src/datasource-zabbix/zabbixCache.service.js +++ b/src/datasource-zabbix/zabbixCache.service.js @@ -102,9 +102,9 @@ angular.module('grafana.services').factory('ZabbixCachingProxy', function($q, $i }); } - getItems(hostids, appids) { + getItems(hostids, appids, itemtype) { var self = this; - return this.getItemsOnce(hostids, appids) + return this.getItemsOnce(hostids, appids, itemtype) .then(items => { self._items = _.union(self._items, items); return items;