diff --git a/src/datasource-zabbix/zabbixAPI.service.js b/src/datasource-zabbix/zabbixAPI.service.js index b8f9edb..e81f2aa 100644 --- a/src/datasource-zabbix/zabbixAPI.service.js +++ b/src/datasource-zabbix/zabbixAPI.service.js @@ -4,7 +4,7 @@ import * as utils from './utils'; import './zabbixAPICore.service'; /** @ngInject */ -function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { +function ZabbixAPIServiceFactory($q, alertSrv, zabbixAPICoreService) { /** * Zabbix API Wrapper. @@ -25,6 +25,8 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { }; this.loginPromise = null; + this.loginErrorCount = 0; + this.maxLoginAttempts = 3; this.$q = $q; this.alertSrv = alertSrv; @@ -39,27 +41,24 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { ////////////////////////// request(method, params) { - var self = this; - - return this.zabbixAPICore - .request(this.url, method, params, this.requestOptions, this.auth) - .then((result) => { - return result; - }, (error) => { - // Handle API errors - if (isNotAuthorized(error.data)) { - return self.loginOnce().then( - function() { - return self.request(method, params); - }, - // Handle user.login method errors - function(error) { - self.alertAPIError(error.data); - }); + return this.zabbixAPICore.request(this.url, method, params, this.requestOptions, this.auth) + .catch(error => { + if (isNotAuthorized(error.data)) { + // Handle auth errors + this.loginErrorCount++; + if (this.loginErrorCount > this.maxLoginAttempts) { + this.loginErrorCount = 0; + return null; } else { - this.alertSrv.set("Connection Error", error.data, 'error', 5000); + return this.loginOnce() + .then(() => this.request(method, params)); } - }); + } else { + // Handle API errors + let message = error.data ? error.data : error.statusText; + this.alertAPIError(message); + } + }); } alertAPIError(message, timeout = 5000) { @@ -78,25 +77,16 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { * @return login promise */ loginOnce() { - var self = this; - var deferred = this.$q.defer(); - if (!self.loginPromise) { - self.loginPromise = deferred.promise; - self.login().then( - function(auth) { - self.loginPromise = null; - self.auth = auth; - deferred.resolve(auth); - }, - function(error) { - self.loginPromise = null; - deferred.reject(error); - } + if (!this.loginPromise) { + this.loginPromise = Promise.resolve( + this.login().then(auth => { + this.auth = auth; + this.loginPromise = null; + return auth; + }) ); - } else { - return self.loginPromise; } - return deferred.promise; + return this.loginPromise; } /** @@ -197,13 +187,16 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { } return this.request('item.get', params) - .then(items => { - return _.forEach(items, item => { - item.item = item.name; - item.name = utils.expandItemName(item.item, item.key_); - return item; - }); + .then(expandItems); + + function expandItems(items) { + items.forEach(item => { + item.item = item.name; + item.name = utils.expandItemName(item.item, item.key_); + return item; }); + return items; + } } getLastValue(itemid) { @@ -211,48 +204,42 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { output: ['lastvalue'], itemids: itemid }; - return this.request('item.get', params).then(function(items) { - if (items.length) { - return items[0].lastvalue; - } else { - return null; - } - }); + return this.request('item.get', params) + .then(items => items.length ? items[0].lastvalue : null); } /** * Perform history query from Zabbix API * * @param {Array} items Array of Zabbix item objects - * @param {Number} time_from Time in seconds - * @param {Number} time_till Time in seconds + * @param {Number} timeFrom Time in seconds + * @param {Number} timeTill Time in seconds * @return {Array} Array of Zabbix history objects */ - getHistory(items, time_from, time_till) { - var self = this; + getHistory(items, timeFrom, timeTill) { - // Group items by value type - var grouped_items = _.groupBy(items, 'value_type'); - - // Perform request for each value type - return this.$q.all(_.map(grouped_items, function (items, value_type) { - var itemids = _.map(items, 'itemid'); - var params = { + // Group items by value type and perform request for each value type + let grouped_items = _.groupBy(items, 'value_type'); + let promises = _.map(grouped_items, (items, value_type) => { + let itemids = _.map(items, 'itemid'); + let params = { output: 'extend', history: value_type, itemids: itemids, sortfield: 'clock', sortorder: 'ASC', - time_from: time_from + time_from: timeFrom }; // Relative queries (e.g. last hour) don't include an end time - if (time_till) { - params.time_till = time_till; + if (timeTill) { + params.time_till = timeTill; } - return self.request('history.get', params); - })).then(_.flatten); + return this.request('history.get', params); + }); + + return Promise.all(promises).then(_.flatten); } /** @@ -264,31 +251,30 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { * @param {Number} time_till Time in seconds * @return {Array} Array of Zabbix trend objects */ - getTrend_ZBXNEXT1193(items, time_from, time_till) { - var self = this; + getTrend_ZBXNEXT1193(items, timeFrom, timeTill) { - // Group items by value type - var grouped_items = _.groupBy(items, 'value_type'); - - // Perform request for each value type - return this.$q.all(_.map(grouped_items, function (items, value_type) { - var itemids = _.map(items, 'itemid'); - var params = { + // Group items by value type and perform request for each value type + let grouped_items = _.groupBy(items, 'value_type'); + let promises = _.map(grouped_items, (items, value_type) => { + let itemids = _.map(items, 'itemid'); + let params = { output: 'extend', trend: value_type, itemids: itemids, sortfield: 'clock', sortorder: 'ASC', - time_from: time_from + time_from: timeFrom }; // Relative queries (e.g. last hour) don't include an end time - if (time_till) { - params.time_till = time_till; + if (timeTill) { + params.time_till = timeTill; } - return self.request('trend.get', params); - })).then(_.flatten); + return this.request('trend.get', params); + }); + + return Promise.all(promises).then(_.flatten); } getTrend_30(items, time_from, time_till, value_type) { @@ -312,7 +298,7 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { return self.request('trend.get', params); } - getITService(/* optional */ serviceids) { + getITService(serviceids) { var params = { output: 'extend', serviceids: serviceids @@ -320,12 +306,12 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { return this.request('service.get', params); } - getSLA(serviceids, from, to) { + getSLA(serviceids, timeFrom, timeTo) { var params = { serviceids: serviceids, intervals: [{ - from: from, - to: to + from: timeFrom, + to: timeTo }] }; return this.request('service.getsla', params); @@ -364,11 +350,11 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { return this.request('trigger.get', params); } - getEvents(objectids, from, to, showEvents) { + getEvents(objectids, timeFrom, timeTo, showEvents) { var params = { output: 'extend', - time_from: from, - time_till: to, + time_from: timeFrom, + time_till: timeTo, objectids: objectids, select_acknowledges: 'extend', selectHosts: 'extend', @@ -389,11 +375,9 @@ function ZabbixAPIService($q, alertSrv, zabbixAPICoreService) { }; return this.request('event.get', params) - .then(function (events) { - return _.filter(events, function(event) { - return event.acknowledges.length; - }); - }); + .then(events => { + return _.filter(events, (event) => event.acknowledges.length); + }); } } @@ -411,4 +395,4 @@ function isNotAuthorized(message) { angular .module('grafana.services') - .factory('zabbixAPIService', ZabbixAPIService); + .factory('zabbixAPIService', ZabbixAPIServiceFactory);