iss #71 - Implemented text metrics query.

This commit is contained in:
Alexander Zobnin
2015-08-18 23:24:15 +03:00
parent 9ec32b26e8
commit 1f6ecd5aed
3 changed files with 105 additions and 80 deletions

View File

@@ -94,7 +94,7 @@ function (angular, _, kbn) {
// Create request for each target // Create request for each target
var promises = _.map(options.targets, function(target) { var promises = _.map(options.targets, function(target) {
if (!target.mode || target.mode === 0) { if (target.mode !== 1) {
// Don't show undefined and hidden targets // Don't show undefined and hidden targets
if (target.hide || !target.group || !target.host if (target.hide || !target.group || !target.host
|| !target.application || !target.item) { || !target.application || !target.item) {
@@ -119,86 +119,111 @@ function (angular, _, kbn) {
var delete_hostname_pattern = /(?:\[[\w\.]+]:\s)/g; var delete_hostname_pattern = /(?:\[[\w\.]+]:\s)/g;
var itemnames = zabbixHelperSrv.splitMetrics(itemname.replace(delete_hostname_pattern, '')); var itemnames = zabbixHelperSrv.splitMetrics(itemname.replace(delete_hostname_pattern, ''));
// Find items by item names and perform queries
var self = this; var self = this;
return this.zabbixAPI.itemFindQuery(groups, hosts, apps)
.then(function (items) {
// Filter hosts by regex // Query numeric data
if (target.host.visible_name === 'All') { if (!target.mode) {
if (target.hostFilter && _.every(items, _.identity.hosts)) {
// Use templated variables in filter // Find items by item names and perform queries
var host_pattern = new RegExp(templateSrv.replace(target.hostFilter, options.scopedVars)); return this.zabbixAPI.itemFindQuery(groups, hosts, apps)
items = _.filter(items, function (item) { .then(function (items) {
return _.some(item.hosts, function (host) {
return host_pattern.test(host.name); // Filter hosts by regex
if (target.host.visible_name === 'All') {
if (target.hostFilter && _.every(items, _.identity.hosts)) {
// Use templated variables in filter
var host_pattern = new RegExp(templateSrv.replace(target.hostFilter, options.scopedVars));
items = _.filter(items, function (item) {
return _.some(item.hosts, function (host) {
return host_pattern.test(host.name);
});
}); });
}); }
} }
}
if (itemnames[0] === 'All') { if (itemnames[0] === 'All') {
// Filter items by regex // Filter items by regex
if (target.itemFilter) { if (target.itemFilter) {
// Use templated variables in filter // Use templated variables in filter
var item_pattern = new RegExp(templateSrv.replace(target.itemFilter, options.scopedVars)); var item_pattern = new RegExp(templateSrv.replace(target.itemFilter, options.scopedVars));
return _.filter(items, function (item) { return _.filter(items, function (item) {
return item_pattern.test(zabbixHelperSrv.expandItemName(item)); return item_pattern.test(zabbixHelperSrv.expandItemName(item));
}); });
} else {
return items;
}
} else { } else {
return items;
}
} else {
// Filtering items // Filtering items
return _.filter(items, function (item) { return _.filter(items, function (item) {
return _.contains(itemnames, zabbixHelperSrv.expandItemName(item));
});
}
}).then(function (items) {
// Don't perform query for high number of items
// to prevent Grafana slowdown
if (items.length > self.limitmetrics) {
var message = "Try to increase limitmetrics parameter in datasource config.<br>"
+ "Current limitmetrics value is " + self.limitmetrics;
alertSrv.set("Metrics limit exceeded", message, "warning", 10000);
return [];
} else {
items = _.flatten(items);
// Use alias only for single metric, otherwise use item names
var alias = target.item.name === 'All' || itemnames.length > 1 ?
undefined : templateSrv.replace(target.alias, options.scopedVars);
var history;
if ((from < useTrendsFrom) && self.trends) {
var points = target.downsampleFunction ? target.downsampleFunction.value : "avg";
history = self.zabbixAPI.getTrends(items, from, to)
.then(_.bind(zabbixHelperSrv.handleTrendResponse, zabbixHelperSrv, items, alias, target.scale, points));
} else {
history = self.zabbixAPI.getHistory(items, from, to)
.then(_.bind(zabbixHelperSrv.handleHistoryResponse, zabbixHelperSrv, items, alias, target.scale));
}
return history.then(function (timeseries) {
var timeseries_data = _.flatten(timeseries);
return _.map(timeseries_data, function (timeseries) {
// Series downsampling
if (timeseries.datapoints.length > options.maxDataPoints) {
var ms_interval = Math.floor((to - from) / options.maxDataPoints) * 1000;
var downsampleFunc = target.downsampleFunction ? target.downsampleFunction.value : "avg";
timeseries.datapoints = zabbixHelperSrv.downsampleSeries(timeseries.datapoints, to, ms_interval, downsampleFunc);
}
return timeseries;
});
});
}
});
}
// Query text data
else if (target.mode === 2) {
// Find items by item names and perform queries
return this.zabbixAPI.itemFindQuery(groups, hosts, apps, "text")
.then(function (items) {
items = _.filter(items, function (item) {
return _.contains(itemnames, zabbixHelperSrv.expandItemName(item)); return _.contains(itemnames, zabbixHelperSrv.expandItemName(item));
}); });
} return self.zabbixAPI.getHistory(items, from, to).then(function(history) {
}).then(function (items) { return {
target: target.item.name,
// Don't perform query for high number of items datapoints: _.map(history, function (p) {
// to prevent Grafana slowdown return [p.value, p.clock * 1000];
if (items.length > self.limitmetrics) { })
var message = "Try to increase limitmetrics parameter in datasource config.<br>" };
+ "Current limitmetrics value is " + self.limitmetrics; });
alertSrv.set("Metrics limit exceeded", message, "warning", 10000); });
return []; }
} else {
items = _.flatten(items);
// Use alias only for single metric, otherwise use item names
var alias = target.item.name === 'All' || itemnames.length > 1 ?
undefined : templateSrv.replace(target.alias, options.scopedVars);
var history;
if ((from < useTrendsFrom) && self.trends) {
var points = target.downsampleFunction ? target.downsampleFunction.value : "avg";
history = self.zabbixAPI.getTrends(items, from, to)
.then(_.bind(zabbixHelperSrv.handleTrendResponse, zabbixHelperSrv, items, alias, target.scale, points));
} else {
history = self.zabbixAPI.getHistory(items, from, to)
.then(_.bind(zabbixHelperSrv.handleHistoryResponse, zabbixHelperSrv, items, alias, target.scale));
}
return history.then(function (timeseries) {
var timeseries_data = _.flatten(timeseries);
return _.map(timeseries_data, function (timeseries) {
// Series downsampling
if (timeseries.datapoints.length > options.maxDataPoints) {
var ms_interval = Math.floor((to - from) / options.maxDataPoints) * 1000;
var downsampleFunc = target.downsampleFunction ? target.downsampleFunction.value : "avg";
timeseries.datapoints = zabbixHelperSrv.downsampleSeries(timeseries.datapoints, to, ms_interval, downsampleFunc);
}
return timeseries;
});
});
}
});
} }
// IT services mode // IT services mode
@@ -211,11 +236,6 @@ function (angular, _, kbn) {
.then(_.bind(zabbixHelperSrv.handleSLAResponse, zabbixHelperSrv, target.itservice, target.slaProperty)); .then(_.bind(zabbixHelperSrv.handleSLAResponse, zabbixHelperSrv, target.itservice, target.slaProperty));
} }
} }
// Text metrics mode
else if (target.mode === 2) {
return [];
}
}, this); }, this);
return $q.all(_.flatten(promises)).then(function (results) { return $q.all(_.flatten(promises)).then(function (results) {

View File

@@ -13,7 +13,7 @@ define([
$scope.init = function () { $scope.init = function () {
$scope.targetLetters = targetLetters; $scope.targetLetters = targetLetters;
if (!$scope.target.mode || $scope.target.mode === 0) { if (!$scope.target.mode || $scope.target.mode !== 1) {
$scope.downsampleFunctionList = [ $scope.downsampleFunctionList = [
{name: "avg", value: "avg"}, {name: "avg", value: "avg"},
{name: "min", value: "min"}, {name: "min", value: "min"},
@@ -224,8 +224,9 @@ define([
var hosts = $scope.target.host ? zabbixHelperSrv.splitMetrics(templateSrv.replace($scope.target.host.name)) : undefined; var hosts = $scope.target.host ? zabbixHelperSrv.splitMetrics(templateSrv.replace($scope.target.host.name)) : undefined;
var apps = $scope.target.application ? var apps = $scope.target.application ?
zabbixHelperSrv.splitMetrics(templateSrv.replace($scope.target.application.name)) : undefined; zabbixHelperSrv.splitMetrics(templateSrv.replace($scope.target.application.name)) : undefined;
var itemtype = $scope.target.mode === 2 ? "text" : "numeric";
if (groups && hosts && apps) { if (groups && hosts && apps) {
$scope.datasource.zabbixAPI.itemFindQuery(groups, hosts, apps).then(function (items) { $scope.datasource.zabbixAPI.itemFindQuery(groups, hosts, apps, itemtype).then(function (items) {
// Show only unique item names // Show only unique item names
var uniq_items = _.map(_.uniq(items, function (item) { var uniq_items = _.map(_.uniq(items, function (item) {
return zabbixHelperSrv.expandItemName(item); return zabbixHelperSrv.expandItemName(item);

View File

@@ -294,7 +294,7 @@ function (angular, _) {
* @param {string|string[]} groupids /////////////////////////// * @param {string|string[]} groupids ///////////////////////////
* @return {string|string[]} Array of Zabbix API item objects * @return {string|string[]} Array of Zabbix API item objects
*/ */
p.performItemSuggestQuery = function(hostids, applicationids, /* optional */ groupids) { p.performItemSuggestQuery = function(hostids, applicationids, groupids, itemtype) {
var params = { var params = {
output: ['name', 'key_', 'value_type', 'delay'], output: ['name', 'key_', 'value_type', 'delay'],
sortfield: 'name', sortfield: 'name',
@@ -302,13 +302,17 @@ function (angular, _) {
webitems: true, webitems: true,
// Return only numeric items // Return only numeric items
filter: { filter: {
value_type: [0,3] value_type: [0, 3]
}, },
// Return only enabled items // Return only enabled items
monitored: true, monitored: true,
searchByAny: true searchByAny: true
}; };
if (itemtype === "text") {
params.filter.value_type = [1, 2, 4];
}
// Filter by hosts or by groups // Filter by hosts or by groups
if (hostids) { if (hostids) {
params.hostids = hostids; params.hostids = hostids;
@@ -409,7 +413,7 @@ function (angular, _) {
* @param {string or array} apps * @param {string or array} apps
* @return {array} array of Zabbix API item objects * @return {array} array of Zabbix API item objects
*/ */
p.itemFindQuery = function(groups, hosts, apps) { p.itemFindQuery = function(groups, hosts, apps, itemtype) {
var promises = []; var promises = [];
// Get hostids from names // Get hostids from names
@@ -447,7 +451,7 @@ function (angular, _) {
}), 'applicationid'); }), 'applicationid');
} }
return self.performItemSuggestQuery(hostids, applicationids, groupids); return self.performItemSuggestQuery(hostids, applicationids, groupids, itemtype);
}); });
}; };