import _ from 'lodash'; /** * Convert Zabbix API history.get response to Grafana format * * @return {Array} Array of timeseries in Grafana format * { * target: "Metric name", * datapoints: [[, ], ...] * } */ function convertHistory(history, items, addHostName, convertPointCallback) { /** * Response should be in the format: * data: [ * { * target: "Metric name", * datapoints: [[, ], ...] * }, ... * ] */ // Group history by itemid var grouped_history = _.groupBy(history, 'itemid'); var hosts = _.uniqBy(_.flatten(_.map(items, 'hosts')), 'hostid'); //uniqBy 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 = true) { return convertHistory(history, items, addHostName, convertHistoryPoint); } function handleTrends(history, items, valueType, addHostName = true) { 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 + Math.round(point.ns / 1000000) ]; } 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; case "sum": value = point.value_sum; break; case "count": value = point.value_count; break; default: value = point.value_avg; } return [ Number(value), point.clock * 1000 ]; } export default { handleHistory: handleHistory, convertHistory: convertHistory, handleTrends: handleTrends, handleSLAResponse: handleSLAResponse }; // Fix for backward compatibility with lodash 2.4 if (!_.uniqBy) {_.uniqBy = _.uniq;}