refactor: proxy and cache WIP
This commit is contained in:
@@ -24,7 +24,7 @@ System.register(['lodash'], function (_export, _context) {
|
|||||||
var host = _.find(hosts, { 'hostid': item.hostid });
|
var host = _.find(hosts, { 'hostid': item.hostid });
|
||||||
alias = host.name + ": " + alias;
|
alias = host.name + ": " + alias;
|
||||||
}
|
}
|
||||||
// zabbixCachingProxy deduplicates requests and returns one time series for equal queries.
|
// CachingProxy deduplicates requests and returns one time series for equal queries.
|
||||||
// Clone is needed to prevent changing of series object shared between all targets.
|
// Clone is needed to prevent changing of series object shared between all targets.
|
||||||
var datapoints = _.cloneDeep(series.points);
|
var datapoints = _.cloneDeep(series.points);
|
||||||
return {
|
return {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -3,7 +3,7 @@
|
|||||||
System.register(['lodash', '../../../utils', './zabbixAPICore'], function (_export, _context) {
|
System.register(['lodash', '../../../utils', './zabbixAPICore'], function (_export, _context) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var _, utils, ZabbixAPICoreService, _slicedToArray, _createClass, ZabbixAPIConnector;
|
var _, utils, ZabbixAPICore, _slicedToArray, _createClass, ZabbixAPIConnector;
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) {
|
function _classCallCheck(instance, Constructor) {
|
||||||
if (!(instance instanceof Constructor)) {
|
if (!(instance instanceof Constructor)) {
|
||||||
@@ -34,7 +34,7 @@ System.register(['lodash', '../../../utils', './zabbixAPICore'], function (_expo
|
|||||||
}, function (_utils) {
|
}, function (_utils) {
|
||||||
utils = _utils;
|
utils = _utils;
|
||||||
}, function (_zabbixAPICore) {
|
}, function (_zabbixAPICore) {
|
||||||
ZabbixAPICoreService = _zabbixAPICore.ZabbixAPICoreService;
|
ZabbixAPICore = _zabbixAPICore.ZabbixAPICore;
|
||||||
}],
|
}],
|
||||||
execute: function () {
|
execute: function () {
|
||||||
_slicedToArray = function () {
|
_slicedToArray = function () {
|
||||||
@@ -113,7 +113,7 @@ System.register(['lodash', '../../../utils', './zabbixAPICore'], function (_expo
|
|||||||
this.loginErrorCount = 0;
|
this.loginErrorCount = 0;
|
||||||
this.maxLoginAttempts = 3;
|
this.maxLoginAttempts = 3;
|
||||||
|
|
||||||
this.zabbixAPICore = new ZabbixAPICoreService(backendSrv);
|
this.zabbixAPICore = new ZabbixAPICore(backendSrv);
|
||||||
|
|
||||||
this.getTrend = this.getTrend_ZBXNEXT1193;
|
this.getTrend = this.getTrend_ZBXNEXT1193;
|
||||||
//getTrend = getTrend_30;
|
//getTrend = getTrend_30;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -3,7 +3,7 @@
|
|||||||
System.register([], function (_export, _context) {
|
System.register([], function (_export, _context) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var _createClass, ZabbixAPICoreService, ZabbixAPIError;
|
var _createClass, ZabbixAPICore, ZabbixAPIError;
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) {
|
function _classCallCheck(instance, Constructor) {
|
||||||
if (!(instance instanceof Constructor)) {
|
if (!(instance instanceof Constructor)) {
|
||||||
@@ -32,11 +32,11 @@ System.register([], function (_export, _context) {
|
|||||||
};
|
};
|
||||||
}();
|
}();
|
||||||
|
|
||||||
_export("ZabbixAPICoreService", ZabbixAPICoreService = function () {
|
_export("ZabbixAPICore", ZabbixAPICore = function () {
|
||||||
|
|
||||||
/** @ngInject */
|
/** @ngInject */
|
||||||
function ZabbixAPICoreService(backendSrv) {
|
function ZabbixAPICore(backendSrv) {
|
||||||
_classCallCheck(this, ZabbixAPICoreService);
|
_classCallCheck(this, ZabbixAPICore);
|
||||||
|
|
||||||
this.backendSrv = backendSrv;
|
this.backendSrv = backendSrv;
|
||||||
}
|
}
|
||||||
@@ -47,7 +47,7 @@ System.register([], function (_export, _context) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
_createClass(ZabbixAPICoreService, [{
|
_createClass(ZabbixAPICore, [{
|
||||||
key: "request",
|
key: "request",
|
||||||
value: function request(api_url, method, params, options, auth) {
|
value: function request(api_url, method, params, options, auth) {
|
||||||
var requestData = {
|
var requestData = {
|
||||||
@@ -116,10 +116,10 @@ System.register([], function (_export, _context) {
|
|||||||
}
|
}
|
||||||
}]);
|
}]);
|
||||||
|
|
||||||
return ZabbixAPICoreService;
|
return ZabbixAPICore;
|
||||||
}());
|
}());
|
||||||
|
|
||||||
_export("ZabbixAPICoreService", ZabbixAPICoreService);
|
_export("ZabbixAPICore", ZabbixAPICore);
|
||||||
|
|
||||||
_export("ZabbixAPIError", ZabbixAPIError = function () {
|
_export("ZabbixAPIError", ZabbixAPIError = function () {
|
||||||
function ZabbixAPIError(error) {
|
function ZabbixAPIError(error) {
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"version":3,"sources":["../../../../../src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js"],"names":["ZabbixAPICoreService","backendSrv","api_url","method","params","options","auth","requestData","jsonrpc","id","Promise","reject","ZabbixAPIError","data","requestOptions","url","headers","basicAuth","withCredentials","Authorization","datasourceRequest","then","response","error","result","username","password","user","request","code","name","message"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCAIaA,oB;;AAEX;AACA,sCAAYC,UAAZ,EAAwB;AAAA;;AACtB,eAAKA,UAAL,GAAkBA,UAAlB;AACD;;AAED;;;;;;;;kCAIQC,O,EAASC,M,EAAQC,M,EAAQC,O,EAASC,I,EAAM;AAC9C,gBAAIC,cAAc;AAChBC,uBAAS,KADO;AAEhBL,sBAAQA,MAFQ;AAGhBC,sBAAQA,MAHQ;AAIhBK,kBAAI;AAJY,aAAlB;;AAOA,gBAAIH,SAAS,EAAb,EAAiB;AACf;AACA,qBAAOI,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmB,EAACC,MAAM,iBAAP,EAAnB,CAAf,CAAP;AACD,aAHD,MAGO,IAAIP,IAAJ,EAAU;AACf;AACAC,0BAAYD,IAAZ,GAAmBA,IAAnB;AACD;;AAED,gBAAIQ,iBAAiB;AACnBX,sBAAQ,MADW;AAEnBY,mBAAKb,OAFc;AAGnBW,oBAAMN,WAHa;AAInBS,uBAAS;AACP,gCAAgB;AADT;AAJU,aAArB;;AASA;AACA,gBAAIX,QAAQY,SAAR,IAAqBZ,QAAQa,eAAjC,EAAkD;AAChDJ,6BAAeI,eAAf,GAAiC,IAAjC;AACD;AACD,gBAAIb,QAAQY,SAAZ,EAAuB;AACrBH,6BAAeE,OAAf,CAAuBG,aAAvB,GAAuCd,QAAQY,SAA/C;AACD;;AAED,mBAAO,KAAKG,iBAAL,CAAuBN,cAAvB,CAAP;AACD;;;4CAEiBA,c,EAAgB;AAChC,mBAAO,KAAKb,UAAL,CAAgBmB,iBAAhB,CAAkCN,cAAlC,EACNO,IADM,CACD,UAACC,QAAD,EAAc;AAClB,kBAAI,CAACA,SAAST,IAAd,EAAoB;AAClB,uBAAOH,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmB,EAACC,MAAM,wBAAP,EAAnB,CAAf,CAAP;AACD,eAFD,MAEO,IAAIS,SAAST,IAAT,CAAcU,KAAlB,EAAyB;;AAE9B;AACA,uBAAOb,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmBU,SAAST,IAAT,CAAcU,KAAjC,CAAf,CAAP;AACD;;AAED;AACA,qBAAOD,SAAST,IAAT,CAAcW,MAArB;AACD,aAZM,CAAP;AAaD;;;gCAMKtB,O,EAASuB,Q,EAAUC,Q,EAAUrB,O,EAAS;AAC1C,gBAAID,SAAS;AACXuB,oBAAMF,QADK;AAEXC,wBAAUA;AAFC,aAAb;AAIA,mBAAO,KAAKE,OAAL,CAAa1B,OAAb,EAAsB,YAAtB,EAAoCE,MAApC,EAA4CC,OAA5C,EAAqD,IAArD,CAAP;AACD;;;qCAMUH,O,EAASG,O,EAAS;AAC3B,mBAAO,KAAKuB,OAAL,CAAa1B,OAAb,EAAsB,iBAAtB,EAAyC,EAAzC,EAA6CG,OAA7C,CAAP;AACD;;;;;;;;gCAIUO,c;AACX,gCAAYW,KAAZ,EAAmB;AAAA;;AACjB,eAAKM,IAAL,GAAYN,MAAMM,IAAN,IAAc,IAA1B;AACA,eAAKC,IAAL,GAAYP,MAAMQ,OAAN,IAAiB,EAA7B;AACA,eAAKlB,IAAL,GAAYU,MAAMV,IAAN,IAAc,EAA1B;AACA,eAAKkB,OAAL,GAAe,uBAAuB,KAAKD,IAA5B,GAAmC,GAAnC,GAAyC,KAAKjB,IAA7D;AACD;;;;qCAEU;AACT,mBAAO,KAAKiB,IAAL,GAAY,GAAZ,GAAkB,KAAKjB,IAA9B;AACD","file":"zabbixAPICore.js","sourcesContent":["/**\n * General Zabbix API methods\n */\n\nexport class ZabbixAPICoreService {\n\n /** @ngInject */\n constructor(backendSrv) {\n this.backendSrv = backendSrv;\n }\n\n /**\n * Request data from Zabbix API\n * @return {object} response.result\n */\n request(api_url, method, params, options, auth) {\n let requestData = {\n jsonrpc: '2.0',\n method: method,\n params: params,\n id: 1\n };\n\n if (auth === \"\") {\n // Reject immediately if not authenticated\n return Promise.reject(new ZabbixAPIError({data: \"Not authorised.\"}));\n } else if (auth) {\n // Set auth parameter only if it needed\n requestData.auth = auth;\n }\n\n let requestOptions = {\n method: 'POST',\n url: api_url,\n data: requestData,\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n // Set request options for basic auth\n if (options.basicAuth || options.withCredentials) {\n requestOptions.withCredentials = true;\n }\n if (options.basicAuth) {\n requestOptions.headers.Authorization = options.basicAuth;\n }\n\n return this.datasourceRequest(requestOptions);\n }\n\n datasourceRequest(requestOptions) {\n return this.backendSrv.datasourceRequest(requestOptions)\n .then((response) => {\n if (!response.data) {\n return Promise.reject(new ZabbixAPIError({data: \"General Error, no data\"}));\n } else if (response.data.error) {\n\n // Handle Zabbix API errors\n return Promise.reject(new ZabbixAPIError(response.data.error));\n }\n\n // Success\n return response.data.result;\n });\n }\n\n /**\n * Get authentication token.\n * @return {string} auth token\n */\n login(api_url, username, password, options) {\n let params = {\n user: username,\n password: password\n };\n return this.request(api_url, 'user.login', params, options, null);\n }\n\n /**\n * Get Zabbix API version\n * Matches the version of Zabbix starting from Zabbix 2.0.4\n */\n getVersion(api_url, options) {\n return this.request(api_url, 'apiinfo.version', [], options);\n }\n}\n\n// Define zabbix API exception type\nexport class ZabbixAPIError {\n constructor(error) {\n this.code = error.code || null;\n this.name = error.message || \"\";\n this.data = error.data || \"\";\n this.message = \"Zabbix API Error: \" + this.name + \" \" + this.data;\n }\n\n toString() {\n return this.name + \" \" + this.data;\n }\n}\n"]}
|
{"version":3,"sources":["../../../../../src/datasource-zabbix/zabbix/connectors/zabbix_api/zabbixAPICore.js"],"names":["ZabbixAPICore","backendSrv","api_url","method","params","options","auth","requestData","jsonrpc","id","Promise","reject","ZabbixAPIError","data","requestOptions","url","headers","basicAuth","withCredentials","Authorization","datasourceRequest","then","response","error","result","username","password","user","request","code","name","message"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAIaA,a;;AAEX;AACA,+BAAYC,UAAZ,EAAwB;AAAA;;AACtB,eAAKA,UAAL,GAAkBA,UAAlB;AACD;;AAED;;;;;;;;kCAIQC,O,EAASC,M,EAAQC,M,EAAQC,O,EAASC,I,EAAM;AAC9C,gBAAIC,cAAc;AAChBC,uBAAS,KADO;AAEhBL,sBAAQA,MAFQ;AAGhBC,sBAAQA,MAHQ;AAIhBK,kBAAI;AAJY,aAAlB;;AAOA,gBAAIH,SAAS,EAAb,EAAiB;AACf;AACA,qBAAOI,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmB,EAACC,MAAM,iBAAP,EAAnB,CAAf,CAAP;AACD,aAHD,MAGO,IAAIP,IAAJ,EAAU;AACf;AACAC,0BAAYD,IAAZ,GAAmBA,IAAnB;AACD;;AAED,gBAAIQ,iBAAiB;AACnBX,sBAAQ,MADW;AAEnBY,mBAAKb,OAFc;AAGnBW,oBAAMN,WAHa;AAInBS,uBAAS;AACP,gCAAgB;AADT;AAJU,aAArB;;AASA;AACA,gBAAIX,QAAQY,SAAR,IAAqBZ,QAAQa,eAAjC,EAAkD;AAChDJ,6BAAeI,eAAf,GAAiC,IAAjC;AACD;AACD,gBAAIb,QAAQY,SAAZ,EAAuB;AACrBH,6BAAeE,OAAf,CAAuBG,aAAvB,GAAuCd,QAAQY,SAA/C;AACD;;AAED,mBAAO,KAAKG,iBAAL,CAAuBN,cAAvB,CAAP;AACD;;;4CAEiBA,c,EAAgB;AAChC,mBAAO,KAAKb,UAAL,CAAgBmB,iBAAhB,CAAkCN,cAAlC,EACNO,IADM,CACD,UAACC,QAAD,EAAc;AAClB,kBAAI,CAACA,SAAST,IAAd,EAAoB;AAClB,uBAAOH,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmB,EAACC,MAAM,wBAAP,EAAnB,CAAf,CAAP;AACD,eAFD,MAEO,IAAIS,SAAST,IAAT,CAAcU,KAAlB,EAAyB;;AAE9B;AACA,uBAAOb,QAAQC,MAAR,CAAe,IAAIC,cAAJ,CAAmBU,SAAST,IAAT,CAAcU,KAAjC,CAAf,CAAP;AACD;;AAED;AACA,qBAAOD,SAAST,IAAT,CAAcW,MAArB;AACD,aAZM,CAAP;AAaD;;;gCAMKtB,O,EAASuB,Q,EAAUC,Q,EAAUrB,O,EAAS;AAC1C,gBAAID,SAAS;AACXuB,oBAAMF,QADK;AAEXC,wBAAUA;AAFC,aAAb;AAIA,mBAAO,KAAKE,OAAL,CAAa1B,OAAb,EAAsB,YAAtB,EAAoCE,MAApC,EAA4CC,OAA5C,EAAqD,IAArD,CAAP;AACD;;;qCAMUH,O,EAASG,O,EAAS;AAC3B,mBAAO,KAAKuB,OAAL,CAAa1B,OAAb,EAAsB,iBAAtB,EAAyC,EAAzC,EAA6CG,OAA7C,CAAP;AACD;;;;;;;;gCAIUO,c;AACX,gCAAYW,KAAZ,EAAmB;AAAA;;AACjB,eAAKM,IAAL,GAAYN,MAAMM,IAAN,IAAc,IAA1B;AACA,eAAKC,IAAL,GAAYP,MAAMQ,OAAN,IAAiB,EAA7B;AACA,eAAKlB,IAAL,GAAYU,MAAMV,IAAN,IAAc,EAA1B;AACA,eAAKkB,OAAL,GAAe,uBAAuB,KAAKD,IAA5B,GAAmC,GAAnC,GAAyC,KAAKjB,IAA7D;AACD;;;;qCAEU;AACT,mBAAO,KAAKiB,IAAL,GAAY,GAAZ,GAAkB,KAAKjB,IAA9B;AACD","file":"zabbixAPICore.js","sourcesContent":["/**\n * General Zabbix API methods\n */\n\nexport class ZabbixAPICore {\n\n /** @ngInject */\n constructor(backendSrv) {\n this.backendSrv = backendSrv;\n }\n\n /**\n * Request data from Zabbix API\n * @return {object} response.result\n */\n request(api_url, method, params, options, auth) {\n let requestData = {\n jsonrpc: '2.0',\n method: method,\n params: params,\n id: 1\n };\n\n if (auth === \"\") {\n // Reject immediately if not authenticated\n return Promise.reject(new ZabbixAPIError({data: \"Not authorised.\"}));\n } else if (auth) {\n // Set auth parameter only if it needed\n requestData.auth = auth;\n }\n\n let requestOptions = {\n method: 'POST',\n url: api_url,\n data: requestData,\n headers: {\n 'Content-Type': 'application/json'\n }\n };\n\n // Set request options for basic auth\n if (options.basicAuth || options.withCredentials) {\n requestOptions.withCredentials = true;\n }\n if (options.basicAuth) {\n requestOptions.headers.Authorization = options.basicAuth;\n }\n\n return this.datasourceRequest(requestOptions);\n }\n\n datasourceRequest(requestOptions) {\n return this.backendSrv.datasourceRequest(requestOptions)\n .then((response) => {\n if (!response.data) {\n return Promise.reject(new ZabbixAPIError({data: \"General Error, no data\"}));\n } else if (response.data.error) {\n\n // Handle Zabbix API errors\n return Promise.reject(new ZabbixAPIError(response.data.error));\n }\n\n // Success\n return response.data.result;\n });\n }\n\n /**\n * Get authentication token.\n * @return {string} auth token\n */\n login(api_url, username, password, options) {\n let params = {\n user: username,\n password: password\n };\n return this.request(api_url, 'user.login', params, options, null);\n }\n\n /**\n * Get Zabbix API version\n * Matches the version of Zabbix starting from Zabbix 2.0.4\n */\n getVersion(api_url, options) {\n return this.request(api_url, 'apiinfo.version', [], options);\n }\n}\n\n// Define zabbix API exception type\nexport class ZabbixAPIError {\n constructor(error) {\n this.code = error.code || null;\n this.name = error.message || \"\";\n this.data = error.data || \"\";\n this.message = \"Zabbix API Error: \" + this.name + \" \" + this.data;\n }\n\n toString() {\n return this.name + \" \" + this.data;\n }\n}\n"]}
|
||||||
150
dist/datasource-zabbix/zabbix/proxy/cachingProxy.js
vendored
Normal file
150
dist/datasource-zabbix/zabbix/proxy/cachingProxy.js
vendored
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
System.register([], function (_export, _context) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var _createClass, CachingProxy;
|
||||||
|
|
||||||
|
function _classCallCheck(instance, Constructor) {
|
||||||
|
if (!(instance instanceof Constructor)) {
|
||||||
|
throw new TypeError("Cannot call a class as a function");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap request to prevent multiple calls
|
||||||
|
* with same params when waiting for result.
|
||||||
|
*/
|
||||||
|
function callOnce(func, promiseKeeper, funcScope) {
|
||||||
|
return function () {
|
||||||
|
var hash = getRequestHash(arguments);
|
||||||
|
if (!promiseKeeper[hash]) {
|
||||||
|
promiseKeeper[hash] = Promise.resolve(func.apply(funcScope, arguments).then(function (result) {
|
||||||
|
promiseKeeper[hash] = null;
|
||||||
|
return result;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
return promiseKeeper[hash];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function _cacheRequest(func, funcName, funcScope, self) {
|
||||||
|
return function () {
|
||||||
|
if (!self.cache[funcName]) {
|
||||||
|
self.cache[funcName] = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
var cacheObject = self.cache[funcName];
|
||||||
|
var hash = getRequestHash(arguments);
|
||||||
|
if (self.cacheEnabled && !self._isExpired(cacheObject[hash])) {
|
||||||
|
return Promise.resolve(cacheObject[hash].value);
|
||||||
|
} else {
|
||||||
|
return func.apply(funcScope, arguments).then(function (result) {
|
||||||
|
cacheObject[hash] = {
|
||||||
|
value: result,
|
||||||
|
timestamp: Date.now()
|
||||||
|
};
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRequestHash(args) {
|
||||||
|
var argsJson = JSON.stringify(args);
|
||||||
|
return argsJson.getHash();
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
setters: [],
|
||||||
|
execute: function () {
|
||||||
|
_createClass = function () {
|
||||||
|
function defineProperties(target, props) {
|
||||||
|
for (var i = 0; i < props.length; i++) {
|
||||||
|
var descriptor = props[i];
|
||||||
|
descriptor.enumerable = descriptor.enumerable || false;
|
||||||
|
descriptor.configurable = true;
|
||||||
|
if ("value" in descriptor) descriptor.writable = true;
|
||||||
|
Object.defineProperty(target, descriptor.key, descriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return function (Constructor, protoProps, staticProps) {
|
||||||
|
if (protoProps) defineProperties(Constructor.prototype, protoProps);
|
||||||
|
if (staticProps) defineProperties(Constructor, staticProps);
|
||||||
|
return Constructor;
|
||||||
|
};
|
||||||
|
}();
|
||||||
|
|
||||||
|
_export("CachingProxy", CachingProxy = function () {
|
||||||
|
function CachingProxy(cacheOptions) {
|
||||||
|
_classCallCheck(this, CachingProxy);
|
||||||
|
|
||||||
|
this.cacheEnabled = cacheOptions.enabled;
|
||||||
|
this.ttl = cacheOptions.ttl || 600000; // 10 minutes by default
|
||||||
|
|
||||||
|
// Internal objects for data storing
|
||||||
|
this.cache = {};
|
||||||
|
this.promises = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that result is present in the cache and is up to date or send request otherwise.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
_createClass(CachingProxy, [{
|
||||||
|
key: "cacheRequest",
|
||||||
|
value: function cacheRequest(func, funcName, funcScope) {
|
||||||
|
return _cacheRequest(func, funcName, funcScope, this);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: "proxyfy",
|
||||||
|
value: function proxyfy(func, funcName, funcScope) {
|
||||||
|
if (!this.promises[funcName]) {
|
||||||
|
this.promises[funcName] = {};
|
||||||
|
}
|
||||||
|
var promiseKeeper = this.promises[funcName];
|
||||||
|
return callOnce(func, promiseKeeper, funcScope);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: "proxyfyWithCache",
|
||||||
|
value: function proxyfyWithCache(func, funcName, funcScope) {
|
||||||
|
var proxyfied = this.proxyfy(func, funcName, funcScope);
|
||||||
|
return this.cacheRequest(proxyfied, funcName, funcScope);
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: "_isExpired",
|
||||||
|
value: function _isExpired(cacheObject) {
|
||||||
|
if (cacheObject) {
|
||||||
|
var object_age = Date.now() - cacheObject.timestamp;
|
||||||
|
return !(cacheObject.timestamp && object_age < this.ttl);
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
return CachingProxy;
|
||||||
|
}());
|
||||||
|
|
||||||
|
_export("CachingProxy", CachingProxy);
|
||||||
|
|
||||||
|
String.prototype.getHash = function () {
|
||||||
|
var hash = 0,
|
||||||
|
i,
|
||||||
|
chr,
|
||||||
|
len;
|
||||||
|
if (this.length !== 0) {
|
||||||
|
for (i = 0, len = this.length; i < len; i++) {
|
||||||
|
chr = this.charCodeAt(i);
|
||||||
|
hash = (hash << 5) - hash + chr;
|
||||||
|
hash |= 0; // Convert to 32bit integer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hash;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
//# sourceMappingURL=cachingProxy.js.map
|
||||||
1
dist/datasource-zabbix/zabbix/proxy/cachingProxy.js.map
vendored
Normal file
1
dist/datasource-zabbix/zabbix/proxy/cachingProxy.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1,283 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
System.register(['lodash'], function (_export, _context) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var _, _createClass, ZabbixCachingProxy;
|
|
||||||
|
|
||||||
function _toConsumableArray(arr) {
|
|
||||||
if (Array.isArray(arr)) {
|
|
||||||
for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
|
|
||||||
arr2[i] = arr[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return arr2;
|
|
||||||
} else {
|
|
||||||
return Array.from(arr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) {
|
|
||||||
if (!(instance instanceof Constructor)) {
|
|
||||||
throw new TypeError("Cannot call a class as a function");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrap zabbix API request to prevent multiple calls
|
|
||||||
* with same params when waiting for result.
|
|
||||||
*/
|
|
||||||
function callAPIRequestOnce(func, promiseKeeper, argsHashFunc) {
|
|
||||||
return function () {
|
|
||||||
var hash = argsHashFunc(arguments);
|
|
||||||
if (!promiseKeeper[hash]) {
|
|
||||||
promiseKeeper[hash] = Promise.resolve(func.apply(this, arguments).then(function (result) {
|
|
||||||
promiseKeeper[hash] = null;
|
|
||||||
return result;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
return promiseKeeper[hash];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRequestHash(args) {
|
|
||||||
var requestStamp = _.map(args, function (arg) {
|
|
||||||
if (arg === undefined) {
|
|
||||||
return 'undefined';
|
|
||||||
} else {
|
|
||||||
if (_.isArray(arg)) {
|
|
||||||
return arg.sort().toString();
|
|
||||||
} else {
|
|
||||||
return arg.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).join();
|
|
||||||
return requestStamp.getHash();
|
|
||||||
}
|
|
||||||
|
|
||||||
function getHistoryRequestHash(args) {
|
|
||||||
var itemids = _.map(args[0], 'itemid');
|
|
||||||
var stamp = itemids.join() + args[1] + args[2];
|
|
||||||
return stamp.getHash();
|
|
||||||
}
|
|
||||||
|
|
||||||
function getDBQueryHash(args) {
|
|
||||||
var itemids = _.map(args[0], 'itemid');
|
|
||||||
var consolidateBy = args[3].consolidateBy;
|
|
||||||
var intervalMs = args[3].intervalMs;
|
|
||||||
var stamp = itemids.join() + args[1] + args[2] + consolidateBy + intervalMs;
|
|
||||||
return stamp.getHash();
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
setters: [function (_lodash) {
|
|
||||||
_ = _lodash.default;
|
|
||||||
}],
|
|
||||||
execute: function () {
|
|
||||||
_createClass = function () {
|
|
||||||
function defineProperties(target, props) {
|
|
||||||
for (var i = 0; i < props.length; i++) {
|
|
||||||
var descriptor = props[i];
|
|
||||||
descriptor.enumerable = descriptor.enumerable || false;
|
|
||||||
descriptor.configurable = true;
|
|
||||||
if ("value" in descriptor) descriptor.writable = true;
|
|
||||||
Object.defineProperty(target, descriptor.key, descriptor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return function (Constructor, protoProps, staticProps) {
|
|
||||||
if (protoProps) defineProperties(Constructor.prototype, protoProps);
|
|
||||||
if (staticProps) defineProperties(Constructor, staticProps);
|
|
||||||
return Constructor;
|
|
||||||
};
|
|
||||||
}();
|
|
||||||
|
|
||||||
_export('ZabbixCachingProxy', ZabbixCachingProxy = function () {
|
|
||||||
function ZabbixCachingProxy(zabbixAPI, zabbixDBConnector, cacheOptions) {
|
|
||||||
_classCallCheck(this, ZabbixCachingProxy);
|
|
||||||
|
|
||||||
this.zabbixAPI = zabbixAPI;
|
|
||||||
this.dbConnector = zabbixDBConnector;
|
|
||||||
this.cacheEnabled = cacheOptions.enabled;
|
|
||||||
this.ttl = cacheOptions.ttl || 600000; // 10 minutes by default
|
|
||||||
|
|
||||||
// Internal objects for data storing
|
|
||||||
this.cache = {
|
|
||||||
groups: {},
|
|
||||||
hosts: {},
|
|
||||||
applications: {},
|
|
||||||
items: {},
|
|
||||||
history: {},
|
|
||||||
trends: {},
|
|
||||||
macros: {},
|
|
||||||
globalMacros: {},
|
|
||||||
itServices: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.historyPromises = {};
|
|
||||||
|
|
||||||
// Don't run duplicated history requests
|
|
||||||
this.getHistory = callAPIRequestOnce(_.bind(this.zabbixAPI.getHistory, this.zabbixAPI), this.historyPromises, getHistoryRequestHash);
|
|
||||||
|
|
||||||
if (this.dbConnector) {
|
|
||||||
this.getHistoryDB = callAPIRequestOnce(_.bind(this.dbConnector.getHistory, this.dbConnector), this.historyPromises, getDBQueryHash);
|
|
||||||
this.getTrendsDB = callAPIRequestOnce(_.bind(this.dbConnector.getTrends, this.dbConnector), this.historyPromises, getDBQueryHash);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't run duplicated requests
|
|
||||||
this.groupPromises = {};
|
|
||||||
this.getGroupsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getGroups, this.zabbixAPI), this.groupPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.hostPromises = {};
|
|
||||||
this.getHostsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getHosts, this.zabbixAPI), this.hostPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.appPromises = {};
|
|
||||||
this.getAppsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getApps, this.zabbixAPI), this.appPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.itemPromises = {};
|
|
||||||
this.getItemsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getItems, this.zabbixAPI), this.itemPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.itemByIdPromises = {};
|
|
||||||
this.getItemsByIdOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getItemsByIDs, this.zabbixAPI), this.itemPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.itServicesPromises = {};
|
|
||||||
this.getITServicesOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getITService, this.zabbixAPI), this.itServicesPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.macroPromises = {};
|
|
||||||
this.getMacrosOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getMacros, this.zabbixAPI), this.macroPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.globalMacroPromises = {};
|
|
||||||
this.getGlobalMacrosOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getGlobalMacros, this.zabbixAPI), this.globalMacroPromises, getRequestHash);
|
|
||||||
}
|
|
||||||
|
|
||||||
_createClass(ZabbixCachingProxy, [{
|
|
||||||
key: 'isExpired',
|
|
||||||
value: function isExpired(cacheObject) {
|
|
||||||
if (cacheObject) {
|
|
||||||
var object_age = Date.now() - cacheObject.timestamp;
|
|
||||||
return !(cacheObject.timestamp && object_age < this.ttl);
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'proxyRequest',
|
|
||||||
value: function proxyRequest(request, params, cacheObject) {
|
|
||||||
var hash = getRequestHash(params);
|
|
||||||
if (this.cacheEnabled && !this.isExpired(cacheObject[hash])) {
|
|
||||||
return Promise.resolve(cacheObject[hash].value);
|
|
||||||
} else {
|
|
||||||
return request.apply(undefined, _toConsumableArray(params)).then(function (result) {
|
|
||||||
cacheObject[hash] = {
|
|
||||||
value: result,
|
|
||||||
timestamp: Date.now()
|
|
||||||
};
|
|
||||||
return result;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getGroups',
|
|
||||||
value: function getGroups() {
|
|
||||||
return this.proxyRequest(this.getGroupsOnce, [], this.cache.groups);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getHosts',
|
|
||||||
value: function getHosts(groupids) {
|
|
||||||
return this.proxyRequest(this.getHostsOnce, [groupids], this.cache.hosts);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getApps',
|
|
||||||
value: function getApps(hostids) {
|
|
||||||
return this.proxyRequest(this.getAppsOnce, [hostids], this.cache.applications);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getItems',
|
|
||||||
value: function getItems(hostids, appids, itemtype) {
|
|
||||||
var params = [hostids, appids, itemtype];
|
|
||||||
return this.proxyRequest(this.getItemsOnce, params, this.cache.items);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getItemsByIDs',
|
|
||||||
value: function getItemsByIDs(itemids) {
|
|
||||||
var params = [itemids];
|
|
||||||
return this.proxyRequest(this.getItemsByIdOnce, params, this.cache.items);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getITServices',
|
|
||||||
value: function getITServices() {
|
|
||||||
return this.proxyRequest(this.getITServicesOnce, [], this.cache.itServices);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getMacros',
|
|
||||||
value: function getMacros(hostids) {
|
|
||||||
// Merge global macros and host macros
|
|
||||||
var promises = [this.proxyRequest(this.getMacrosOnce, [hostids], this.cache.macros), this.proxyRequest(this.getGlobalMacrosOnce, [], this.cache.globalMacros)];
|
|
||||||
|
|
||||||
return Promise.all(promises).then(_.flatten);
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getHistoryFromCache',
|
|
||||||
value: function getHistoryFromCache(items, time_from, time_till) {
|
|
||||||
var historyStorage = this.cache.history;
|
|
||||||
var full_history;
|
|
||||||
var expired = _.filter(_.keyBy(items, 'itemid'), function (item, itemid) {
|
|
||||||
return !historyStorage[itemid];
|
|
||||||
});
|
|
||||||
if (expired.length) {
|
|
||||||
return this.zabbixAPI.getHistory(expired, time_from, time_till).then(function (history) {
|
|
||||||
var grouped_history = _.groupBy(history, 'itemid');
|
|
||||||
_.forEach(expired, function (item) {
|
|
||||||
var itemid = item.itemid;
|
|
||||||
historyStorage[itemid] = item;
|
|
||||||
historyStorage[itemid].time_from = time_from;
|
|
||||||
historyStorage[itemid].time_till = time_till;
|
|
||||||
historyStorage[itemid].history = grouped_history[itemid];
|
|
||||||
});
|
|
||||||
full_history = _.map(items, function (item) {
|
|
||||||
return historyStorage[item.itemid].history;
|
|
||||||
});
|
|
||||||
return _.flatten(full_history, true);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
full_history = _.map(items, function (item) {
|
|
||||||
return historyStorage[item.itemid].history;
|
|
||||||
});
|
|
||||||
return Promise.resolve(_.flatten(full_history, true));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
key: 'getHistoryFromAPI',
|
|
||||||
value: function getHistoryFromAPI(items, time_from, time_till) {
|
|
||||||
return this.zabbixAPI.getHistory(items, time_from, time_till);
|
|
||||||
}
|
|
||||||
}]);
|
|
||||||
|
|
||||||
return ZabbixCachingProxy;
|
|
||||||
}());
|
|
||||||
|
|
||||||
_export('ZabbixCachingProxy', ZabbixCachingProxy);
|
|
||||||
|
|
||||||
String.prototype.getHash = function () {
|
|
||||||
var hash = 0,
|
|
||||||
i,
|
|
||||||
chr,
|
|
||||||
len;
|
|
||||||
if (this.length !== 0) {
|
|
||||||
for (i = 0, len = this.length; i < len; i++) {
|
|
||||||
chr = this.charCodeAt(i);
|
|
||||||
hash = (hash << 5) - hash + chr;
|
|
||||||
hash |= 0; // Convert to 32bit integer
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return hash;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Fix for backward compatibility with lodash 2.4
|
|
||||||
if (!_.keyBy) {
|
|
||||||
_.keyBy = _.indexBy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
//# sourceMappingURL=zabbixCachingProxy.js.map
|
|
||||||
File diff suppressed because one or more lines are too long
145
dist/datasource-zabbix/zabbix/zabbix.js
vendored
145
dist/datasource-zabbix/zabbix/zabbix.js
vendored
@@ -1,9 +1,9 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnector', './connectors/sql/zabbixDBConnector', './proxy/zabbixCachingProxy'], function (_export, _context) {
|
System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnector', './connectors/sql/zabbixDBConnector', './proxy/cachingProxy'], function (_export, _context) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var _, utils, ZabbixAPIConnector, ZabbixDBConnector, ZabbixCachingProxy, _slicedToArray, _createClass, Zabbix;
|
var _, utils, ZabbixAPIConnector, ZabbixDBConnector, CachingProxy, _slicedToArray, _createClass, REQUESTS_TO_PROXYFY, REQUESTS_TO_CACHE, REQUESTS_TO_BIND, Zabbix;
|
||||||
|
|
||||||
function _toConsumableArray(arr) {
|
function _toConsumableArray(arr) {
|
||||||
if (Array.isArray(arr)) {
|
if (Array.isArray(arr)) {
|
||||||
@@ -23,10 +23,6 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// angular
|
|
||||||
// .module('grafana.services')
|
|
||||||
// .factory('Zabbix', ZabbixFactory);
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -99,8 +95,8 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect
|
|||||||
ZabbixAPIConnector = _connectorsZabbix_apiZabbixAPIConnector.ZabbixAPIConnector;
|
ZabbixAPIConnector = _connectorsZabbix_apiZabbixAPIConnector.ZabbixAPIConnector;
|
||||||
}, function (_connectorsSqlZabbixDBConnector) {
|
}, function (_connectorsSqlZabbixDBConnector) {
|
||||||
ZabbixDBConnector = _connectorsSqlZabbixDBConnector.ZabbixDBConnector;
|
ZabbixDBConnector = _connectorsSqlZabbixDBConnector.ZabbixDBConnector;
|
||||||
}, function (_proxyZabbixCachingProxy) {
|
}, function (_proxyCachingProxy) {
|
||||||
ZabbixCachingProxy = _proxyZabbixCachingProxy.ZabbixCachingProxy;
|
CachingProxy = _proxyCachingProxy.CachingProxy;
|
||||||
}],
|
}],
|
||||||
execute: function () {
|
execute: function () {
|
||||||
_slicedToArray = function () {
|
_slicedToArray = function () {
|
||||||
@@ -159,6 +155,10 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect
|
|||||||
};
|
};
|
||||||
}();
|
}();
|
||||||
|
|
||||||
|
REQUESTS_TO_PROXYFY = ['getHistory', 'getTrend', 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', 'getEvents', 'getAlerts', 'getHostAlerts', 'getAcknowledges', 'getITService', 'getSLA', 'getVersion'];
|
||||||
|
REQUESTS_TO_CACHE = ['getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', 'getITService'];
|
||||||
|
REQUESTS_TO_BIND = ['getHistory', 'getTrend', 'getMacros', 'getItemsByIDs', 'getEvents', 'getAlerts', 'getHostAlerts', 'getAcknowledges', 'getITService', 'getSLA', 'getVersion', 'login'];
|
||||||
|
|
||||||
_export('Zabbix', Zabbix = function () {
|
_export('Zabbix', Zabbix = function () {
|
||||||
|
|
||||||
/** @ngInject */
|
/** @ngInject */
|
||||||
@@ -174,42 +174,111 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect
|
|||||||
sqlDatasourceId = options.sqlDatasourceId;
|
sqlDatasourceId = options.sqlDatasourceId;
|
||||||
|
|
||||||
|
|
||||||
// Initialize Zabbix API
|
|
||||||
this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv);
|
|
||||||
|
|
||||||
if (enableDirectDBConnection) {
|
|
||||||
this.dbConnector = new ZabbixDBConnector(sqlDatasourceId, {}, backendSrv, datasourceSrv);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize caching proxy for requests
|
// Initialize caching proxy for requests
|
||||||
var cacheOptions = {
|
var cacheOptions = {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
ttl: cacheTTL
|
ttl: cacheTTL
|
||||||
};
|
};
|
||||||
this.cachingProxy = new ZabbixCachingProxy(this.zabbixAPI, this.dbConnector, cacheOptions);
|
this.cachingProxy = new CachingProxy(cacheOptions);
|
||||||
|
|
||||||
// Proxy methods
|
this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv);
|
||||||
this.getHistory = this.cachingProxy.getHistory.bind(this.cachingProxy);
|
|
||||||
this.getMacros = this.cachingProxy.getMacros.bind(this.cachingProxy);
|
|
||||||
this.getItemsByIDs = this.cachingProxy.getItemsByIDs.bind(this.cachingProxy);
|
|
||||||
|
|
||||||
if (enableDirectDBConnection) {
|
if (enableDirectDBConnection) {
|
||||||
this.getHistoryDB = this.cachingProxy.getHistoryDB.bind(this.cachingProxy);
|
this.dbConnector = new ZabbixDBConnector(sqlDatasourceId, {}, backendSrv, datasourceSrv);
|
||||||
this.getTrendsDB = this.cachingProxy.getTrendsDB.bind(this.cachingProxy);
|
this.getHistoryDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getHistory, 'getHistory', this.dbConnector);
|
||||||
|
this.getTrendsDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getTrends, 'getTrends', this.dbConnector);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getTrend = this.zabbixAPI.getTrend.bind(this.zabbixAPI);
|
this.proxyfyRequests();
|
||||||
this.getEvents = this.zabbixAPI.getEvents.bind(this.zabbixAPI);
|
this.cacheRequests();
|
||||||
this.getAlerts = this.zabbixAPI.getAlerts.bind(this.zabbixAPI);
|
this.bindRequests();
|
||||||
this.getHostAlerts = this.zabbixAPI.getHostAlerts.bind(this.zabbixAPI);
|
|
||||||
this.getAcknowledges = this.zabbixAPI.getAcknowledges.bind(this.zabbixAPI);
|
|
||||||
this.getITService = this.zabbixAPI.getITService.bind(this.zabbixAPI);
|
|
||||||
this.getSLA = this.zabbixAPI.getSLA.bind(this.zabbixAPI);
|
|
||||||
this.getVersion = this.zabbixAPI.getVersion.bind(this.zabbixAPI);
|
|
||||||
this.login = this.zabbixAPI.login.bind(this.zabbixAPI);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_createClass(Zabbix, [{
|
_createClass(Zabbix, [{
|
||||||
|
key: 'proxyfyRequests',
|
||||||
|
value: function proxyfyRequests() {
|
||||||
|
var _iteratorNormalCompletion = true;
|
||||||
|
var _didIteratorError = false;
|
||||||
|
var _iteratorError = undefined;
|
||||||
|
|
||||||
|
try {
|
||||||
|
for (var _iterator = REQUESTS_TO_PROXYFY[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
||||||
|
var request = _step.value;
|
||||||
|
|
||||||
|
this.zabbixAPI[request] = this.cachingProxy.proxyfy(this.zabbixAPI[request], request, this.zabbixAPI);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
_didIteratorError = true;
|
||||||
|
_iteratorError = err;
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (!_iteratorNormalCompletion && _iterator.return) {
|
||||||
|
_iterator.return();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (_didIteratorError) {
|
||||||
|
throw _iteratorError;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'cacheRequests',
|
||||||
|
value: function cacheRequests() {
|
||||||
|
var _iteratorNormalCompletion2 = true;
|
||||||
|
var _didIteratorError2 = false;
|
||||||
|
var _iteratorError2 = undefined;
|
||||||
|
|
||||||
|
try {
|
||||||
|
for (var _iterator2 = REQUESTS_TO_CACHE[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
||||||
|
var request = _step2.value;
|
||||||
|
|
||||||
|
this.zabbixAPI[request] = this.cachingProxy.cacheRequest(this.zabbixAPI[request], request, this.zabbixAPI);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
_didIteratorError2 = true;
|
||||||
|
_iteratorError2 = err;
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
||||||
|
_iterator2.return();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (_didIteratorError2) {
|
||||||
|
throw _iteratorError2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'bindRequests',
|
||||||
|
value: function bindRequests() {
|
||||||
|
var _iteratorNormalCompletion3 = true;
|
||||||
|
var _didIteratorError3 = false;
|
||||||
|
var _iteratorError3 = undefined;
|
||||||
|
|
||||||
|
try {
|
||||||
|
for (var _iterator3 = REQUESTS_TO_BIND[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
||||||
|
var request = _step3.value;
|
||||||
|
|
||||||
|
this[request] = this.zabbixAPI[request].bind(this.zabbixAPI);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
_didIteratorError3 = true;
|
||||||
|
_iteratorError3 = err;
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (!_iteratorNormalCompletion3 && _iterator3.return) {
|
||||||
|
_iterator3.return();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (_didIteratorError3) {
|
||||||
|
throw _iteratorError3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
key: 'getItemsFromTarget',
|
key: 'getItemsFromTarget',
|
||||||
value: function getItemsFromTarget(target, options) {
|
value: function getItemsFromTarget(target, options) {
|
||||||
var parts = ['group', 'host', 'application', 'item'];
|
var parts = ['group', 'host', 'application', 'item'];
|
||||||
@@ -239,7 +308,7 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect
|
|||||||
}, {
|
}, {
|
||||||
key: 'getAllGroups',
|
key: 'getAllGroups',
|
||||||
value: function getAllGroups() {
|
value: function getAllGroups() {
|
||||||
return this.cachingProxy.getGroups();
|
return this.zabbixAPI.getGroups();
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
key: 'getGroups',
|
key: 'getGroups',
|
||||||
@@ -255,7 +324,7 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect
|
|||||||
|
|
||||||
return this.getGroups(groupFilter).then(function (groups) {
|
return this.getGroups(groupFilter).then(function (groups) {
|
||||||
var groupids = _.map(groups, 'groupid');
|
var groupids = _.map(groups, 'groupid');
|
||||||
return _this.cachingProxy.getHosts(groupids);
|
return _this.zabbixAPI.getHosts(groupids);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
@@ -272,7 +341,7 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect
|
|||||||
|
|
||||||
return this.getHosts(groupFilter, hostFilter).then(function (hosts) {
|
return this.getHosts(groupFilter, hostFilter).then(function (hosts) {
|
||||||
var hostids = _.map(hosts, 'hostid');
|
var hostids = _.map(hosts, 'hostid');
|
||||||
return _this2.cachingProxy.getApps(hostids);
|
return _this2.zabbixAPI.getApps(hostids);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
@@ -283,7 +352,7 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect
|
|||||||
return this.getHosts(groupFilter, hostFilter).then(function (hosts) {
|
return this.getHosts(groupFilter, hostFilter).then(function (hosts) {
|
||||||
var hostids = _.map(hosts, 'hostid');
|
var hostids = _.map(hosts, 'hostid');
|
||||||
if (appFilter) {
|
if (appFilter) {
|
||||||
return _this3.cachingProxy.getApps(hostids).then(function (apps) {
|
return _this3.zabbixAPI.getApps(hostids).then(function (apps) {
|
||||||
return filterByQuery(apps, appFilter);
|
return filterByQuery(apps, appFilter);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -303,10 +372,10 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect
|
|||||||
|
|
||||||
return this.getApps(groupFilter, hostFilter, appFilter).then(function (apps) {
|
return this.getApps(groupFilter, hostFilter, appFilter).then(function (apps) {
|
||||||
if (apps.appFilterEmpty) {
|
if (apps.appFilterEmpty) {
|
||||||
return _this4.cachingProxy.getItems(apps.hostids, undefined, options.itemtype);
|
return _this4.zabbixAPI.getItems(apps.hostids, undefined, options.itemtype);
|
||||||
} else {
|
} else {
|
||||||
var appids = _.map(apps, 'applicationid');
|
var appids = _.map(apps, 'applicationid');
|
||||||
return _this4.cachingProxy.getItems(undefined, appids, options.itemtype);
|
return _this4.zabbixAPI.getItems(undefined, appids, options.itemtype);
|
||||||
}
|
}
|
||||||
}).then(function (items) {
|
}).then(function (items) {
|
||||||
if (!options.showDisabledItems) {
|
if (!options.showDisabledItems) {
|
||||||
@@ -341,7 +410,7 @@ System.register(['lodash', '../utils', './connectors/zabbix_api/zabbixAPIConnect
|
|||||||
}, {
|
}, {
|
||||||
key: 'getITServices',
|
key: 'getITServices',
|
||||||
value: function getITServices(itServiceFilter) {
|
value: function getITServices(itServiceFilter) {
|
||||||
return this.cachingProxy.getITServices().then(function (itServices) {
|
return this.zabbixAPI.getITService().then(function (itServices) {
|
||||||
return findByFilter(itServices, itServiceFilter);
|
return findByFilter(itServices, itServiceFilter);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
2
dist/datasource-zabbix/zabbix/zabbix.js.map
vendored
2
dist/datasource-zabbix/zabbix/zabbix.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/vendor/npm/tether.min.js
vendored
2
dist/vendor/npm/tether.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -54,6 +54,7 @@ class ZabbixAPIDatasource {
|
|||||||
this.sqlDatasourceId = dbConnectionOptions.datasourceId;
|
this.sqlDatasourceId = dbConnectionOptions.datasourceId;
|
||||||
|
|
||||||
let zabbixOptions = {
|
let zabbixOptions = {
|
||||||
|
url: this.url,
|
||||||
username: this.username,
|
username: this.username,
|
||||||
password: this.password,
|
password: this.password,
|
||||||
basicAuth: this.basicAuth,
|
basicAuth: this.basicAuth,
|
||||||
@@ -63,7 +64,7 @@ class ZabbixAPIDatasource {
|
|||||||
sqlDatasourceId: this.sqlDatasourceId
|
sqlDatasourceId: this.sqlDatasourceId
|
||||||
};
|
};
|
||||||
|
|
||||||
this.zabbix = new Zabbix(this.url, zabbixOptions, backendSrv, datasourceSrv);
|
this.zabbix = new Zabbix(zabbixOptions, backendSrv, datasourceSrv);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////
|
////////////////////////
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ function convertGrafanaTSResponse(time_series, items, addHostName) {
|
|||||||
var host = _.find(hosts, {'hostid': item.hostid});
|
var host = _.find(hosts, {'hostid': item.hostid});
|
||||||
alias = host.name + ": " + alias;
|
alias = host.name + ": " + alias;
|
||||||
}
|
}
|
||||||
// zabbixCachingProxy deduplicates requests and returns one time series for equal queries.
|
// CachingProxy deduplicates requests and returns one time series for equal queries.
|
||||||
// Clone is needed to prevent changing of series object shared between all targets.
|
// Clone is needed to prevent changing of series object shared between all targets.
|
||||||
let datapoints = _.cloneDeep(series.points);
|
let datapoints = _.cloneDeep(series.points);
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import * as utils from '../../../utils';
|
import * as utils from '../../../utils';
|
||||||
import { ZabbixAPICoreService } from './zabbixAPICore';
|
import { ZabbixAPICore } from './zabbixAPICore';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Zabbix API Wrapper.
|
* Zabbix API Wrapper.
|
||||||
@@ -25,7 +25,7 @@ export class ZabbixAPIConnector {
|
|||||||
this.loginErrorCount = 0;
|
this.loginErrorCount = 0;
|
||||||
this.maxLoginAttempts = 3;
|
this.maxLoginAttempts = 3;
|
||||||
|
|
||||||
this.zabbixAPICore = new ZabbixAPICoreService(backendSrv);
|
this.zabbixAPICore = new ZabbixAPICore(backendSrv);
|
||||||
|
|
||||||
this.getTrend = this.getTrend_ZBXNEXT1193;
|
this.getTrend = this.getTrend_ZBXNEXT1193;
|
||||||
//getTrend = getTrend_30;
|
//getTrend = getTrend_30;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
* General Zabbix API methods
|
* General Zabbix API methods
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export class ZabbixAPICoreService {
|
export class ZabbixAPICore {
|
||||||
|
|
||||||
/** @ngInject */
|
/** @ngInject */
|
||||||
constructor(backendSrv) {
|
constructor(backendSrv) {
|
||||||
|
|||||||
108
src/datasource-zabbix/zabbix/proxy/cachingProxy.js
Normal file
108
src/datasource-zabbix/zabbix/proxy/cachingProxy.js
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
/**
|
||||||
|
* This module allows to deduplicate function calls with the same params and
|
||||||
|
* cache result of function call.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class CachingProxy {
|
||||||
|
|
||||||
|
constructor(cacheOptions) {
|
||||||
|
this.cacheEnabled = cacheOptions.enabled;
|
||||||
|
this.ttl = cacheOptions.ttl || 600000; // 10 minutes by default
|
||||||
|
|
||||||
|
// Internal objects for data storing
|
||||||
|
this.cache = {};
|
||||||
|
this.promises = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that result is present in the cache and is up to date or send request otherwise.
|
||||||
|
*/
|
||||||
|
cacheRequest(func, funcName, funcScope) {
|
||||||
|
return cacheRequest(func, funcName, funcScope, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap request to prevent multiple calls with same params when request is waiting for response.
|
||||||
|
*/
|
||||||
|
proxyfy(func, funcName, funcScope) {
|
||||||
|
if (!this.promises[funcName]) {
|
||||||
|
this.promises[funcName] = {};
|
||||||
|
}
|
||||||
|
const promiseKeeper = this.promises[funcName];
|
||||||
|
return callOnce(func, promiseKeeper, funcScope);
|
||||||
|
}
|
||||||
|
|
||||||
|
proxyfyWithCache(func, funcName, funcScope) {
|
||||||
|
let proxyfied = this.proxyfy(func, funcName, funcScope);
|
||||||
|
return this.cacheRequest(proxyfied, funcName, funcScope);
|
||||||
|
}
|
||||||
|
|
||||||
|
_isExpired(cacheObject) {
|
||||||
|
if (cacheObject) {
|
||||||
|
let object_age = Date.now() - cacheObject.timestamp;
|
||||||
|
return !(cacheObject.timestamp && object_age < this.ttl);
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrap request to prevent multiple calls
|
||||||
|
* with same params when waiting for result.
|
||||||
|
*/
|
||||||
|
function callOnce(func, promiseKeeper, funcScope) {
|
||||||
|
return function() {
|
||||||
|
var hash = getRequestHash(arguments);
|
||||||
|
if (!promiseKeeper[hash]) {
|
||||||
|
promiseKeeper[hash] = Promise.resolve(
|
||||||
|
func.apply(funcScope, arguments)
|
||||||
|
.then(result => {
|
||||||
|
promiseKeeper[hash] = null;
|
||||||
|
return result;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return promiseKeeper[hash];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function cacheRequest(func, funcName, funcScope, self) {
|
||||||
|
return function() {
|
||||||
|
if (!self.cache[funcName]) {
|
||||||
|
self.cache[funcName] = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
let cacheObject = self.cache[funcName];
|
||||||
|
let hash = getRequestHash(arguments);
|
||||||
|
if (self.cacheEnabled && !self._isExpired(cacheObject[hash])) {
|
||||||
|
return Promise.resolve(cacheObject[hash].value);
|
||||||
|
} else {
|
||||||
|
return func.apply(funcScope, arguments)
|
||||||
|
.then(result => {
|
||||||
|
cacheObject[hash] = {
|
||||||
|
value: result,
|
||||||
|
timestamp: Date.now()
|
||||||
|
};
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRequestHash(args) {
|
||||||
|
const argsJson = JSON.stringify(args);
|
||||||
|
return argsJson.getHash();
|
||||||
|
}
|
||||||
|
|
||||||
|
String.prototype.getHash = function() {
|
||||||
|
var hash = 0, i, chr, len;
|
||||||
|
if (this.length !== 0) {
|
||||||
|
for (i = 0, len = this.length; i < len; i++) {
|
||||||
|
chr = this.charCodeAt(i);
|
||||||
|
hash = ((hash << 5) - hash) + chr;
|
||||||
|
hash |= 0; // Convert to 32bit integer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hash;
|
||||||
|
};
|
||||||
@@ -1,231 +0,0 @@
|
|||||||
import _ from 'lodash';
|
|
||||||
|
|
||||||
export class ZabbixCachingProxy {
|
|
||||||
constructor(zabbixAPI, zabbixDBConnector, cacheOptions) {
|
|
||||||
this.zabbixAPI = zabbixAPI;
|
|
||||||
this.dbConnector = zabbixDBConnector;
|
|
||||||
this.cacheEnabled = cacheOptions.enabled;
|
|
||||||
this.ttl = cacheOptions.ttl || 600000; // 10 minutes by default
|
|
||||||
|
|
||||||
// Internal objects for data storing
|
|
||||||
this.cache = {
|
|
||||||
groups: {},
|
|
||||||
hosts: {},
|
|
||||||
applications: {},
|
|
||||||
items: {},
|
|
||||||
history: {},
|
|
||||||
trends: {},
|
|
||||||
macros: {},
|
|
||||||
globalMacros: {},
|
|
||||||
itServices: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.historyPromises = {};
|
|
||||||
|
|
||||||
// Don't run duplicated history requests
|
|
||||||
this.getHistory = callAPIRequestOnce(_.bind(this.zabbixAPI.getHistory, this.zabbixAPI),
|
|
||||||
this.historyPromises, getHistoryRequestHash);
|
|
||||||
|
|
||||||
if (this.dbConnector) {
|
|
||||||
this.getHistoryDB = callAPIRequestOnce(_.bind(this.dbConnector.getHistory, this.dbConnector),
|
|
||||||
this.historyPromises, getDBQueryHash);
|
|
||||||
this.getTrendsDB = callAPIRequestOnce(_.bind(this.dbConnector.getTrends, this.dbConnector),
|
|
||||||
this.historyPromises, getDBQueryHash);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't run duplicated requests
|
|
||||||
this.groupPromises = {};
|
|
||||||
this.getGroupsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getGroups, this.zabbixAPI),
|
|
||||||
this.groupPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.hostPromises = {};
|
|
||||||
this.getHostsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getHosts, this.zabbixAPI),
|
|
||||||
this.hostPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.appPromises = {};
|
|
||||||
this.getAppsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getApps, this.zabbixAPI),
|
|
||||||
this.appPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.itemPromises = {};
|
|
||||||
this.getItemsOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getItems, this.zabbixAPI),
|
|
||||||
this.itemPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.itemByIdPromises = {};
|
|
||||||
this.getItemsByIdOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getItemsByIDs, this.zabbixAPI),
|
|
||||||
this.itemPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.itServicesPromises = {};
|
|
||||||
this.getITServicesOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getITService, this.zabbixAPI),
|
|
||||||
this.itServicesPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.macroPromises = {};
|
|
||||||
this.getMacrosOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getMacros, this.zabbixAPI),
|
|
||||||
this.macroPromises, getRequestHash);
|
|
||||||
|
|
||||||
this.globalMacroPromises = {};
|
|
||||||
this.getGlobalMacrosOnce = callAPIRequestOnce(_.bind(this.zabbixAPI.getGlobalMacros, this.zabbixAPI),
|
|
||||||
this.globalMacroPromises, getRequestHash);
|
|
||||||
}
|
|
||||||
|
|
||||||
isExpired(cacheObject) {
|
|
||||||
if (cacheObject) {
|
|
||||||
let object_age = Date.now() - cacheObject.timestamp;
|
|
||||||
return !(cacheObject.timestamp && object_age < this.ttl);
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check that result is present in cache and up to date
|
|
||||||
* or send request to API.
|
|
||||||
*/
|
|
||||||
proxyRequest(request, params, cacheObject) {
|
|
||||||
let hash = getRequestHash(params);
|
|
||||||
if (this.cacheEnabled && !this.isExpired(cacheObject[hash])) {
|
|
||||||
return Promise.resolve(cacheObject[hash].value);
|
|
||||||
} else {
|
|
||||||
return request(...params)
|
|
||||||
.then(result => {
|
|
||||||
cacheObject[hash] = {
|
|
||||||
value: result,
|
|
||||||
timestamp: Date.now()
|
|
||||||
};
|
|
||||||
return result;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getGroups() {
|
|
||||||
return this.proxyRequest(this.getGroupsOnce, [], this.cache.groups);
|
|
||||||
}
|
|
||||||
|
|
||||||
getHosts(groupids) {
|
|
||||||
return this.proxyRequest(this.getHostsOnce, [groupids], this.cache.hosts);
|
|
||||||
}
|
|
||||||
|
|
||||||
getApps(hostids) {
|
|
||||||
return this.proxyRequest(this.getAppsOnce, [hostids], this.cache.applications);
|
|
||||||
}
|
|
||||||
|
|
||||||
getItems(hostids, appids, itemtype) {
|
|
||||||
let params = [hostids, appids, itemtype];
|
|
||||||
return this.proxyRequest(this.getItemsOnce, params, this.cache.items);
|
|
||||||
}
|
|
||||||
|
|
||||||
getItemsByIDs(itemids) {
|
|
||||||
let params = [itemids];
|
|
||||||
return this.proxyRequest(this.getItemsByIdOnce, params, this.cache.items);
|
|
||||||
}
|
|
||||||
|
|
||||||
getITServices() {
|
|
||||||
return this.proxyRequest(this.getITServicesOnce, [], this.cache.itServices);
|
|
||||||
}
|
|
||||||
|
|
||||||
getMacros(hostids) {
|
|
||||||
// Merge global macros and host macros
|
|
||||||
let promises = [
|
|
||||||
this.proxyRequest(this.getMacrosOnce, [hostids], this.cache.macros),
|
|
||||||
this.proxyRequest(this.getGlobalMacrosOnce, [], this.cache.globalMacros)
|
|
||||||
];
|
|
||||||
|
|
||||||
return Promise.all(promises).then(_.flatten);
|
|
||||||
}
|
|
||||||
|
|
||||||
getHistoryFromCache(items, time_from, time_till) {
|
|
||||||
var historyStorage = this.cache.history;
|
|
||||||
var full_history;
|
|
||||||
var expired = _.filter(_.keyBy(items, 'itemid'), (item, itemid) => {
|
|
||||||
return !historyStorage[itemid];
|
|
||||||
});
|
|
||||||
if (expired.length) {
|
|
||||||
return this.zabbixAPI.getHistory(expired, time_from, time_till).then(function(history) {
|
|
||||||
var grouped_history = _.groupBy(history, 'itemid');
|
|
||||||
_.forEach(expired, item => {
|
|
||||||
var itemid = item.itemid;
|
|
||||||
historyStorage[itemid] = item;
|
|
||||||
historyStorage[itemid].time_from = time_from;
|
|
||||||
historyStorage[itemid].time_till = time_till;
|
|
||||||
historyStorage[itemid].history = grouped_history[itemid];
|
|
||||||
});
|
|
||||||
full_history = _.map(items, item => {
|
|
||||||
return historyStorage[item.itemid].history;
|
|
||||||
});
|
|
||||||
return _.flatten(full_history, true);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
full_history = _.map(items, function(item) {
|
|
||||||
return historyStorage[item.itemid].history;
|
|
||||||
});
|
|
||||||
return Promise.resolve(_.flatten(full_history, true));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getHistoryFromAPI(items, time_from, time_till) {
|
|
||||||
return this.zabbixAPI.getHistory(items, time_from, time_till);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrap zabbix API request to prevent multiple calls
|
|
||||||
* with same params when waiting for result.
|
|
||||||
*/
|
|
||||||
function callAPIRequestOnce(func, promiseKeeper, argsHashFunc) {
|
|
||||||
return function() {
|
|
||||||
var hash = argsHashFunc(arguments);
|
|
||||||
if (!promiseKeeper[hash]) {
|
|
||||||
promiseKeeper[hash] = Promise.resolve(
|
|
||||||
func.apply(this, arguments)
|
|
||||||
.then(result => {
|
|
||||||
promiseKeeper[hash] = null;
|
|
||||||
return result;
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return promiseKeeper[hash];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRequestHash(args) {
|
|
||||||
var requestStamp = _.map(args, arg => {
|
|
||||||
if (arg === undefined) {
|
|
||||||
return 'undefined';
|
|
||||||
} else {
|
|
||||||
if (_.isArray(arg)) {
|
|
||||||
return arg.sort().toString();
|
|
||||||
} else {
|
|
||||||
return arg.toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}).join();
|
|
||||||
return requestStamp.getHash();
|
|
||||||
}
|
|
||||||
|
|
||||||
function getHistoryRequestHash(args) {
|
|
||||||
let itemids = _.map(args[0], 'itemid');
|
|
||||||
let stamp = itemids.join() + args[1] + args[2];
|
|
||||||
return stamp.getHash();
|
|
||||||
}
|
|
||||||
|
|
||||||
function getDBQueryHash(args) {
|
|
||||||
let itemids = _.map(args[0], 'itemid');
|
|
||||||
let consolidateBy = args[3].consolidateBy;
|
|
||||||
let intervalMs = args[3].intervalMs;
|
|
||||||
let stamp = itemids.join() + args[1] + args[2] + consolidateBy + intervalMs;
|
|
||||||
return stamp.getHash();
|
|
||||||
}
|
|
||||||
|
|
||||||
String.prototype.getHash = function() {
|
|
||||||
var hash = 0, i, chr, len;
|
|
||||||
if (this.length !== 0) {
|
|
||||||
for (i = 0, len = this.length; i < len; i++) {
|
|
||||||
chr = this.charCodeAt(i);
|
|
||||||
hash = ((hash << 5) - hash) + chr;
|
|
||||||
hash |= 0; // Convert to 32bit integer
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return hash;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Fix for backward compatibility with lodash 2.4
|
|
||||||
if (!_.keyBy) {_.keyBy = _.indexBy;}
|
|
||||||
@@ -1,52 +1,74 @@
|
|||||||
// import angular from 'angular';
|
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import * as utils from '../utils';
|
import * as utils from '../utils';
|
||||||
import { ZabbixAPIConnector } from './connectors/zabbix_api/zabbixAPIConnector';
|
import { ZabbixAPIConnector } from './connectors/zabbix_api/zabbixAPIConnector';
|
||||||
import { ZabbixDBConnector } from './connectors/sql/zabbixDBConnector';
|
import { ZabbixDBConnector } from './connectors/sql/zabbixDBConnector';
|
||||||
import { ZabbixCachingProxy } from './proxy/zabbixCachingProxy';
|
import { CachingProxy } from './proxy/cachingProxy';
|
||||||
|
|
||||||
|
const REQUESTS_TO_PROXYFY = [
|
||||||
|
'getHistory', 'getTrend', 'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs',
|
||||||
|
'getEvents', 'getAlerts', 'getHostAlerts', 'getAcknowledges', 'getITService', 'getSLA', 'getVersion'
|
||||||
|
];
|
||||||
|
|
||||||
|
const REQUESTS_TO_CACHE = [
|
||||||
|
'getGroups', 'getHosts', 'getApps', 'getItems', 'getMacros', 'getItemsByIDs', 'getITService'
|
||||||
|
];
|
||||||
|
|
||||||
|
const REQUESTS_TO_BIND = [
|
||||||
|
'getHistory', 'getTrend', 'getMacros', 'getItemsByIDs', 'getEvents', 'getAlerts', 'getHostAlerts',
|
||||||
|
'getAcknowledges', 'getITService', 'getSLA', 'getVersion', 'login'
|
||||||
|
];
|
||||||
|
|
||||||
export class Zabbix {
|
export class Zabbix {
|
||||||
|
|
||||||
/** @ngInject */
|
/** @ngInject */
|
||||||
constructor(url, options, backendSrv, datasourceSrv) {
|
constructor(options, backendSrv, datasourceSrv) {
|
||||||
let {
|
let {
|
||||||
username, password, basicAuth, withCredentials, cacheTTL,
|
url,
|
||||||
enableDirectDBConnection, sqlDatasourceId
|
username,
|
||||||
|
password,
|
||||||
|
basicAuth,
|
||||||
|
withCredentials,
|
||||||
|
cacheTTL,
|
||||||
|
enableDirectDBConnection,
|
||||||
|
sqlDatasourceId
|
||||||
} = options;
|
} = options;
|
||||||
|
|
||||||
// Initialize Zabbix API
|
|
||||||
this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv);
|
|
||||||
|
|
||||||
if (enableDirectDBConnection) {
|
|
||||||
this.dbConnector = new ZabbixDBConnector(sqlDatasourceId, {}, backendSrv, datasourceSrv);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize caching proxy for requests
|
// Initialize caching proxy for requests
|
||||||
let cacheOptions = {
|
let cacheOptions = {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
ttl: cacheTTL
|
ttl: cacheTTL
|
||||||
};
|
};
|
||||||
this.cachingProxy = new ZabbixCachingProxy(this.zabbixAPI, this.dbConnector, cacheOptions);
|
this.cachingProxy = new CachingProxy(cacheOptions);
|
||||||
|
|
||||||
// Proxy methods
|
this.zabbixAPI = new ZabbixAPIConnector(url, username, password, basicAuth, withCredentials, backendSrv);
|
||||||
this.getHistory = this.cachingProxy.getHistory.bind(this.cachingProxy);
|
|
||||||
this.getMacros = this.cachingProxy.getMacros.bind(this.cachingProxy);
|
|
||||||
this.getItemsByIDs = this.cachingProxy.getItemsByIDs.bind(this.cachingProxy);
|
|
||||||
|
|
||||||
if (enableDirectDBConnection) {
|
if (enableDirectDBConnection) {
|
||||||
this.getHistoryDB = this.cachingProxy.getHistoryDB.bind(this.cachingProxy);
|
this.dbConnector = new ZabbixDBConnector(sqlDatasourceId, {}, backendSrv, datasourceSrv);
|
||||||
this.getTrendsDB = this.cachingProxy.getTrendsDB.bind(this.cachingProxy);
|
this.getHistoryDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getHistory, 'getHistory', this.dbConnector);
|
||||||
|
this.getTrendsDB = this.cachingProxy.proxyfyWithCache(this.dbConnector.getTrends, 'getTrends', this.dbConnector);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getTrend = this.zabbixAPI.getTrend.bind(this.zabbixAPI);
|
this.proxyfyRequests();
|
||||||
this.getEvents = this.zabbixAPI.getEvents.bind(this.zabbixAPI);
|
this.cacheRequests();
|
||||||
this.getAlerts = this.zabbixAPI.getAlerts.bind(this.zabbixAPI);
|
this.bindRequests();
|
||||||
this.getHostAlerts = this.zabbixAPI.getHostAlerts.bind(this.zabbixAPI);
|
}
|
||||||
this.getAcknowledges = this.zabbixAPI.getAcknowledges.bind(this.zabbixAPI);
|
|
||||||
this.getITService = this.zabbixAPI.getITService.bind(this.zabbixAPI);
|
proxyfyRequests() {
|
||||||
this.getSLA = this.zabbixAPI.getSLA.bind(this.zabbixAPI);
|
for (let request of REQUESTS_TO_PROXYFY) {
|
||||||
this.getVersion = this.zabbixAPI.getVersion.bind(this.zabbixAPI);
|
this.zabbixAPI[request] = this.cachingProxy.proxyfy(this.zabbixAPI[request], request, this.zabbixAPI);
|
||||||
this.login = this.zabbixAPI.login.bind(this.zabbixAPI);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cacheRequests() {
|
||||||
|
for (let request of REQUESTS_TO_CACHE) {
|
||||||
|
this.zabbixAPI[request] = this.cachingProxy.cacheRequest(this.zabbixAPI[request], request, this.zabbixAPI);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bindRequests() {
|
||||||
|
for (let request of REQUESTS_TO_BIND) {
|
||||||
|
this[request] = this.zabbixAPI[request].bind(this.zabbixAPI);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getItemsFromTarget(target, options) {
|
getItemsFromTarget(target, options) {
|
||||||
@@ -71,7 +93,7 @@ export class Zabbix {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getAllGroups() {
|
getAllGroups() {
|
||||||
return this.cachingProxy.getGroups();
|
return this.zabbixAPI.getGroups();
|
||||||
}
|
}
|
||||||
|
|
||||||
getGroups(groupFilter) {
|
getGroups(groupFilter) {
|
||||||
@@ -86,7 +108,7 @@ export class Zabbix {
|
|||||||
return this.getGroups(groupFilter)
|
return this.getGroups(groupFilter)
|
||||||
.then(groups => {
|
.then(groups => {
|
||||||
let groupids = _.map(groups, 'groupid');
|
let groupids = _.map(groups, 'groupid');
|
||||||
return this.cachingProxy.getHosts(groupids);
|
return this.zabbixAPI.getHosts(groupids);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,7 +124,7 @@ export class Zabbix {
|
|||||||
return this.getHosts(groupFilter, hostFilter)
|
return this.getHosts(groupFilter, hostFilter)
|
||||||
.then(hosts => {
|
.then(hosts => {
|
||||||
let hostids = _.map(hosts, 'hostid');
|
let hostids = _.map(hosts, 'hostid');
|
||||||
return this.cachingProxy.getApps(hostids);
|
return this.zabbixAPI.getApps(hostids);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +133,7 @@ export class Zabbix {
|
|||||||
.then(hosts => {
|
.then(hosts => {
|
||||||
let hostids = _.map(hosts, 'hostid');
|
let hostids = _.map(hosts, 'hostid');
|
||||||
if (appFilter) {
|
if (appFilter) {
|
||||||
return this.cachingProxy.getApps(hostids)
|
return this.zabbixAPI.getApps(hostids)
|
||||||
.then(apps => filterByQuery(apps, appFilter));
|
.then(apps => filterByQuery(apps, appFilter));
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
@@ -126,10 +148,10 @@ export class Zabbix {
|
|||||||
return this.getApps(groupFilter, hostFilter, appFilter)
|
return this.getApps(groupFilter, hostFilter, appFilter)
|
||||||
.then(apps => {
|
.then(apps => {
|
||||||
if (apps.appFilterEmpty) {
|
if (apps.appFilterEmpty) {
|
||||||
return this.cachingProxy.getItems(apps.hostids, undefined, options.itemtype);
|
return this.zabbixAPI.getItems(apps.hostids, undefined, options.itemtype);
|
||||||
} else {
|
} else {
|
||||||
let appids = _.map(apps, 'applicationid');
|
let appids = _.map(apps, 'applicationid');
|
||||||
return this.cachingProxy.getItems(undefined, appids, options.itemtype);
|
return this.zabbixAPI.getItems(undefined, appids, options.itemtype);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.then(items => {
|
.then(items => {
|
||||||
@@ -161,7 +183,7 @@ export class Zabbix {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getITServices(itServiceFilter) {
|
getITServices(itServiceFilter) {
|
||||||
return this.cachingProxy.getITServices()
|
return this.zabbixAPI.getITService()
|
||||||
.then(itServices => findByFilter(itServices, itServiceFilter));
|
.then(itServices => findByFilter(itServices, itServiceFilter));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,10 +221,6 @@ export class Zabbix {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// angular
|
|
||||||
// .module('grafana.services')
|
|
||||||
// .factory('Zabbix', ZabbixFactory);
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user