resolve #16 - trends support
This commit is contained in:
@@ -25,6 +25,9 @@ function (angular, _, kbn) {
|
|||||||
this.username = datasource.meta.username;
|
this.username = datasource.meta.username;
|
||||||
this.password = datasource.meta.password;
|
this.password = datasource.meta.password;
|
||||||
|
|
||||||
|
// Use trends instead history since specified time
|
||||||
|
this.trendsFrom = datasource.meta.trendsFrom || '7d';
|
||||||
|
|
||||||
// Limit metrics per panel for templated request
|
// Limit metrics per panel for templated request
|
||||||
this.limitmetrics = datasource.meta.limitmetrics || 50;
|
this.limitmetrics = datasource.meta.limitmetrics || 50;
|
||||||
}
|
}
|
||||||
@@ -44,6 +47,7 @@ function (angular, _, kbn) {
|
|||||||
// get from & to in seconds
|
// get from & to in seconds
|
||||||
var from = Math.ceil(kbn.parseDate(options.range.from).getTime() / 1000);
|
var from = Math.ceil(kbn.parseDate(options.range.from).getTime() / 1000);
|
||||||
var to = Math.ceil(kbn.parseDate(options.range.to).getTime() / 1000);
|
var to = Math.ceil(kbn.parseDate(options.range.to).getTime() / 1000);
|
||||||
|
var useTrendsFrom = Math.ceil(kbn.parseDate('now-' + this.trendsFrom).getTime() / 1000);
|
||||||
|
|
||||||
// Create request for each target
|
// Create request for each target
|
||||||
var promises = _.map(options.targets, function(target) {
|
var promises = _.map(options.targets, function(target) {
|
||||||
@@ -93,8 +97,14 @@ function (angular, _, kbn) {
|
|||||||
return [];
|
return [];
|
||||||
} else {
|
} else {
|
||||||
items = _.flatten(items);
|
items = _.flatten(items);
|
||||||
return self.performTimeSeriesQuery(items, from, to)
|
|
||||||
.then(_.partial(self.handleHistoryResponse, items));
|
if (from > useTrendsFrom) {
|
||||||
|
return self.performTimeSeriesQuery(items, from, to)
|
||||||
|
.then(_.partial(self.handleHistoryResponse, items));
|
||||||
|
} else {
|
||||||
|
return self.getTrends(items, from, to)
|
||||||
|
.then(_.partial(self.handleTrendResponse, items));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}, this);
|
}, this);
|
||||||
@@ -142,6 +152,58 @@ function (angular, _, kbn) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ZabbixAPIDatasource.prototype.getTrends = function(items, start, end) {
|
||||||
|
// Group items by value type
|
||||||
|
var grouped_items = _.groupBy(items, 'value_type');
|
||||||
|
|
||||||
|
// Perform request for each value type
|
||||||
|
return $q.all(_.map(grouped_items, function (items, value_type) {
|
||||||
|
var itemids = _.map(items, 'itemid');
|
||||||
|
var params = {
|
||||||
|
output: 'extend',
|
||||||
|
trend: value_type,
|
||||||
|
itemids: itemids,
|
||||||
|
sortfield: 'clock',
|
||||||
|
sortorder: 'ASC',
|
||||||
|
time_from: start
|
||||||
|
};
|
||||||
|
|
||||||
|
// Relative queries (e.g. last hour) don't include an end time
|
||||||
|
if (end) {
|
||||||
|
params.time_till = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.performZabbixAPIRequest('trend.get', params);
|
||||||
|
}, this)).then(function (results) {
|
||||||
|
return _.flatten(results);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ZabbixAPIDatasource.prototype.handleTrendResponse = function(items, trends) {
|
||||||
|
|
||||||
|
// Group items and trends by itemid
|
||||||
|
var indexed_items = _.indexBy(items, 'itemid');
|
||||||
|
var grouped_history = _.groupBy(trends, 'itemid');
|
||||||
|
|
||||||
|
return $q.when(_.map(grouped_history, function (trends, itemid) {
|
||||||
|
var item = indexed_items[itemid];
|
||||||
|
var series = {
|
||||||
|
target: (item.hosts ? item.hosts[0].name+': ' : '') + expandItemName(item),
|
||||||
|
datapoints: _.map(trends, function (p) {
|
||||||
|
|
||||||
|
// Value must be a number for properly work
|
||||||
|
var value = Number(p.value_avg);
|
||||||
|
return [value, p.clock * 1000];
|
||||||
|
})
|
||||||
|
};
|
||||||
|
return series;
|
||||||
|
})).then(function (result) {
|
||||||
|
return _.sortBy(result, 'target');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert Zabbix API data to Grafana format
|
* Convert Zabbix API data to Grafana format
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
"username": "guest",
|
"username": "guest",
|
||||||
"password": "",
|
"password": "",
|
||||||
|
|
||||||
|
"trendsFrom": "7d",
|
||||||
"limitmetrics": 50,
|
"limitmetrics": 50,
|
||||||
|
|
||||||
"metrics": true,
|
"metrics": true,
|
||||||
|
|||||||
Reference in New Issue
Block a user