Refacrot ZabbixCachingProxy. Now returns all data in async manner.

This commit is contained in:
Alexander Zobnin
2016-01-31 17:20:16 +03:00
parent 1de4b4bc5c
commit 5b3fe1559c
3 changed files with 144 additions and 97 deletions

View File

@@ -10,13 +10,16 @@ define([
var module = angular.module('grafana.controllers'); var module = angular.module('grafana.controllers');
var targetLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var targetLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
module.controller('ZabbixAPIQueryCtrl', function ($scope, $sce, templateSrv) { module.controller('ZabbixAPIQueryCtrl', function ($scope, $sce, $q, templateSrv) {
var zabbixCache = $scope.datasource.zabbixCache; var zabbixCache = $scope.datasource.zabbixCache;
$scope.init = function () { $scope.init = function () {
$scope.targetLetters = targetLetters; $scope.targetLetters = targetLetters;
$scope.metric = {};
if (!$scope.metric) {
$scope.metric = {};
}
// Load default values // Load default values
var targetDefaults = { var targetDefaults = {
@@ -49,17 +52,9 @@ define([
} }
// Load metrics from cache // Load metrics from cache
if (zabbixCache._initialized) { $scope.getMetricsFromCache().then(function() {
$scope.getMetricsFromCache();
$scope.initFilters(); $scope.initFilters();
//console.log("Cached", $scope.metric); });
} else {
zabbixCache.refresh().then(function () {
$scope.getMetricsFromCache();
$scope.initFilters();
//console.log("From server", $scope.metric);
});
}
} }
else if ($scope.target.mode === 1) { else if ($scope.target.mode === 1) {
$scope.slaPropertyList = [ $scope.slaPropertyList = [
@@ -80,14 +75,22 @@ define([
$scope.metric.filteredItems = $scope.filterItems(); $scope.metric.filteredItems = $scope.filterItems();
}; };
$scope.getMetricsFromCache = function () { $scope.getMetricsFromCache = function() {
var item_type = $scope.editorModes[$scope.target.mode]; var item_type = $scope.editorModes[$scope.target.mode];
$scope.metric = { var promises = [
groupList: zabbixCache.getGroups(), zabbixCache.getGroups(),
hostList: zabbixCache.getHosts(), zabbixCache.getHosts(),
applicationList: zabbixCache.getApplications(), zabbixCache.getApplications(),
itemList: zabbixCache.getItems(item_type) zabbixCache.getItems(item_type)
}; ];
return $q.all(promises).then(function(results) {
$scope.metric = {
groupList: results[0],
hostList: results[1],
applicationList: results[2],
itemList: results[3]
};
});
}; };
// Get list of metric names for bs-typeahead directive // Get list of metric names for bs-typeahead directive

View File

@@ -66,97 +66,115 @@ function (angular, _, utils) {
this.filterApplications = function(hostFilter) { this.filterApplications = function(hostFilter) {
var hosts = []; var hosts = [];
var apps = []; var apps = [];
var hostList = this.cache.getHosts();
// Filter hosts by regex var promises = [
if (utils.isRegex(hostFilter)) { this.cache.getHosts(),
var filterPattern = utils.buildRegex(hostFilter); this.cache.getApplications()
hosts = _.filter(hostList, function (hostObj) { ];
return filterPattern.test(hostObj.name);
}); return $q.all(promises).then(function(results) {
} var hostList = results[0];
// Find applications in selected host var applicationList = results[1];
else {
var finded = _.find(hostList, {'name': hostFilter}); // Filter hosts by regex
if (finded) { if (utils.isRegex(hostFilter)) {
hosts.push(finded); var filterPattern = utils.buildRegex(hostFilter);
} else { hosts = _.filter(hostList, function (hostObj) {
hosts = undefined; return filterPattern.test(hostObj.name);
});
}
// Find applications in selected host
else {
var finded = _.find(hostList, {'name': hostFilter});
if (finded) {
hosts.push(finded);
} else {
hosts = undefined;
}
} }
}
if (hosts) { if (hosts) {
var hostsids = _.map(hosts, 'hostid'); var hostsids = _.map(hosts, 'hostid');
apps = _.filter(this.cache.getApplications(), function (appObj) { apps = _.filter(applicationList, function (appObj) {
return _.intersection(hostsids, appObj.hosts).length; return _.intersection(hostsids, appObj.hosts).length;
}); });
} }
return apps;
return apps; });
}; };
this.filterItems = function (hostFilter, appFilter, showDisabledItems) { this.filterItems = function (hostFilter, appFilter, showDisabledItems) {
var hosts = []; var hosts = [];
var apps = []; var apps = [];
var items = []; var items = [];
var hostList = this.cache.getHosts();
var applicationList = this.cache.getApplications();
// Filter hosts by regex var promises = [
if (utils.isRegex(hostFilter)) { this.cache.getHosts(),
var hostFilterPattern = utils.buildRegex(hostFilter); this.cache.getApplications(),
hosts = _.filter(hostList, function (hostObj) { this.cache.getItems()
return hostFilterPattern.test(hostObj.name); ];
});
} return $q.all(promises).then(function(results) {
else { var hostList = results[0];
var findedHosts = _.find(hostList, {'name': hostFilter}); var applicationList = results[1];
if (findedHosts) { var cachedItems = results[2];
hosts.push(findedHosts);
} else { // Filter hosts by regex
hosts = undefined; if (utils.isRegex(hostFilter)) {
var hostFilterPattern = utils.buildRegex(hostFilter);
hosts = _.filter(hostList, function (hostObj) {
return hostFilterPattern.test(hostObj.name);
});
}
else {
var findedHosts = _.find(hostList, {'name': hostFilter});
if (findedHosts) {
hosts.push(findedHosts);
} else {
hosts = undefined;
}
} }
}
// Filter applications by regex // Filter applications by regex
if (utils.isRegex(appFilter)) { if (utils.isRegex(appFilter)) {
var filterPattern = utils.buildRegex(appFilter); var filterPattern = utils.buildRegex(appFilter);
apps = _.filter(applicationList, function (appObj) { apps = _.filter(applicationList, function (appObj) {
return filterPattern.test(appObj.name); return filterPattern.test(appObj.name);
}); });
} }
// Find items in selected application // Find items in selected application
else if (appFilter) { else if (appFilter) {
var finded = _.find(applicationList, {'name': appFilter}); var finded = _.find(applicationList, {'name': appFilter});
if (finded) { if (finded) {
apps.push(finded); apps.push(finded);
} else {
apps = undefined;
}
} else { } else {
apps = undefined; apps = undefined;
if (hosts) {
items = _.filter(this.cache.getItems(), function (itemObj) {
return _.find(hosts, {'hostid': itemObj.hostid });
});
}
} }
} else {
apps = undefined; if (apps) {
if (hosts) { var appids = _.flatten(_.map(apps, 'applicationids'));
items = _.filter(this.cache.getItems(), function (itemObj) { items = _.filter(cachedItems, function (itemObj) {
return _.intersection(appids, itemObj.applications).length;
});
items = _.filter(items, function (itemObj) {
return _.find(hosts, {'hostid': itemObj.hostid }); return _.find(hosts, {'hostid': itemObj.hostid });
}); });
} }
}
if (apps) { if (!showDisabledItems) {
var appids = _.flatten(_.map(apps, 'applicationids')); items = _.filter(items, {'status': '0'});
items = _.filter(this.cache.getItems(), function (itemObj) { }
return _.intersection(appids, itemObj.applications).length;
});
items = _.filter(items, function (itemObj) {
return _.find(hosts, {'hostid': itemObj.hostid });
});
}
if (!showDisabledItems) { return items;
items = _.filter(items, {'status': '0'}); });
}
return items;
}; };
/** /**

View File

@@ -56,38 +56,64 @@ function (angular, _, utils) {
p.getGroups = function() { p.getGroups = function() {
var self = this; var self = this;
if (this._groups) { if (this._groups) {
return $q.when(self._groups);
} else {
return this.refresh().then(function() { return this.refresh().then(function() {
return self._groups; return self._groups;
}); });
} }
return $q.when(this._groups);
}; };
p.getHosts = function() { p.getHosts = function() {
return this._hosts; var self = this;
if (this._hosts) {
return $q.when(self._hosts);
} else {
return this.refresh().then(function() {
return self._hosts;
});
}
}; };
p.getApplications = function() { p.getApplications = function() {
return this._applications; var self = this;
if (this._applications) {
return $q.when(self._applications);
} else {
return this.refresh().then(function() {
return self._applications;
});
}
}; };
p.getItems = function(type) { p.getItems = function(type) {
var self = this;
if (this._items) {
return $q.when(filterItems(self._items, type));
} else {
return this.refresh().then(function() {
return filterItems(self._items, type);
});
}
};
function filterItems(items, type) {
switch (type) { switch (type) {
case 'num': case 'num':
return _.filter(this._items, function(item) { return _.filter(items, function(item) {
return (item.value_type === '0' || return (item.value_type === '0' ||
item.value_type === '3'); item.value_type === '3');
}); });
case 'text': case 'text':
return _.filter(this._items, function(item) { return _.filter(items, function(item) {
return (item.value_type === '1' || return (item.value_type === '1' ||
item.value_type === '2' || item.value_type === '2' ||
item.value_type === '4'); item.value_type === '4');
}); });
default: default:
return this._items; return items;
} }
}; }
p.getHost = function(hostid) { p.getHost = function(hostid) {
return _.find(this._hosts, {'hostid': hostid}); return _.find(this._hosts, {'hostid': hostid});