+
-
diff --git a/src/panel-triggers/triggers_panel_ctrl.js b/src/panel-triggers/triggers_panel_ctrl.js
index 9362ffb..6edcf87 100644
--- a/src/panel-triggers/triggers_panel_ctrl.js
+++ b/src/panel-triggers/triggers_panel_ctrl.js
@@ -15,6 +15,7 @@ export const DEFAULT_TARGET = {
application: {filter: ""},
trigger: {filter: ""},
tags: {filter: ""},
+ proxy: {filter: ""},
};
export const DEFAULT_SEVERITY = [
@@ -36,6 +37,7 @@ export const PANEL_DEFAULTS = {
hostField: true,
hostTechNameField: false,
hostGroups: false,
+ hostProxy: false,
showTags: true,
statusField: true,
severityField: true,
@@ -203,31 +205,37 @@ export class TriggerPanelCtrl extends PanelCtrl {
getTriggers() {
let promises = _.map(this.panel.datasources, (ds) => {
+ let proxies;
return this.datasourceSrv.get(ds)
.then(datasource => {
- var zabbix = datasource.zabbix;
- var showEvents = this.panel.showEvents.value;
- var triggerFilter = this.panel.targets[ds];
+ const zabbix = datasource.zabbix;
+ const showEvents = this.panel.showEvents.value;
+ const triggerFilter = this.panel.targets[ds];
+ const showProxy = this.panel.hostProxy;
+ const getProxiesPromise = showProxy ? zabbix.getProxies() : () => [];
// Replace template variables
- var groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter);
- var hostFilter = datasource.replaceTemplateVars(triggerFilter.host.filter);
- var appFilter = datasource.replaceTemplateVars(triggerFilter.application.filter);
+ const groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter);
+ const hostFilter = datasource.replaceTemplateVars(triggerFilter.host.filter);
+ const appFilter = datasource.replaceTemplateVars(triggerFilter.application.filter);
+ const proxyFilter = datasource.replaceTemplateVars(triggerFilter.proxy.filter);
let triggersOptions = {
showTriggers: showEvents
};
- return zabbix.getTriggers(groupFilter, hostFilter, appFilter, triggersOptions);
- }).then((triggers) => {
+ return Promise.all([
+ zabbix.getTriggers(groupFilter, hostFilter, appFilter, triggersOptions, proxyFilter),
+ getProxiesPromise
+ ]);
+ }).then(([triggers, sourceProxies]) => {
+ proxies = _.keyBy(sourceProxies, 'proxyid');
return this.getAcknowledges(triggers, ds);
- }).then((triggers) => {
- return this.setMaintenanceStatus(triggers);
- }).then((triggers) => {
- return this.filterTriggersPre(triggers, ds);
- }).then((triggers) => {
- return this.addTriggerDataSource(triggers, ds);
- });
+ })
+ .then(triggers => this.setMaintenanceStatus(triggers))
+ .then(triggers => this.filterTriggersPre(triggers, ds))
+ .then(triggers => this.addTriggerDataSource(triggers, ds))
+ .then(triggers => this.addTriggerHostProxy(triggers, proxies));
});
return Promise.all(promises)
@@ -344,6 +352,19 @@ export class TriggerPanelCtrl extends PanelCtrl {
return triggers;
}
+ addTriggerHostProxy(triggers, proxies) {
+ triggers.forEach(trigger => {
+ if (trigger.hosts && trigger.hosts.length) {
+ let host = trigger.hosts[0];
+ if (host.proxy_hostid !== '0') {
+ const hostProxy = proxies[host.proxy_hostid];
+ host.proxy = hostProxy ? hostProxy.host : '';
+ }
+ }
+ });
+ return triggers;
+ }
+
sortTriggers(triggerList) {
if (this.panel.sortTriggersBy.value === 'priority') {
triggerList = _.orderBy(triggerList, ['priority', 'lastchangeUnix', 'triggerid'], ['desc', 'desc', 'desc']);
@@ -355,12 +376,15 @@ export class TriggerPanelCtrl extends PanelCtrl {
formatTrigger(zabbixTrigger) {
let trigger = _.cloneDeep(zabbixTrigger);
- let triggerObj = trigger;
- // Set host that the trigger belongs
+ // Set host and proxy that the trigger belongs
if (trigger.hosts && trigger.hosts.length) {
- triggerObj.host = trigger.hosts[0].name;
- triggerObj.hostTechName = trigger.hosts[0].host;
+ const host = trigger.hosts[0];
+ trigger.host = host.name;
+ trigger.hostTechName = host.host;
+ if (host.proxy) {
+ trigger.proxy = host.proxy;
+ }
}
// Set tags if present
@@ -375,9 +399,9 @@ export class TriggerPanelCtrl extends PanelCtrl {
// Format last change and age
trigger.lastchangeUnix = Number(trigger.lastchange);
- triggerObj = this.setTriggerLastChange(triggerObj);
- triggerObj = this.setTriggerSeverity(triggerObj);
- return triggerObj;
+ trigger = this.setTriggerLastChange(trigger);
+ trigger = this.setTriggerSeverity(trigger);
+ return trigger;
}
updateTriggerFormat(trigger) {
@@ -491,6 +515,9 @@ export class TriggerPanelCtrl extends PanelCtrl {
} else if (this.panel.hostField || this.panel.hostTechNameField) {
host = this.panel.hostField ? trigger.host : trigger.hostTechName;
}
+ if (this.panel.hostProxy && trigger.proxy) {
+ host = `${trigger.proxy}: ${host}`;
+ }
return host;
}
diff --git a/src/panel-triggers/triggers_tab.js b/src/panel-triggers/triggers_tab.js
index daea603..c3ba5ba 100644
--- a/src/panel-triggers/triggers_tab.js
+++ b/src/panel-triggers/triggers_tab.js
@@ -17,6 +17,7 @@ class TriggersTabCtrl {
getGroupNames: {},
getHostNames: {},
getApplicationNames: {},
+ getProxyNames: {},
oldTarget: _.cloneDeep(this.panel.targets)
};
_.defaultsDeep(this, scopeDefaults);
@@ -40,6 +41,7 @@ class TriggersTabCtrl {
this.getGroupNames[ds] = _.bind(this.suggestGroups, this, datasource);
this.getHostNames[ds] = _.bind(this.suggestHosts, this, datasource);
this.getApplicationNames[ds] = _.bind(this.suggestApps, this, datasource);
+ this.getProxyNames[ds] = _.bind(this.suggestProxies, this, datasource);
}
suggestGroups(datasource, query, callback) {
@@ -69,6 +71,12 @@ class TriggersTabCtrl {
.then(callback);
}
+ suggestProxies(datasource, query, callback) {
+ return datasource.zabbix.getProxies()
+ .then(proxies => _.map(proxies, 'host'))
+ .then(callback);
+ }
+
datasourcesChanged() {
_.each(this.panel.datasources, (ds) => {
if (!this.panel.targets[ds]) {
@@ -84,8 +92,8 @@ class TriggersTabCtrl {
var newTarget = _.cloneDeep(this.panel.targets);
if (!_.isEqual(this.oldTarget, newTarget)) {
this.oldTarget = newTarget;
+ this.panelCtrl.refresh();
}
- this.panelCtrl.refresh();
});
}
diff --git a/src/test-setup/mocks.js b/src/test-setup/mocks.js
new file mode 100644
index 0000000..efd8e43
--- /dev/null
+++ b/src/test-setup/mocks.js
@@ -0,0 +1,26 @@
+export let templateSrvMock = {
+ replace: jest.fn().mockImplementation(query => query)
+};
+
+export let backendSrvMock = {
+ datasourceRequest: jest.fn()
+};
+
+export let datasourceSrvMock = {
+ loadDatasource: jest.fn(),
+ getAll: jest.fn()
+};
+
+export let zabbixAlertingSrvMock = {
+ setPanelAlertState: jest.fn(),
+ removeZabbixThreshold: jest.fn(),
+};
+
+const defaultExports = {
+ templateSrvMock,
+ backendSrvMock,
+ datasourceSrvMock,
+ zabbixAlertingSrvMock
+};
+
+export default defaultExports;