Triggers Panel: refactor.
This commit is contained in:
2
dist/panel-triggers/module.html
vendored
2
dist/panel-triggers/module.html
vendored
@@ -35,7 +35,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="trigger in ctrl.currentPage">
|
<tr ng-repeat="trigger in ctrl.triggerList">
|
||||||
|
|
||||||
<td ng-if="ctrl.panel.hostField">
|
<td ng-if="ctrl.panel.hostField">
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
305
dist/panel-triggers/module.js
vendored
305
dist/panel-triggers/module.js
vendored
@@ -3,7 +3,7 @@
|
|||||||
System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'app/plugins/sdk', './editor', './ack-tooltip.directive', './css/panel_triggers.css!'], function (_export, _context) {
|
System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'app/plugins/sdk', './editor', './ack-tooltip.directive', './css/panel_triggers.css!'], function (_export, _context) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var _, $, moment, utils, MetricsPanelCtrl, triggerPanelEditor, _createClass, _get, defaultSeverity, panelDefaults, triggerStatusMap, defaultTimeFormat, TriggerPanelCtrl;
|
var _, $, moment, utils, PanelCtrl, triggerPanelEditor, _createClass, defaultSeverity, panelDefaults, triggerStatusMap, defaultTimeFormat, TriggerPanelCtrl;
|
||||||
|
|
||||||
function _classCallCheck(instance, Constructor) {
|
function _classCallCheck(instance, Constructor) {
|
||||||
if (!(instance instanceof Constructor)) {
|
if (!(instance instanceof Constructor)) {
|
||||||
@@ -35,7 +35,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
|
|||||||
if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
function filterTriggers(triggers, triggerFilter) {
|
function _filterTriggers(triggers, triggerFilter) {
|
||||||
if (utils.isRegex(triggerFilter)) {
|
if (utils.isRegex(triggerFilter)) {
|
||||||
return _.filter(triggers, function (trigger) {
|
return _.filter(triggers, function (trigger) {
|
||||||
return utils.buildRegex(triggerFilter).test(trigger.description);
|
return utils.buildRegex(triggerFilter).test(trigger.description);
|
||||||
@@ -57,7 +57,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
|
|||||||
}, function (_datasourceZabbixUtils) {
|
}, function (_datasourceZabbixUtils) {
|
||||||
utils = _datasourceZabbixUtils;
|
utils = _datasourceZabbixUtils;
|
||||||
}, function (_appPluginsSdk) {
|
}, function (_appPluginsSdk) {
|
||||||
MetricsPanelCtrl = _appPluginsSdk.MetricsPanelCtrl;
|
PanelCtrl = _appPluginsSdk.PanelCtrl;
|
||||||
}, function (_editor) {
|
}, function (_editor) {
|
||||||
triggerPanelEditor = _editor.triggerPanelEditor;
|
triggerPanelEditor = _editor.triggerPanelEditor;
|
||||||
}, function (_ackTooltipDirective) {}, function (_cssPanel_triggersCss) {}],
|
}, function (_ackTooltipDirective) {}, function (_cssPanel_triggersCss) {}],
|
||||||
@@ -80,31 +80,6 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
|
|||||||
};
|
};
|
||||||
}();
|
}();
|
||||||
|
|
||||||
_get = function get(object, property, receiver) {
|
|
||||||
if (object === null) object = Function.prototype;
|
|
||||||
var desc = Object.getOwnPropertyDescriptor(object, property);
|
|
||||||
|
|
||||||
if (desc === undefined) {
|
|
||||||
var parent = Object.getPrototypeOf(object);
|
|
||||||
|
|
||||||
if (parent === null) {
|
|
||||||
return undefined;
|
|
||||||
} else {
|
|
||||||
return get(parent, property, receiver);
|
|
||||||
}
|
|
||||||
} else if ("value" in desc) {
|
|
||||||
return desc.value;
|
|
||||||
} else {
|
|
||||||
var getter = desc.get;
|
|
||||||
|
|
||||||
if (getter === undefined) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
return getter.call(receiver);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
defaultSeverity = [{ priority: 0, severity: 'Not classified', color: '#B7DBAB', show: true }, { priority: 1, severity: 'Information', color: '#82B5D8', show: true }, { priority: 2, severity: 'Warning', color: '#E5AC0E', show: true }, { priority: 3, severity: 'Average', color: '#C15C17', show: true }, { priority: 4, severity: 'High', color: '#BF1B00', show: true }, { priority: 5, severity: 'Disaster', color: '#890F02', show: true }];
|
defaultSeverity = [{ priority: 0, severity: 'Not classified', color: '#B7DBAB', show: true }, { priority: 1, severity: 'Information', color: '#82B5D8', show: true }, { priority: 2, severity: 'Warning', color: '#E5AC0E', show: true }, { priority: 3, severity: 'Average', color: '#C15C17', show: true }, { priority: 4, severity: 'High', color: '#BF1B00', show: true }, { priority: 5, severity: 'Disaster', color: '#890F02', show: true }];
|
||||||
panelDefaults = {
|
panelDefaults = {
|
||||||
datasource: null,
|
datasource: null,
|
||||||
@@ -136,8 +111,8 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
|
|||||||
};
|
};
|
||||||
defaultTimeFormat = "DD MMM YYYY HH:mm:ss";
|
defaultTimeFormat = "DD MMM YYYY HH:mm:ss";
|
||||||
|
|
||||||
_export('PanelCtrl', _export('TriggerPanelCtrl', TriggerPanelCtrl = function (_MetricsPanelCtrl) {
|
_export('PanelCtrl', _export('TriggerPanelCtrl', TriggerPanelCtrl = function (_PanelCtrl) {
|
||||||
_inherits(TriggerPanelCtrl, _MetricsPanelCtrl);
|
_inherits(TriggerPanelCtrl, _PanelCtrl);
|
||||||
|
|
||||||
/** @ngInject */
|
/** @ngInject */
|
||||||
function TriggerPanelCtrl($scope, $injector, $element, datasourceSrv, templateSrv, contextSrv) {
|
function TriggerPanelCtrl($scope, $injector, $element, datasourceSrv, templateSrv, contextSrv) {
|
||||||
@@ -160,6 +135,11 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
|
|||||||
|
|
||||||
_this.triggerList = [];
|
_this.triggerList = [];
|
||||||
_this.currentPage = [];
|
_this.currentPage = [];
|
||||||
|
|
||||||
|
_this.events.on('init-edit-mode', _this.onInitEditMode.bind(_this));
|
||||||
|
_this.events.on('render', _this.onRender.bind(_this));
|
||||||
|
_this.events.on('refresh', _this.onRender.bind(_this));
|
||||||
|
|
||||||
_this.refreshData();
|
_this.refreshData();
|
||||||
return _this;
|
return _this;
|
||||||
}
|
}
|
||||||
@@ -171,15 +151,10 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
|
|||||||
|
|
||||||
|
|
||||||
_createClass(TriggerPanelCtrl, [{
|
_createClass(TriggerPanelCtrl, [{
|
||||||
key: 'onInitMetricsPanelEditMode',
|
key: 'onInitEditMode',
|
||||||
value: function onInitMetricsPanelEditMode() {
|
value: function onInitEditMode() {
|
||||||
this.addEditorTab('Options', triggerPanelEditor, 2);
|
this.addEditorTab('Options', triggerPanelEditor, 2);
|
||||||
}
|
}
|
||||||
}, {
|
|
||||||
key: 'refresh',
|
|
||||||
value: function refresh() {
|
|
||||||
this.onMetricsPanelRefresh();
|
|
||||||
}
|
|
||||||
}, {
|
}, {
|
||||||
key: 'onMetricsPanelRefresh',
|
key: 'onMetricsPanelRefresh',
|
||||||
value: function onMetricsPanelRefresh() {
|
value: function onMetricsPanelRefresh() {
|
||||||
@@ -191,22 +166,37 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
|
|||||||
this.refreshData();
|
this.refreshData();
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
key: 'refreshData',
|
key: 'onRender',
|
||||||
value: function refreshData() {
|
value: function onRender() {
|
||||||
var _this2 = this;
|
var _this2 = this;
|
||||||
|
|
||||||
// clear loading/error state
|
// clear loading/error state
|
||||||
delete this.error;
|
delete this.error;
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
this.setTimeQueryStart();
|
|
||||||
|
|
||||||
var self = this;
|
return this.refreshData().then(function (triggerList) {
|
||||||
|
// Limit triggers number
|
||||||
|
_this2.triggerList = triggerList.slice(0, _this2.panel.limit);
|
||||||
|
|
||||||
|
// Notify panel that request is finished
|
||||||
|
_this2.loading = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'refreshData',
|
||||||
|
value: function refreshData() {
|
||||||
|
return this.getTriggers().then(this.getAcknowledges.bind(this)).then(this.filterTriggers.bind(this));
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'getTriggers',
|
||||||
|
value: function getTriggers() {
|
||||||
|
var _this3 = this;
|
||||||
|
|
||||||
// Load datasource
|
|
||||||
return this.datasourceSrv.get(this.panel.datasource).then(function (datasource) {
|
return this.datasourceSrv.get(this.panel.datasource).then(function (datasource) {
|
||||||
var zabbix = datasource.zabbix;
|
var zabbix = datasource.zabbix;
|
||||||
var showEvents = self.panel.showEvents.value;
|
_this3.zabbix = zabbix;
|
||||||
var triggerFilter = self.panel.triggers;
|
var showEvents = _this3.panel.showEvents.value;
|
||||||
|
var triggerFilter = _this3.panel.triggers;
|
||||||
|
|
||||||
// Replace template variables
|
// Replace template variables
|
||||||
var groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter);
|
var groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter);
|
||||||
@@ -215,114 +205,120 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
|
|||||||
|
|
||||||
var getTriggers = zabbix.getTriggers(groupFilter, hostFilter, appFilter, showEvents);
|
var getTriggers = zabbix.getTriggers(groupFilter, hostFilter, appFilter, showEvents);
|
||||||
return getTriggers.then(function (triggers) {
|
return getTriggers.then(function (triggers) {
|
||||||
return _.map(triggers, function (trigger) {
|
return _.map(triggers, _this3.formatTrigger.bind(_this3));
|
||||||
var triggerObj = trigger;
|
|
||||||
|
|
||||||
// Format last change and age
|
|
||||||
trigger.lastchangeUnix = Number(trigger.lastchange);
|
|
||||||
var timestamp = moment.unix(trigger.lastchangeUnix);
|
|
||||||
if (self.panel.customLastChangeFormat) {
|
|
||||||
// User defined format
|
|
||||||
triggerObj.lastchange = timestamp.format(self.panel.lastChangeFormat);
|
|
||||||
} else {
|
|
||||||
triggerObj.lastchange = timestamp.format(self.defaultTimeFormat);
|
|
||||||
}
|
|
||||||
triggerObj.age = timestamp.fromNow(true);
|
|
||||||
|
|
||||||
// Set host that the trigger belongs
|
|
||||||
if (trigger.hosts.length) {
|
|
||||||
triggerObj.host = trigger.hosts[0].name;
|
|
||||||
triggerObj.hostTechName = trigger.hosts[0].host;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set color
|
|
||||||
if (trigger.value === '1') {
|
|
||||||
// Problem state
|
|
||||||
triggerObj.color = self.panel.triggerSeverity[trigger.priority].color;
|
|
||||||
} else {
|
|
||||||
// OK state
|
|
||||||
triggerObj.color = self.panel.okEventColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
triggerObj.severity = self.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 timestamp = moment.unix(ack.clock);
|
|
||||||
if (self.panel.customLastChangeFormat) {
|
|
||||||
ack.time = timestamp.format(self.panel.lastChangeFormat);
|
|
||||||
} else {
|
|
||||||
ack.time = timestamp.format(self.defaultTimeFormat);
|
|
||||||
}
|
|
||||||
ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')';
|
|
||||||
return ack;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Mark acknowledged triggers with different color
|
|
||||||
if (self.panel.markAckEvents && trigger.acknowledges.length) {
|
|
||||||
trigger.color = self.panel.ackEventColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Filter triggers by description
|
|
||||||
var triggerFilter = self.panel.triggers.trigger.filter;
|
|
||||||
if (triggerFilter) {
|
|
||||||
triggerList = filterTriggers(triggerList, triggerFilter);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Filter acknowledged triggers
|
|
||||||
if (self.panel.showTriggers === 'unacknowledged') {
|
|
||||||
triggerList = _.filter(triggerList, function (trigger) {
|
|
||||||
return !trigger.acknowledges;
|
|
||||||
});
|
|
||||||
} else if (self.panel.showTriggers === 'acknowledged') {
|
|
||||||
triggerList = _.filter(triggerList, 'acknowledges');
|
|
||||||
} else {
|
|
||||||
triggerList = triggerList;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Filter triggers by severity
|
|
||||||
triggerList = _.filter(triggerList, function (trigger) {
|
|
||||||
return self.panel.triggerSeverity[trigger.priority].show;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Sort triggers
|
|
||||||
if (self.panel.sortTriggersBy.value === 'priority') {
|
|
||||||
triggerList = _.sortBy(triggerList, 'priority').reverse();
|
|
||||||
} else {
|
|
||||||
triggerList = _.sortBy(triggerList, 'lastchangeUnix').reverse();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Limit triggers number
|
|
||||||
self.triggerList = triggerList.slice(0, self.panel.limit);
|
|
||||||
|
|
||||||
// Notify panel that request is finished
|
|
||||||
self.setTimeQueryEnd();
|
|
||||||
self.loading = false;
|
|
||||||
|
|
||||||
_this2.panel.triggerList = _this2.triggerList;
|
|
||||||
_this2.render();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}, {
|
||||||
|
key: 'getAcknowledges',
|
||||||
|
value: function getAcknowledges(triggerList) {
|
||||||
|
var _this4 = this;
|
||||||
|
|
||||||
|
// Request acknowledges for trigger
|
||||||
|
var eventids = _.map(triggerList, function (trigger) {
|
||||||
|
return trigger.lastEvent.eventid;
|
||||||
|
});
|
||||||
|
|
||||||
|
return this.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 timestamp = moment.unix(ack.clock);
|
||||||
|
if (_this4.panel.customLastChangeFormat) {
|
||||||
|
ack.time = timestamp.format(_this4.panel.lastChangeFormat);
|
||||||
|
} else {
|
||||||
|
ack.time = timestamp.format(_this4.defaultTimeFormat);
|
||||||
|
}
|
||||||
|
ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')';
|
||||||
|
return ack;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Mark acknowledged triggers with different color
|
||||||
|
if (_this4.panel.markAckEvents && trigger.acknowledges.length) {
|
||||||
|
trigger.color = _this4.panel.ackEventColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return triggerList;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'filterTriggers',
|
||||||
|
value: function filterTriggers(triggerList) {
|
||||||
|
var _this5 = this;
|
||||||
|
|
||||||
|
// Filter triggers by description
|
||||||
|
var triggerFilter = this.panel.triggers.trigger.filter;
|
||||||
|
if (triggerFilter) {
|
||||||
|
triggerList = _filterTriggers(triggerList, triggerFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter acknowledged triggers
|
||||||
|
if (this.panel.showTriggers === 'unacknowledged') {
|
||||||
|
triggerList = _.filter(triggerList, function (trigger) {
|
||||||
|
return !trigger.acknowledges;
|
||||||
|
});
|
||||||
|
} else if (this.panel.showTriggers === 'acknowledged') {
|
||||||
|
triggerList = _.filter(triggerList, 'acknowledges');
|
||||||
|
} else {
|
||||||
|
triggerList = triggerList;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter triggers by severity
|
||||||
|
triggerList = _.filter(triggerList, function (trigger) {
|
||||||
|
return _this5.panel.triggerSeverity[trigger.priority].show;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Sort triggers
|
||||||
|
if (this.panel.sortTriggersBy.value === 'priority') {
|
||||||
|
triggerList = _.sortBy(triggerList, 'priority').reverse();
|
||||||
|
} else {
|
||||||
|
triggerList = _.sortBy(triggerList, 'lastchangeUnix').reverse();
|
||||||
|
}
|
||||||
|
|
||||||
|
return triggerList;
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
key: 'formatTrigger',
|
||||||
|
value: function formatTrigger(trigger) {
|
||||||
|
var triggerObj = trigger;
|
||||||
|
|
||||||
|
// Format last change and age
|
||||||
|
trigger.lastchangeUnix = Number(trigger.lastchange);
|
||||||
|
var timestamp = moment.unix(trigger.lastchangeUnix);
|
||||||
|
if (this.panel.customLastChangeFormat) {
|
||||||
|
// User defined format
|
||||||
|
triggerObj.lastchange = timestamp.format(this.panel.lastChangeFormat);
|
||||||
|
} else {
|
||||||
|
triggerObj.lastchange = timestamp.format(this.defaultTimeFormat);
|
||||||
|
}
|
||||||
|
triggerObj.age = timestamp.fromNow(true);
|
||||||
|
|
||||||
|
// Set host that the trigger belongs
|
||||||
|
if (trigger.hosts.length) {
|
||||||
|
triggerObj.host = trigger.hosts[0].name;
|
||||||
|
triggerObj.hostTechName = trigger.hosts[0].host;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set color
|
||||||
|
if (trigger.value === '1') {
|
||||||
|
// Problem state
|
||||||
|
triggerObj.color = this.panel.triggerSeverity[trigger.priority].color;
|
||||||
|
} else {
|
||||||
|
// OK state
|
||||||
|
triggerObj.color = this.panel.okEventColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
triggerObj.severity = this.panel.triggerSeverity[trigger.priority].severity;
|
||||||
|
return triggerObj;
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
key: 'switchComment',
|
key: 'switchComment',
|
||||||
value: function switchComment(trigger) {
|
value: function switchComment(trigger) {
|
||||||
@@ -331,7 +327,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
|
|||||||
}, {
|
}, {
|
||||||
key: 'acknowledgeTrigger',
|
key: 'acknowledgeTrigger',
|
||||||
value: function acknowledgeTrigger(trigger, message) {
|
value: function acknowledgeTrigger(trigger, message) {
|
||||||
var _this3 = this;
|
var _this6 = this;
|
||||||
|
|
||||||
var eventid = trigger.lastEvent.eventid;
|
var eventid = trigger.lastEvent.eventid;
|
||||||
var grafana_user = this.contextSrv.user.name;
|
var grafana_user = this.contextSrv.user.name;
|
||||||
@@ -339,15 +335,10 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
|
|||||||
return this.datasourceSrv.get(this.panel.datasource).then(function (datasource) {
|
return this.datasourceSrv.get(this.panel.datasource).then(function (datasource) {
|
||||||
var zabbixAPI = datasource.zabbix.zabbixAPI;
|
var zabbixAPI = datasource.zabbix.zabbixAPI;
|
||||||
return zabbixAPI.acknowledgeEvent(eventid, ack_message).then(function () {
|
return zabbixAPI.acknowledgeEvent(eventid, ack_message).then(function () {
|
||||||
_this3.refresh();
|
_this6.refresh();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, {
|
|
||||||
key: 'render',
|
|
||||||
value: function render() {
|
|
||||||
return _get(TriggerPanelCtrl.prototype.__proto__ || Object.getPrototypeOf(TriggerPanelCtrl.prototype), 'render', this).call(this, this.triggerList);
|
|
||||||
}
|
|
||||||
}, {
|
}, {
|
||||||
key: 'link',
|
key: 'link',
|
||||||
value: function link(scope, elem, attrs, ctrl) {
|
value: function link(scope, elem, attrs, ctrl) {
|
||||||
@@ -436,7 +427,7 @@ System.register(['lodash', 'jquery', 'moment', '../datasource-zabbix/utils', 'ap
|
|||||||
}]);
|
}]);
|
||||||
|
|
||||||
return TriggerPanelCtrl;
|
return TriggerPanelCtrl;
|
||||||
}(MetricsPanelCtrl)));
|
}(PanelCtrl)));
|
||||||
|
|
||||||
TriggerPanelCtrl.templateUrl = 'panel-triggers/module.html';
|
TriggerPanelCtrl.templateUrl = 'panel-triggers/module.html';
|
||||||
_export('TriggerPanelCtrl', TriggerPanelCtrl);
|
_export('TriggerPanelCtrl', TriggerPanelCtrl);
|
||||||
|
|||||||
2
dist/panel-triggers/module.js.map
vendored
2
dist/panel-triggers/module.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -35,7 +35,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ng-repeat="trigger in ctrl.currentPage">
|
<tr ng-repeat="trigger in ctrl.triggerList">
|
||||||
|
|
||||||
<td ng-if="ctrl.panel.hostField">
|
<td ng-if="ctrl.panel.hostField">
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import _ from 'lodash';
|
|||||||
import $ from 'jquery';
|
import $ from 'jquery';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
import * as utils from '../datasource-zabbix/utils';
|
import * as utils from '../datasource-zabbix/utils';
|
||||||
import {MetricsPanelCtrl} from 'app/plugins/sdk';
|
import {PanelCtrl} from 'app/plugins/sdk';
|
||||||
import {triggerPanelEditor} from './editor';
|
import {triggerPanelEditor} from './editor';
|
||||||
import './ack-tooltip.directive';
|
import './ack-tooltip.directive';
|
||||||
import './css/panel_triggers.css!';
|
import './css/panel_triggers.css!';
|
||||||
@@ -61,7 +61,7 @@ var triggerStatusMap = {
|
|||||||
|
|
||||||
var defaultTimeFormat = "DD MMM YYYY HH:mm:ss";
|
var defaultTimeFormat = "DD MMM YYYY HH:mm:ss";
|
||||||
|
|
||||||
class TriggerPanelCtrl extends MetricsPanelCtrl {
|
class TriggerPanelCtrl extends PanelCtrl {
|
||||||
|
|
||||||
/** @ngInject */
|
/** @ngInject */
|
||||||
constructor($scope, $injector, $element, datasourceSrv, templateSrv, contextSrv) {
|
constructor($scope, $injector, $element, datasourceSrv, templateSrv, contextSrv) {
|
||||||
@@ -81,6 +81,11 @@ class TriggerPanelCtrl extends MetricsPanelCtrl {
|
|||||||
|
|
||||||
this.triggerList = [];
|
this.triggerList = [];
|
||||||
this.currentPage = [];
|
this.currentPage = [];
|
||||||
|
|
||||||
|
this.events.on('init-edit-mode', this.onInitEditMode.bind(this));
|
||||||
|
this.events.on('render', this.onRender.bind(this));
|
||||||
|
this.events.on('refresh', this.onRender.bind(this));
|
||||||
|
|
||||||
this.refreshData();
|
this.refreshData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,14 +93,10 @@ class TriggerPanelCtrl extends MetricsPanelCtrl {
|
|||||||
* Override onInitMetricsPanelEditMode() method from MetricsPanelCtrl.
|
* Override onInitMetricsPanelEditMode() method from MetricsPanelCtrl.
|
||||||
* We don't need metric editor from Metrics Panel.
|
* We don't need metric editor from Metrics Panel.
|
||||||
*/
|
*/
|
||||||
onInitMetricsPanelEditMode() {
|
onInitEditMode() {
|
||||||
this.addEditorTab('Options', triggerPanelEditor, 2);
|
this.addEditorTab('Options', triggerPanelEditor, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
refresh() {
|
|
||||||
this.onMetricsPanelRefresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
onMetricsPanelRefresh() {
|
onMetricsPanelRefresh() {
|
||||||
// ignore fetching data if another panel is in fullscreen
|
// ignore fetching data if another panel is in fullscreen
|
||||||
if (this.otherPanelInFullscreenMode()) { return; }
|
if (this.otherPanelInFullscreenMode()) { return; }
|
||||||
@@ -103,20 +104,34 @@ class TriggerPanelCtrl extends MetricsPanelCtrl {
|
|||||||
this.refreshData();
|
this.refreshData();
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshData() {
|
onRender() {
|
||||||
// clear loading/error state
|
// clear loading/error state
|
||||||
delete this.error;
|
delete this.error;
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
this.setTimeQueryStart();
|
|
||||||
|
|
||||||
var self = this;
|
return this.refreshData()
|
||||||
|
.then(triggerList => {
|
||||||
|
// Limit triggers number
|
||||||
|
this.triggerList = triggerList.slice(0, this.panel.limit);
|
||||||
|
|
||||||
// Load datasource
|
// Notify panel that request is finished
|
||||||
|
this.loading = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
refreshData() {
|
||||||
|
return this.getTriggers()
|
||||||
|
.then(this.getAcknowledges.bind(this))
|
||||||
|
.then(this.filterTriggers.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
getTriggers() {
|
||||||
return this.datasourceSrv.get(this.panel.datasource)
|
return this.datasourceSrv.get(this.panel.datasource)
|
||||||
.then(datasource => {
|
.then(datasource => {
|
||||||
var zabbix = datasource.zabbix;
|
var zabbix = datasource.zabbix;
|
||||||
var showEvents = self.panel.showEvents.value;
|
this.zabbix = zabbix;
|
||||||
var triggerFilter = self.panel.triggers;
|
var showEvents = this.panel.showEvents.value;
|
||||||
|
var triggerFilter = this.panel.triggers;
|
||||||
|
|
||||||
// Replace template variables
|
// Replace template variables
|
||||||
var groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter);
|
var groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter);
|
||||||
@@ -125,117 +140,115 @@ class TriggerPanelCtrl extends MetricsPanelCtrl {
|
|||||||
|
|
||||||
var getTriggers = zabbix.getTriggers(groupFilter, hostFilter, appFilter, showEvents);
|
var getTriggers = zabbix.getTriggers(groupFilter, hostFilter, appFilter, showEvents);
|
||||||
return getTriggers.then(triggers => {
|
return getTriggers.then(triggers => {
|
||||||
return _.map(triggers, trigger => {
|
return _.map(triggers, this.formatTrigger.bind(this));
|
||||||
let triggerObj = trigger;
|
|
||||||
|
|
||||||
// Format last change and age
|
|
||||||
trigger.lastchangeUnix = Number(trigger.lastchange);
|
|
||||||
let timestamp = moment.unix(trigger.lastchangeUnix);
|
|
||||||
if (self.panel.customLastChangeFormat) {
|
|
||||||
// User defined format
|
|
||||||
triggerObj.lastchange = timestamp.format(self.panel.lastChangeFormat);
|
|
||||||
} else {
|
|
||||||
triggerObj.lastchange = timestamp.format(self.defaultTimeFormat);
|
|
||||||
}
|
|
||||||
triggerObj.age = timestamp.fromNow(true);
|
|
||||||
|
|
||||||
// Set host that the trigger belongs
|
|
||||||
if (trigger.hosts.length) {
|
|
||||||
triggerObj.host = trigger.hosts[0].name;
|
|
||||||
triggerObj.hostTechName = trigger.hosts[0].host;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set color
|
|
||||||
if (trigger.value === '1') {
|
|
||||||
// Problem state
|
|
||||||
triggerObj.color = self.panel.triggerSeverity[trigger.priority].color;
|
|
||||||
} else {
|
|
||||||
// OK state
|
|
||||||
triggerObj.color = self.panel.okEventColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
triggerObj.severity = self.panel.triggerSeverity[trigger.priority].severity;
|
|
||||||
return triggerObj;
|
|
||||||
});
|
|
||||||
})
|
|
||||||
.then(triggerList => {
|
|
||||||
|
|
||||||
// Request acknowledges for trigger
|
|
||||||
var eventids = _.map(triggerList, trigger => {
|
|
||||||
return trigger.lastEvent.eventid;
|
|
||||||
});
|
|
||||||
|
|
||||||
return zabbix.getAcknowledges(eventids)
|
|
||||||
.then(events => {
|
|
||||||
|
|
||||||
// Map events to triggers
|
|
||||||
_.each(triggerList, trigger => {
|
|
||||||
var event = _.find(events, event => {
|
|
||||||
return event.eventid === trigger.lastEvent.eventid;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (event) {
|
|
||||||
trigger.acknowledges = _.map(event.acknowledges, ack => {
|
|
||||||
let timestamp = moment.unix(ack.clock);
|
|
||||||
if (self.panel.customLastChangeFormat) {
|
|
||||||
ack.time = timestamp.format(self.panel.lastChangeFormat);
|
|
||||||
} else {
|
|
||||||
ack.time = timestamp.format(self.defaultTimeFormat);
|
|
||||||
}
|
|
||||||
ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')';
|
|
||||||
return ack;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Mark acknowledged triggers with different color
|
|
||||||
if (self.panel.markAckEvents && trigger.acknowledges.length) {
|
|
||||||
trigger.color = self.panel.ackEventColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Filter triggers by description
|
|
||||||
var triggerFilter = self.panel.triggers.trigger.filter;
|
|
||||||
if (triggerFilter) {
|
|
||||||
triggerList = filterTriggers(triggerList, triggerFilter);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Filter acknowledged triggers
|
|
||||||
if (self.panel.showTriggers === 'unacknowledged') {
|
|
||||||
triggerList = _.filter(triggerList, trigger => {
|
|
||||||
return !trigger.acknowledges;
|
|
||||||
});
|
|
||||||
} else if (self.panel.showTriggers === 'acknowledged') {
|
|
||||||
triggerList = _.filter(triggerList, 'acknowledges');
|
|
||||||
} else {
|
|
||||||
triggerList = triggerList;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Filter triggers by severity
|
|
||||||
triggerList = _.filter(triggerList, trigger => {
|
|
||||||
return self.panel.triggerSeverity[trigger.priority].show;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Sort triggers
|
|
||||||
if (self.panel.sortTriggersBy.value === 'priority') {
|
|
||||||
triggerList = _.sortBy(triggerList, 'priority').reverse();
|
|
||||||
} else {
|
|
||||||
triggerList = _.sortBy(triggerList, 'lastchangeUnix').reverse();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Limit triggers number
|
|
||||||
self.triggerList = triggerList.slice(0, self.panel.limit);
|
|
||||||
|
|
||||||
// Notify panel that request is finished
|
|
||||||
self.setTimeQueryEnd();
|
|
||||||
self.loading = false;
|
|
||||||
|
|
||||||
this.panel.triggerList = this.triggerList;
|
|
||||||
this.render();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getAcknowledges(triggerList) {
|
||||||
|
// Request acknowledges for trigger
|
||||||
|
var eventids = _.map(triggerList, trigger => {
|
||||||
|
return trigger.lastEvent.eventid;
|
||||||
|
});
|
||||||
|
|
||||||
|
return this.zabbix.getAcknowledges(eventids)
|
||||||
|
.then(events => {
|
||||||
|
|
||||||
|
// Map events to triggers
|
||||||
|
_.each(triggerList, trigger => {
|
||||||
|
var event = _.find(events, event => {
|
||||||
|
return event.eventid === trigger.lastEvent.eventid;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (event) {
|
||||||
|
trigger.acknowledges = _.map(event.acknowledges, ack => {
|
||||||
|
let timestamp = moment.unix(ack.clock);
|
||||||
|
if (this.panel.customLastChangeFormat) {
|
||||||
|
ack.time = timestamp.format(this.panel.lastChangeFormat);
|
||||||
|
} else {
|
||||||
|
ack.time = timestamp.format(this.defaultTimeFormat);
|
||||||
|
}
|
||||||
|
ack.user = ack.alias + ' (' + ack.name + ' ' + ack.surname + ')';
|
||||||
|
return ack;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Mark acknowledged triggers with different color
|
||||||
|
if (this.panel.markAckEvents && trigger.acknowledges.length) {
|
||||||
|
trigger.color = this.panel.ackEventColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return triggerList;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
filterTriggers(triggerList) {
|
||||||
|
// Filter triggers by description
|
||||||
|
var triggerFilter = this.panel.triggers.trigger.filter;
|
||||||
|
if (triggerFilter) {
|
||||||
|
triggerList = filterTriggers(triggerList, triggerFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter acknowledged triggers
|
||||||
|
if (this.panel.showTriggers === 'unacknowledged') {
|
||||||
|
triggerList = _.filter(triggerList, trigger => {
|
||||||
|
return !trigger.acknowledges;
|
||||||
|
});
|
||||||
|
} else if (this.panel.showTriggers === 'acknowledged') {
|
||||||
|
triggerList = _.filter(triggerList, 'acknowledges');
|
||||||
|
} else {
|
||||||
|
triggerList = triggerList;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter triggers by severity
|
||||||
|
triggerList = _.filter(triggerList, trigger => {
|
||||||
|
return this.panel.triggerSeverity[trigger.priority].show;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Sort triggers
|
||||||
|
if (this.panel.sortTriggersBy.value === 'priority') {
|
||||||
|
triggerList = _.sortBy(triggerList, 'priority').reverse();
|
||||||
|
} else {
|
||||||
|
triggerList = _.sortBy(triggerList, 'lastchangeUnix').reverse();
|
||||||
|
}
|
||||||
|
|
||||||
|
return triggerList;
|
||||||
|
}
|
||||||
|
|
||||||
|
formatTrigger(trigger) {
|
||||||
|
let triggerObj = trigger;
|
||||||
|
|
||||||
|
// Format last change and age
|
||||||
|
trigger.lastchangeUnix = Number(trigger.lastchange);
|
||||||
|
let timestamp = moment.unix(trigger.lastchangeUnix);
|
||||||
|
if (this.panel.customLastChangeFormat) {
|
||||||
|
// User defined format
|
||||||
|
triggerObj.lastchange = timestamp.format(this.panel.lastChangeFormat);
|
||||||
|
} else {
|
||||||
|
triggerObj.lastchange = timestamp.format(this.defaultTimeFormat);
|
||||||
|
}
|
||||||
|
triggerObj.age = timestamp.fromNow(true);
|
||||||
|
|
||||||
|
// Set host that the trigger belongs
|
||||||
|
if (trigger.hosts.length) {
|
||||||
|
triggerObj.host = trigger.hosts[0].name;
|
||||||
|
triggerObj.hostTechName = trigger.hosts[0].host;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set color
|
||||||
|
if (trigger.value === '1') {
|
||||||
|
// Problem state
|
||||||
|
triggerObj.color = this.panel.triggerSeverity[trigger.priority].color;
|
||||||
|
} else {
|
||||||
|
// OK state
|
||||||
|
triggerObj.color = this.panel.okEventColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
triggerObj.severity = this.panel.triggerSeverity[trigger.priority].severity;
|
||||||
|
return triggerObj;
|
||||||
|
}
|
||||||
|
|
||||||
switchComment(trigger) {
|
switchComment(trigger) {
|
||||||
trigger.showComment = !trigger.showComment;
|
trigger.showComment = !trigger.showComment;
|
||||||
}
|
}
|
||||||
@@ -254,10 +267,6 @@ class TriggerPanelCtrl extends MetricsPanelCtrl {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
|
||||||
return super.render(this.triggerList);
|
|
||||||
}
|
|
||||||
|
|
||||||
link(scope, elem, attrs, ctrl) {
|
link(scope, elem, attrs, ctrl) {
|
||||||
var data;
|
var data;
|
||||||
var panel = ctrl.panel;
|
var panel = ctrl.panel;
|
||||||
|
|||||||
Reference in New Issue
Block a user