From c58aae7f10c2ed2d6030fa152c93966b1f44f0f8 Mon Sep 17 00:00:00 2001 From: alexanderzobnin Date: Thu, 18 Jun 2015 13:01:42 +0300 Subject: [PATCH 1/3] iss #16 Add methods for get and handle trends. --- zabbix/datasource.js | 56 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/zabbix/datasource.js b/zabbix/datasource.js index ff249c4..62212d9 100644 --- a/zabbix/datasource.js +++ b/zabbix/datasource.js @@ -93,8 +93,8 @@ function (angular, _, kbn) { return []; } else { items = _.flatten(items); - return self.performTimeSeriesQuery(items, from, to) - .then(_.partial(self.handleHistoryResponse, items)); + return self.getTrends(items, from, to) + .then(_.partial(self.handleTrendResponse, items)); } }); }, this); @@ -142,6 +142,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 * From a7e322bfebda5c3bb7f2648994a4a2e442b50054 Mon Sep 17 00:00:00 2001 From: alexanderzobnin Date: Thu, 18 Jun 2015 13:26:39 +0300 Subject: [PATCH 2/3] iss #16 Add auto selection between history and trends. --- zabbix/datasource.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/zabbix/datasource.js b/zabbix/datasource.js index 62212d9..f03fc51 100644 --- a/zabbix/datasource.js +++ b/zabbix/datasource.js @@ -44,6 +44,7 @@ function (angular, _, kbn) { // get from & to in seconds var from = Math.ceil(kbn.parseDate(options.range.from).getTime() / 1000); var to = Math.ceil(kbn.parseDate(options.range.to).getTime() / 1000); + var getTrendsFrom = Math.ceil(kbn.parseDate('now-7d').getTime() / 1000); // Create request for each target var promises = _.map(options.targets, function(target) { @@ -93,8 +94,14 @@ function (angular, _, kbn) { return []; } else { items = _.flatten(items); - return self.getTrends(items, from, to) - .then(_.partial(self.handleTrendResponse, items)); + + if (from > getTrendsFrom) { + return self.performTimeSeriesQuery(items, from, to) + .then(_.partial(self.handleHistoryResponse, items)); + } else { + return self.getTrends(items, from, to) + .then(_.partial(self.handleTrendResponse, items)); + } } }); }, this); From 2a60256b83c3fa93f24bf9a5b3b328267b2f975c Mon Sep 17 00:00:00 2001 From: alexanderzobnin Date: Thu, 18 Jun 2015 14:25:28 +0300 Subject: [PATCH 3/3] iss #16 Add trendsFrom option to specify trend use period. --- zabbix/datasource.js | 7 +++++-- zabbix/plugin.json | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/zabbix/datasource.js b/zabbix/datasource.js index f03fc51..b3b146d 100644 --- a/zabbix/datasource.js +++ b/zabbix/datasource.js @@ -25,6 +25,9 @@ function (angular, _, kbn) { this.username = datasource.meta.username; 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 this.limitmetrics = datasource.meta.limitmetrics || 50; } @@ -44,7 +47,7 @@ function (angular, _, kbn) { // get from & to in seconds var from = Math.ceil(kbn.parseDate(options.range.from).getTime() / 1000); var to = Math.ceil(kbn.parseDate(options.range.to).getTime() / 1000); - var getTrendsFrom = Math.ceil(kbn.parseDate('now-7d').getTime() / 1000); + var useTrendsFrom = Math.ceil(kbn.parseDate('now-' + this.trendsFrom).getTime() / 1000); // Create request for each target var promises = _.map(options.targets, function(target) { @@ -95,7 +98,7 @@ function (angular, _, kbn) { } else { items = _.flatten(items); - if (from > getTrendsFrom) { + if (from > useTrendsFrom) { return self.performTimeSeriesQuery(items, from, to) .then(_.partial(self.handleHistoryResponse, items)); } else { diff --git a/zabbix/plugin.json b/zabbix/plugin.json index 75f81cf..55c9dcf 100644 --- a/zabbix/plugin.json +++ b/zabbix/plugin.json @@ -16,6 +16,7 @@ "username": "guest", "password": "", + "trendsFrom": "7d", "limitmetrics": 50, "metrics": true,