Refactor: zabbixAPI.service

This commit is contained in:
Alexander Zobnin
2016-11-11 21:53:10 +03:00
parent 062d975319
commit 6579c6acbc

View File

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