triggers: able to filter by proxy, #418

This commit is contained in:
Alexander Zobnin
2018-11-07 22:32:46 +03:00
parent f05bc08b88
commit 89a4364212
4 changed files with 64 additions and 26 deletions

View File

@@ -243,7 +243,7 @@ export class Zabbix {
/** /**
* Build query - convert target filters to array of Zabbix items * Build query - convert target filters to array of Zabbix items
*/ */
getTriggers(groupFilter, hostFilter, appFilter, options) { getTriggers(groupFilter, hostFilter, appFilter, options, proxyFilter) {
let promises = [ let promises = [
this.getGroups(groupFilter), this.getGroups(groupFilter),
this.getHosts(groupFilter, hostFilter), this.getHosts(groupFilter, hostFilter),
@@ -252,9 +252,7 @@ export class Zabbix {
return Promise.all(promises) return Promise.all(promises)
.then(results => { .then(results => {
let filteredGroups = results[0]; let [filteredGroups, filteredHosts, filteredApps] = results;
let filteredHosts = results[1];
let filteredApps = results[2];
let query = {}; let query = {};
if (appFilter) { if (appFilter) {
@@ -268,8 +266,36 @@ export class Zabbix {
} }
return query; return query;
}).then(query => { })
return this.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options); .then(query => this.zabbixAPI.getTriggers(query.groupids, query.hostids, query.applicationids, options))
.then(triggers => this.filterTriggersByProxy(triggers, proxyFilter));
}
filterTriggersByProxy(triggers, proxyFilter) {
return this.getFilteredProxies(proxyFilter)
.then(proxies => {
if (proxyFilter && proxyFilter !== '/.*/' && triggers) {
const proxy_ids = proxies.map(proxy => proxy.proxyid);
triggers = triggers.filter(trigger => {
let filtered = false;
for(let i = 0; i < trigger.hosts.length; i++) {
const host = trigger.hosts[i];
if (proxy_ids.includes(host.proxy_hostid)) {
filtered = true;
}
}
return filtered;
});
}
return triggers;
});
}
getFilteredProxies(proxyFilter) {
return this.zabbixAPI.getProxies()
.then(proxies => {
proxies.forEach(proxy => proxy.name = proxy.host);
return findByFilter(proxies, proxyFilter);
}); });
} }

View File

@@ -2,7 +2,7 @@ import _ from 'lodash';
import {DEFAULT_TARGET} from './triggers_panel_ctrl'; import {DEFAULT_TARGET} from './triggers_panel_ctrl';
// Actual schema version // Actual schema version
export const CURRENT_SCHEMA_VERSION = 4; export const CURRENT_SCHEMA_VERSION = 5;
export function migratePanelSchema(panel) { export function migratePanelSchema(panel) {
if (isEmptyPanel(panel)) { if (isEmptyPanel(panel)) {
@@ -31,7 +31,7 @@ export function migratePanelSchema(panel) {
delete panel.hideHostsInMaintenance; delete panel.hideHostsInMaintenance;
} }
if (schemaVersion < 4) { if (schemaVersion < 5) {
if (panel.targets && !_.isEmpty(panel.targets)) { if (panel.targets && !_.isEmpty(panel.targets)) {
_.each(panel.targets, (target) => { _.each(panel.targets, (target) => {
_.defaultsDeep(target, DEFAULT_TARGET); _.defaultsDeep(target, DEFAULT_TARGET);

View File

@@ -19,7 +19,7 @@
<div class="section gf-form-group"> <div class="section gf-form-group">
<h5 class="section-heading">{{ ds }}</h5> <h5 class="section-heading">{{ ds }}</h5>
<div class="gf-form-inline"> <div class="gf-form-inline">
<div class="gf-form max-width-20"> <div class="gf-form">
<label class="gf-form-label query-keyword width-7">Group</label> <label class="gf-form-label query-keyword width-7">Group</label>
<input type="text" <input type="text"
ng-model="ctrl.panel.targets[ds].group.filter" ng-model="ctrl.panel.targets[ds].group.filter"
@@ -27,7 +27,7 @@
ng-blur="editor.parseTarget()" ng-blur="editor.parseTarget()"
data-min-length=0 data-min-length=0
data-items=100 data-items=100
class="gf-form-input" class="gf-form-input width-14"
ng-class="{ ng-class="{
'zbx-variable': editor.isVariable(ctrl.panel.targets[ds].group.filter), 'zbx-variable': editor.isVariable(ctrl.panel.targets[ds].group.filter),
'zbx-regex': editor.isRegex(ctrl.panel.targets[ds].group.filter) 'zbx-regex': editor.isRegex(ctrl.panel.targets[ds].group.filter)
@@ -41,16 +41,30 @@
ng-blur="editor.parseTarget()" ng-blur="editor.parseTarget()"
data-min-length=0 data-min-length=0
data-items=100 data-items=100
class="gf-form-input" class="gf-form-input width-14"
ng-class="{ ng-class="{
'zbx-variable': editor.isVariable(ctrl.panel.targets[ds].host.filter), 'zbx-variable': editor.isVariable(ctrl.panel.targets[ds].host.filter),
'zbx-regex': editor.isRegex(ctrl.panel.targets[ds].host.filter) 'zbx-regex': editor.isRegex(ctrl.panel.targets[ds].host.filter)
}"> }">
</div> </div>
<div class="gf-form">
<label class="gf-form-label query-keyword width-7">Proxy</label>
<input type="text"
ng-model="ctrl.panel.targets[ds].proxy.filter"
bs-typeahead="editor.getHostNames[ds]"
ng-blur="editor.parseTarget()"
data-min-length=0
data-items=100
class="gf-form-input width-14"
ng-class="{
'zbx-variable': editor.isVariable(ctrl.panel.targets[ds].proxy.filter),
'zbx-regex': editor.isRegex(ctrl.panel.targets[ds].proxy.filter)
}">
</div>
</div> </div>
<div class="gf-form-inline"> <div class="gf-form-inline">
<div class="gf-form max-width-20"> <div class="gf-form">
<label class="gf-form-label query-keyword width-7">Application</label> <label class="gf-form-label query-keyword width-7">Application</label>
<input type="text" <input type="text"
ng-model="ctrl.panel.targets[ds].application.filter" ng-model="ctrl.panel.targets[ds].application.filter"
@@ -58,7 +72,7 @@
ng-blur="editor.parseTarget()" ng-blur="editor.parseTarget()"
data-min-length=0 data-min-length=0
data-items=100 data-items=100
class="gf-form-input" class="gf-form-input width-14"
ng-class="{ ng-class="{
'zbx-variable': editor.isVariable(ctrl.panel.targets[ds].application.filter), 'zbx-variable': editor.isVariable(ctrl.panel.targets[ds].application.filter),
'zbx-regex': editor.isRegex(ctrl.panel.targets[ds].application.filter) 'zbx-regex': editor.isRegex(ctrl.panel.targets[ds].application.filter)
@@ -70,7 +84,7 @@
ng-model="ctrl.panel.targets[ds].trigger.filter" ng-model="ctrl.panel.targets[ds].trigger.filter"
ng-blur="editor.parseTarget()" ng-blur="editor.parseTarget()"
placeholder="trigger name" placeholder="trigger name"
class="gf-form-input" class="gf-form-input width-14"
ng-style="ctrl.panel.targets[ds].trigger.style" ng-style="ctrl.panel.targets[ds].trigger.style"
ng-class="{ ng-class="{
'zbx-variable': editor.isVariable(ctrl.panel.targets[ds].trigger.filter), 'zbx-variable': editor.isVariable(ctrl.panel.targets[ds].trigger.filter),
@@ -80,7 +94,7 @@
</div> </div>
<div class="gf-form"> <div class="gf-form">
<label class="gf-form-label query-keyword width-7">Tags</label> <label class="gf-form-label query-keyword width-7">Tags</label>
<input type="text" class="gf-form-input" <input type="text" class="gf-form-input width-14"
ng-model="ctrl.panel.targets[ds].tags.filter" ng-model="ctrl.panel.targets[ds].tags.filter"
ng-blur="editor.parseTarget()" ng-blur="editor.parseTarget()"
placeholder="tag1:value1, tag2:value2"> placeholder="tag1:value1, tag2:value2">

View File

@@ -15,6 +15,7 @@ export const DEFAULT_TARGET = {
application: {filter: ""}, application: {filter: ""},
trigger: {filter: ""}, trigger: {filter: ""},
tags: {filter: ""}, tags: {filter: ""},
proxy: {filter: ""},
}; };
export const DEFAULT_SEVERITY = [ export const DEFAULT_SEVERITY = [
@@ -204,7 +205,7 @@ export class TriggerPanelCtrl extends PanelCtrl {
getTriggers() { getTriggers() {
let promises = _.map(this.panel.datasources, (ds) => { let promises = _.map(this.panel.datasources, (ds) => {
let proxies = []; let proxies;
return this.datasourceSrv.get(ds) return this.datasourceSrv.get(ds)
.then(datasource => { .then(datasource => {
const zabbix = datasource.zabbix; const zabbix = datasource.zabbix;
@@ -217,27 +218,24 @@ export class TriggerPanelCtrl extends PanelCtrl {
const groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter); const groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter);
const hostFilter = datasource.replaceTemplateVars(triggerFilter.host.filter); const hostFilter = datasource.replaceTemplateVars(triggerFilter.host.filter);
const appFilter = datasource.replaceTemplateVars(triggerFilter.application.filter); const appFilter = datasource.replaceTemplateVars(triggerFilter.application.filter);
const proxyFilter = datasource.replaceTemplateVars(triggerFilter.proxy.filter);
let triggersOptions = { let triggersOptions = {
showTriggers: showEvents showTriggers: showEvents
}; };
return Promise.all([ return Promise.all([
zabbix.getTriggers(groupFilter, hostFilter, appFilter, triggersOptions), zabbix.getTriggers(groupFilter, hostFilter, appFilter, triggersOptions, proxyFilter),
getProxiesPromise getProxiesPromise
]); ]);
}).then(([triggers, sourceProxies]) => { }).then(([triggers, sourceProxies]) => {
proxies = _.keyBy(sourceProxies, 'proxyid'); proxies = _.keyBy(sourceProxies, 'proxyid');
return this.getAcknowledges(triggers, ds); return this.getAcknowledges(triggers, ds);
}).then((triggers) => { })
return this.setMaintenanceStatus(triggers); .then(triggers => this.setMaintenanceStatus(triggers))
}).then((triggers) => { .then(triggers => this.filterTriggersPre(triggers, ds))
return this.filterTriggersPre(triggers, ds); .then(triggers => this.addTriggerDataSource(triggers, ds))
}).then((triggers) => { .then(triggers => this.addTriggerHostProxy(triggers, proxies));
return this.addTriggerDataSource(triggers, ds);
}).then((triggers) => {
return this.addTriggerHostProxy(triggers, proxies);
});
}); });
return Promise.all(promises) return Promise.all(promises)