Refactor: move zabbix api response handle to separate module.

This commit is contained in:
Alexander Zobnin
2016-11-12 21:26:34 +03:00
parent 2e57b9b166
commit 88ddcd0c42
3 changed files with 114 additions and 106 deletions

View File

@@ -5,6 +5,7 @@ import * as utils from './utils';
import * as migrations from './migrations'; import * as migrations from './migrations';
import * as metricFunctions from './metricFunctions'; import * as metricFunctions from './metricFunctions';
import DataProcessor from './DataProcessor'; import DataProcessor from './DataProcessor';
import responseHandler from './responseHandler';
import './zabbixAPI.service.js'; import './zabbixAPI.service.js';
import './zabbixCache.service.js'; import './zabbixCache.service.js';
import './queryProcessor.service.js'; import './queryProcessor.service.js';
@@ -122,8 +123,7 @@ class ZabbixAPIDatasource {
return this.zabbixAPI return this.zabbixAPI
.getSLA(target.itservice.serviceid, timeFrom, timeTo) .getSLA(target.itservice.serviceid, timeFrom, timeTo)
.then(slaObject => { .then(slaObject => {
return this.queryProcessor return responseHandler.handleSLAResponse(target.itservice, target.slaProperty, slaObject);
.handleSLAResponse(target.itservice, target.slaProperty, slaObject);
}); });
} }
}); });
@@ -168,7 +168,7 @@ class ZabbixAPIDatasource {
getHistory = this.zabbixAPI getHistory = this.zabbixAPI
.getTrend(items, timeFrom, timeTo) .getTrend(items, timeFrom, timeTo)
.then(history => { .then(history => {
return this.queryProcessor.handleTrends(history, items, addHostName, valueType); return responseHandler.handleTrends(history, items, addHostName, valueType);
}); });
} }
@@ -177,7 +177,7 @@ class ZabbixAPIDatasource {
getHistory = this.zabbixCache getHistory = this.zabbixCache
.getHistory(items, timeFrom, timeTo) .getHistory(items, timeFrom, timeTo)
.then(history => { .then(history => {
return this.queryProcessor.handleHistory(history, items, addHostName); return responseHandler.handleHistory(history, items, addHostName);
}); });
} }
@@ -233,7 +233,7 @@ class ZabbixAPIDatasource {
if (items.length) { if (items.length) {
return this.zabbixAPI.getHistory(items, timeFrom, timeTo) return this.zabbixAPI.getHistory(items, timeFrom, timeTo)
.then(history => { .then(history => {
return this.queryProcessor.convertHistory(history, items, false, (point) => { return responseHandler.convertHistory(history, items, false, (point) => {
let value = point.value; let value = point.value;
// Regex-based extractor // Regex-based extractor

View File

@@ -147,74 +147,6 @@ function QueryProcessorFactory() {
return query; return query;
}); });
} }
/**
* Convert Zabbix API history.get response to Grafana format
*
* @return {Array} Array of timeseries in Grafana format
* {
* target: "Metric name",
* datapoints: [[<value>, <unixtime>], ...]
* }
*/
convertHistory(history, items, addHostName, convertPointCallback) {
/**
* Response should be in the format:
* data: [
* {
* target: "Metric name",
* datapoints: [[<value>, <unixtime>], ...]
* }, ...
* ]
*/
// Group history by itemid
var grouped_history = _.groupBy(history, 'itemid');
var hosts = _.uniq(_.flatten(_.map(items, 'hosts')),'hostid'); //uniq is needed to deduplicate
return _.map(grouped_history, function(hist, itemid) {
var item = _.find(items, {'itemid': itemid});
var alias = item.name;
if (_.keys(hosts).length > 1 && addHostName) { //only when actual multi hosts selected
var host = _.find(hosts, {'hostid': item.hostid});
alias = host.name + ": " + alias;
}
return {
target: alias,
datapoints: _.map(hist, convertPointCallback)
};
});
}
handleHistory(history, items, addHostName) {
return this.convertHistory(history, items, addHostName, convertHistoryPoint);
}
handleTrends(history, items, addHostName, valueType) {
var convertPointCallback = _.partial(convertTrendPoint, valueType);
return this.convertHistory(history, items, addHostName, convertPointCallback);
}
handleSLAResponse(itservice, slaProperty, slaObject) {
var targetSLA = slaObject[itservice.serviceid].sla[0];
if (slaProperty.property === 'status') {
var targetStatus = parseInt(slaObject[itservice.serviceid].status);
return {
target: itservice.name + ' ' + slaProperty.name,
datapoints: [
[targetStatus, targetSLA.to * 1000]
]
};
} else {
return {
target: itservice.name + ' ' + slaProperty.name,
datapoints: [
[targetSLA[slaProperty.property], targetSLA.from * 1000],
[targetSLA[slaProperty.property], targetSLA.to * 1000]
]
};
}
}
} }
return QueryProcessor; return QueryProcessor;
@@ -278,33 +210,3 @@ function filterByQuery(list, filter) {
return filterByName(list, filter); return filterByName(list, filter);
} }
} }
function convertHistoryPoint(point) {
// Value must be a number for properly work
return [
Number(point.value),
point.clock * 1000
];
}
function convertTrendPoint(valueType, point) {
var value;
switch (valueType) {
case "min":
value = point.value_min;
break;
case "max":
value = point.value_max;
break;
case "avg":
value = point.value_avg;
break;
default:
value = point.value_avg;
}
return [
Number(value),
point.clock * 1000
];
}

View File

@@ -0,0 +1,106 @@
import _ from 'lodash';
/**
* Convert Zabbix API history.get response to Grafana format
*
* @return {Array} Array of timeseries in Grafana format
* {
* target: "Metric name",
* datapoints: [[<value>, <unixtime>], ...]
* }
*/
function convertHistory(history, items, addHostName, convertPointCallback) {
/**
* Response should be in the format:
* data: [
* {
* target: "Metric name",
* datapoints: [[<value>, <unixtime>], ...]
* }, ...
* ]
*/
// Group history by itemid
var grouped_history = _.groupBy(history, 'itemid');
var hosts = _.uniq(_.flatten(_.map(items, 'hosts')),'hostid'); //uniq is needed to deduplicate
return _.map(grouped_history, function(hist, itemid) {
var item = _.find(items, {'itemid': itemid});
var alias = item.name;
if (_.keys(hosts).length > 1 && addHostName) { //only when actual multi hosts selected
var host = _.find(hosts, {'hostid': item.hostid});
alias = host.name + ": " + alias;
}
return {
target: alias,
datapoints: _.map(hist, convertPointCallback)
};
});
}
function handleHistory(history, items, addHostName) {
return convertHistory(history, items, addHostName, convertHistoryPoint);
}
function handleTrends(history, items, addHostName, valueType) {
var convertPointCallback = _.partial(convertTrendPoint, valueType);
return convertHistory(history, items, addHostName, convertPointCallback);
}
function handleSLAResponse(itservice, slaProperty, slaObject) {
var targetSLA = slaObject[itservice.serviceid].sla[0];
if (slaProperty.property === 'status') {
var targetStatus = parseInt(slaObject[itservice.serviceid].status);
return {
target: itservice.name + ' ' + slaProperty.name,
datapoints: [
[targetStatus, targetSLA.to * 1000]
]
};
} else {
return {
target: itservice.name + ' ' + slaProperty.name,
datapoints: [
[targetSLA[slaProperty.property], targetSLA.from * 1000],
[targetSLA[slaProperty.property], targetSLA.to * 1000]
]
};
}
}
function convertHistoryPoint(point) {
// Value must be a number for properly work
return [
Number(point.value),
point.clock * 1000
];
}
function convertTrendPoint(valueType, point) {
var value;
switch (valueType) {
case "min":
value = point.value_min;
break;
case "max":
value = point.value_max;
break;
case "avg":
value = point.value_avg;
break;
default:
value = point.value_avg;
}
return [
Number(value),
point.clock * 1000
];
}
export default {
handleHistory: handleHistory,
convertHistory: convertHistory,
handleTrends: handleTrends,
handleSLAResponse: handleSLAResponse
};