Refactor: zabbixAPI.service
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user