diff --git a/plugins/datasource-zabbix/queryProcessor.js b/plugins/datasource-zabbix/queryProcessor.js index d28e2f4..97f128a 100644 --- a/plugins/datasource-zabbix/queryProcessor.js +++ b/plugins/datasource-zabbix/queryProcessor.js @@ -28,6 +28,19 @@ function (angular, _, utils) { } }; + /** + * Build trigger query in asynchronous manner + */ + this.buildTriggerQuery = function (groupFilter, hostFilter, appFilter) { + if (this.cache._initialized) { + return $q.when(self.buildTriggerQueryFromCache(groupFilter, hostFilter, appFilter)); + } else { + return this.cache.refresh().then(function() { + return self.buildTriggerQueryFromCache(groupFilter, hostFilter, appFilter); + }); + } + }; + this.filterGroups = function(groupFilter) { return self.cache.getGroups().then(function(groupList) { return groupList; @@ -309,6 +322,60 @@ function (angular, _, utils) { }); }; + /** + * Build query - convert target filters to array of Zabbix items + */ + this.buildTriggerQueryFromCache = function (groupFilter, hostFilter, appFilter) { + var promises = [ + this.filterGroups(groupFilter).then(function(groups) { + return _.filter(groups, function(group) { + if (utils.isRegex(groupFilter)) { + return utils.buildRegex(groupFilter).test(group.name); + } else { + return group.name === groupFilter; + } + }); + }), + this.filterHosts(groupFilter).then(function(hosts) { + return _.filter(hosts, function(host) { + if (utils.isRegex(hostFilter)) { + return utils.buildRegex(hostFilter).test(host.name); + } else { + return host.name === hostFilter; + } + }); + }), + this.filterApplications(groupFilter, hostFilter).then(function(apps) { + return _.filter(apps, function(app) { + if (utils.isRegex(appFilter)) { + return utils.buildRegex(appFilter).test(app.name); + } else { + return app.name === appFilter; + } + }); + }) + ]; + + return $q.all(promises).then(function(results) { + var filteredGroups = results[0]; + var filteredHosts = results[1]; + var filteredApps = results[2]; + var query = {}; + + if (appFilter) { + query.applicationids = _.flatten(_.map(filteredApps, 'applicationids')); + } + if (hostFilter) { + query.hostids = _.map(filteredHosts, 'hostid'); + } + if (groupFilter) { + query.groupids = _.map(filteredGroups, 'groupid'); + } + + return query; + }); + }; + /** * Convert Zabbix API history.get response to Grafana format * diff --git a/plugins/datasource-zabbix/zabbixAPI.js b/plugins/datasource-zabbix/zabbixAPI.js index fe9db06..1136874 100644 --- a/plugins/datasource-zabbix/zabbixAPI.js +++ b/plugins/datasource-zabbix/zabbixAPI.js @@ -296,9 +296,12 @@ function (angular, _) { return this.request('service.getsla', params); }; - p.getTriggers = function() { + p.getTriggers = function(groupids, hostids, applicationids) { var params = { output: 'extend', + groupids: groupids, + hostids: hostids, + applicationids: applicationids, expandDescription: true, expandData: true, monitored: true, diff --git a/plugins/panel-triggers/module.js b/plugins/panel-triggers/module.js index 74f5685..17f46ea 100644 --- a/plugins/panel-triggers/module.js +++ b/plugins/panel-triggers/module.js @@ -121,74 +121,82 @@ function (angular, app, _, $, config, PanelMeta) { // Load datasource return datasourceSrv.get($scope.panel.datasource).then(function (datasource) { var zabbix = datasource.zabbixAPI; + var queryProcessor = datasource.queryProcessor; + var triggerFilter = $scope.panel.triggers; + var buildQuery = queryProcessor.buildTriggerQuery(triggerFilter.group.filter, + triggerFilter.host.filter, + triggerFilter.application.filter); + return buildQuery.then(function(query) { + return zabbix.getTriggers(query.groupids, + query.hostids, + query.applicationids, + $scope.panel.showEvents.value) + .then(function(triggers) { + return _.map(triggers, function (trigger) { + var lastchange = new Date(trigger.lastchange * 1000); + var lastchangeUnix = trigger.lastchange; + var now = new Date(); - // Get triggers - return zabbix.getTriggers($scope.panel.showEvents.value) - .then(function(triggers) { - return _.map(triggers, function (trigger) { - var lastchange = new Date(trigger.lastchange * 1000); - var lastchangeUnix = trigger.lastchange; - var now = new Date(); - - // Consider local time offset - var ageUnix = now - lastchange + now.getTimezoneOffset() * 60000; - var age = toZabbixAgeFormat(ageUnix); - var triggerObj = trigger; - triggerObj.lastchangeUnix = lastchangeUnix; - triggerObj.lastchange = lastchange.toLocaleString(); - triggerObj.age = age.toLocaleString(); - triggerObj.color = $scope.panel.triggerSeverity[trigger.priority].color; - triggerObj.severity = $scope.panel.triggerSeverity[trigger.priority].severity; - return triggerObj; - }); - }) - .then(function (triggerList) { - - // Request acknowledges for trigger - var eventids = _.map(triggerList, function(trigger) { - return trigger.lastEvent.eventid; - }); - return zabbix.getAcknowledges(eventids) - .then(function (events) { - - // Map events to triggers - _.each(triggerList, function(trigger) { - var event = _.find(events, function(event) { - return event.eventid === trigger.lastEvent.eventid; - }); - - if (event) { - trigger.acknowledges = _.map(event.acknowledges, function (ack) { - var time = new Date(+ack.clock * 1000); - ack.time = time.toLocaleString(); - ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')'; - return ack; - }); - } - }); - - // Filter acknowledged triggers - if ($scope.panel.showTriggers === 'unacknowledged') { - $scope.triggerList = _.filter(triggerList, function (trigger) { - return !trigger.acknowledges; - }); - } else if ($scope.panel.showTriggers === 'acknowledged') { - $scope.triggerList = _.filter(triggerList, 'acknowledges'); - } else { - $scope.triggerList = triggerList; - } - - // Filter triggers by severity - $scope.triggerList = _.filter($scope.triggerList, function (trigger) { - return $scope.panel.triggerSeverity[trigger.priority].show; - }); - - // Limit triggers number - $scope.triggerList = _.first($scope.triggerList, $scope.panel.limit); - - $scope.panelRenderingComplete(); + // Consider local time offset + var ageUnix = now - lastchange + now.getTimezoneOffset() * 60000; + var age = toZabbixAgeFormat(ageUnix); + var triggerObj = trigger; + triggerObj.lastchangeUnix = lastchangeUnix; + triggerObj.lastchange = lastchange.toLocaleString(); + triggerObj.age = age.toLocaleString(); + triggerObj.color = $scope.panel.triggerSeverity[trigger.priority].color; + triggerObj.severity = $scope.panel.triggerSeverity[trigger.priority].severity; + return triggerObj; }); - }); + }) + .then(function (triggerList) { + + // Request acknowledges for trigger + var eventids = _.map(triggerList, function(trigger) { + return trigger.lastEvent.eventid; + }); + return zabbix.getAcknowledges(eventids) + .then(function (events) { + + // Map events to triggers + _.each(triggerList, function(trigger) { + var event = _.find(events, function(event) { + return event.eventid === trigger.lastEvent.eventid; + }); + + if (event) { + trigger.acknowledges = _.map(event.acknowledges, function (ack) { + var time = new Date(+ack.clock * 1000); + ack.time = time.toLocaleString(); + ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')'; + return ack; + }); + } + }); + + // Filter acknowledged triggers + if ($scope.panel.showTriggers === 'unacknowledged') { + $scope.triggerList = _.filter(triggerList, function (trigger) { + return !trigger.acknowledges; + }); + } else if ($scope.panel.showTriggers === 'acknowledged') { + $scope.triggerList = _.filter(triggerList, 'acknowledges'); + } else { + $scope.triggerList = triggerList; + } + + // Filter triggers by severity + $scope.triggerList = _.filter($scope.triggerList, function (trigger) { + return $scope.panel.triggerSeverity[trigger.priority].show; + }); + + // Limit triggers number + $scope.triggerList = _.first($scope.triggerList, $scope.panel.limit); + + $scope.panelRenderingComplete(); + }); + }); + }); }); };