From dc00766458978d60192a20eb04dddb3df4a63b00 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Mon, 11 Jan 2016 21:53:53 +0300 Subject: [PATCH] Added initial cache service for groups, hosts, applications and items caching on client side. --- plugins/datasource-zabbix/datasource.js | 8 ++- plugins/datasource-zabbix/zabbixAPIWrapper.js | 49 +++++++++++++++ plugins/datasource-zabbix/zabbixCacheSrv.js | 59 +++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 plugins/datasource-zabbix/zabbixCacheSrv.js diff --git a/plugins/datasource-zabbix/datasource.js b/plugins/datasource-zabbix/datasource.js index 06a3b1a..3cfa693 100644 --- a/plugins/datasource-zabbix/datasource.js +++ b/plugins/datasource-zabbix/datasource.js @@ -5,6 +5,7 @@ define([ './directives', './zabbixAPIWrapper', './helperFunctions', + './zabbixCacheSrv', './queryCtrl' ], function (angular, _, dateMath) { @@ -12,7 +13,8 @@ function (angular, _, dateMath) { var module = angular.module('grafana.services'); - module.factory('ZabbixAPIDatasource', function($q, backendSrv, templateSrv, alertSrv, ZabbixAPI, zabbixHelperSrv) { + module.factory('ZabbixAPIDatasource', function($q, backendSrv, templateSrv, alertSrv, + ZabbixAPI, zabbixHelperSrv, ZabbixCache) { /** * Datasource initialization. Calls when you refresh page, add @@ -48,6 +50,10 @@ function (angular, _, dateMath) { // Initialize Zabbix API this.zabbixAPI = new ZabbixAPI(this.url, this.username, this.password, this.basicAuth, this.withCredentials); + + // Initialize cache service + this.zabbixCache = new ZabbixCache(this.zabbixAPI); + console.log(this.zabbixCache); } /** diff --git a/plugins/datasource-zabbix/zabbixAPIWrapper.js b/plugins/datasource-zabbix/zabbixAPIWrapper.js index 48220ea..51feb76 100644 --- a/plugins/datasource-zabbix/zabbixAPIWrapper.js +++ b/plugins/datasource-zabbix/zabbixAPIWrapper.js @@ -113,6 +113,55 @@ function (angular, _) { }); }; + ////////////////////////// + // High-level functions // + ////////////////////////// + + p.getGroups = function() { + var params = { + output: ['name'], + sortfield: 'name', + selectHosts: [] + }; + + return this.performZabbixAPIRequest('hostgroup.get', params); + }; + + p.getHosts = function() { + var params = { + output: ['name', 'host'], + sortfield: 'name' + }; + + return this.performZabbixAPIRequest('host.get', params); + }; + + p.getApplications = function() { + var params = { + output: ['name'], + sortfield: 'name' + }; + + return this.performZabbixAPIRequest('application.get', params); + }; + + p.getItems = function() { + var params = { + output: ['name', 'key_', 'value_type'], + sortfield: 'name', + //Include web items in the result + webitems: true, + // Return only numeric items + filter: { + value_type: [0, 3] + }, + // Return only enabled items + monitored: true + }; + + return this.performZabbixAPIRequest('item.get', params); + }; + ///////////////////////// // API method wrappers // ///////////////////////// diff --git a/plugins/datasource-zabbix/zabbixCacheSrv.js b/plugins/datasource-zabbix/zabbixCacheSrv.js new file mode 100644 index 0000000..fd6926b --- /dev/null +++ b/plugins/datasource-zabbix/zabbixCacheSrv.js @@ -0,0 +1,59 @@ +define([ + 'angular', + 'lodash' + ], +function (angular, _) { + 'use strict'; + + var module = angular.module('grafana.services'); + + module.factory('ZabbixCache', function($q, backendSrv) { + + function ZabbixCache(zabbixAPI, lifetime) { + var self = this; + this.zabbixAPI = zabbixAPI; + this.lifetime = lifetime; + + var promises = [ + this.zabbixAPI.getGroups(), + this.zabbixAPI.getHosts(), + this.zabbixAPI.getApplications(), + this.zabbixAPI.getItems() + ]; + + $q.all(promises).then(function (results) { + console.log(results); + if (results.length) { + self._groups = results[0]; + self._hosts = results[1]; + self._applications = groupApplications(results[2]); + self._items = results[3]; + } + }); + } + + var p = ZabbixCache.prototype; + + p.getHosts = function() { + return this._hosts; + }; + + /** + * Group Zabbix applications by name + * @param {[type]} applications [description] + * @return {[type]} [description] + */ + function groupApplications(applications) { + return _.map(_.groupBy(applications, 'name'), function (value, key) { + return { + name: key, + ids: _.map(value, 'applicationid') + }; + }); + } + + return ZabbixCache; + + }); + +});