Problems: use datasource query
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import ReactDOM from 'react-dom';
|
import ReactDOM from 'react-dom';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import moment from 'moment';
|
|
||||||
import { getDataSourceSrv } from '@grafana/runtime';
|
import { getDataSourceSrv } from '@grafana/runtime';
|
||||||
import * as dateMath from 'grafana/app/core/utils/datemath';
|
import * as dateMath from 'grafana/app/core/utils/datemath';
|
||||||
import * as utils from '../datasource-zabbix/utils';
|
import * as utils from '../datasource-zabbix/utils';
|
||||||
@@ -245,136 +244,32 @@ export class TriggerPanelCtrl extends PanelCtrl {
|
|||||||
getTriggers() {
|
getTriggers() {
|
||||||
const timeFrom = Math.ceil(dateMath.parse(this.range.from) / 1000);
|
const timeFrom = Math.ceil(dateMath.parse(this.range.from) / 1000);
|
||||||
const timeTo = Math.ceil(dateMath.parse(this.range.to) / 1000);
|
const timeTo = Math.ceil(dateMath.parse(this.range.to) / 1000);
|
||||||
const userIsEditor = this.contextSrv.isEditor || this.contextSrv.isGrafanaAdmin;
|
const timeRange = [timeFrom, timeTo];
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
scopedVars: this.panel.scopedVars
|
||||||
|
};
|
||||||
|
|
||||||
let promises = _.map(this.panel.targets, (target) => {
|
let promises = _.map(this.panel.targets, (target) => {
|
||||||
const ds = target.datasource;
|
const ds = target.datasource;
|
||||||
let proxies;
|
|
||||||
let showAckButton = true;
|
|
||||||
return getDataSourceSrv().get(ds)
|
return getDataSourceSrv().get(ds)
|
||||||
.then(datasource => {
|
.then(datasource => {
|
||||||
const zabbix = datasource.zabbix;
|
return datasource.queryProblems(target, timeRange, options);
|
||||||
const showEvents = this.panel.showEvents.value;
|
})
|
||||||
const triggerFilter = target;
|
.then(results => {
|
||||||
const showProxy = this.panel.hostProxy;
|
let problems = [];
|
||||||
const getProxiesPromise = showProxy ? zabbix.getProxies() : () => [];
|
if (results && results.fields && results.fields.length) {
|
||||||
showAckButton = !datasource.disableReadOnlyUsersAck || userIsEditor;
|
try {
|
||||||
|
problems = results.fields[0].values.toArray();
|
||||||
// Replace template variables
|
} catch (error) {
|
||||||
const groupFilter = datasource.replaceTemplateVars(triggerFilter.group.filter, this.panel.scopedVars);
|
console.log(error);
|
||||||
const hostFilter = datasource.replaceTemplateVars(triggerFilter.host.filter, this.panel.scopedVars);
|
}
|
||||||
const appFilter = datasource.replaceTemplateVars(triggerFilter.application.filter, this.panel.scopedVars);
|
|
||||||
const proxyFilter = datasource.replaceTemplateVars(triggerFilter.proxy.filter, this.panel.scopedVars);
|
|
||||||
|
|
||||||
let triggersOptions = {
|
|
||||||
showTriggers: showEvents
|
|
||||||
};
|
|
||||||
|
|
||||||
if (showEvents !== 1) {
|
|
||||||
triggersOptions.timeFrom = timeFrom;
|
|
||||||
triggersOptions.timeTo = timeTo;
|
|
||||||
}
|
}
|
||||||
|
return problems;
|
||||||
return Promise.all([
|
});
|
||||||
zabbix.getTriggers(groupFilter, hostFilter, appFilter, triggersOptions, proxyFilter),
|
|
||||||
getProxiesPromise
|
|
||||||
]);
|
|
||||||
}).then(([triggers, sourceProxies]) => {
|
|
||||||
proxies = _.keyBy(sourceProxies, 'proxyid');
|
|
||||||
const eventids = _.compact(triggers.map(trigger => {
|
|
||||||
return trigger.lastEvent.eventid;
|
|
||||||
}));
|
|
||||||
return Promise.all([
|
|
||||||
this.datasources[ds].zabbix.getExtendedEventData(eventids),
|
|
||||||
Promise.resolve(triggers)
|
|
||||||
]);
|
|
||||||
})
|
|
||||||
.then(([events, triggers]) => {
|
|
||||||
this.addEventTags(events, triggers);
|
|
||||||
this.addAcknowledges(events, triggers);
|
|
||||||
return triggers;
|
|
||||||
})
|
|
||||||
.then(triggers => this.setMaintenanceStatus(triggers))
|
|
||||||
.then(triggers => this.setAckButtonStatus(triggers, showAckButton))
|
|
||||||
.then(triggers => this.filterTriggersPre(triggers, target))
|
|
||||||
.then(triggers => this.addTriggerDataSource(triggers, target))
|
|
||||||
.then(triggers => this.addTriggerHostProxy(triggers, proxies));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return Promise.all(promises)
|
return Promise.all(promises).then(_.flatten);
|
||||||
.then(results => _.flatten(results));
|
|
||||||
}
|
|
||||||
|
|
||||||
addAcknowledges(events, triggers) {
|
|
||||||
// Map events to triggers
|
|
||||||
_.each(triggers, trigger => {
|
|
||||||
var event = _.find(events, event => {
|
|
||||||
return event.eventid === trigger.lastEvent.eventid;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (event) {
|
|
||||||
trigger.acknowledges = _.map(event.acknowledges, this.formatAcknowledge.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!trigger.lastEvent.eventid) {
|
|
||||||
trigger.lastEvent = null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return triggers;
|
|
||||||
}
|
|
||||||
|
|
||||||
formatAcknowledge(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 || '';
|
|
||||||
if (ack.name || ack.surname) {
|
|
||||||
const fullName = `${ack.name || ''} ${ack.surname || ''}`;
|
|
||||||
ack.user += ` (${fullName})`;
|
|
||||||
}
|
|
||||||
return ack;
|
|
||||||
}
|
|
||||||
|
|
||||||
addEventTags(events, triggers) {
|
|
||||||
_.each(triggers, trigger => {
|
|
||||||
var event = _.find(events, event => {
|
|
||||||
return event.eventid === trigger.lastEvent.eventid;
|
|
||||||
});
|
|
||||||
if (event && event.tags && event.tags.length) {
|
|
||||||
trigger.tags = event.tags;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return triggers;
|
|
||||||
}
|
|
||||||
|
|
||||||
filterTriggersPre(triggerList, target) {
|
|
||||||
// Filter triggers by description
|
|
||||||
const ds = target.datasource;
|
|
||||||
let triggerFilter = target.trigger.filter;
|
|
||||||
triggerFilter = this.datasources[ds].replaceTemplateVars(triggerFilter);
|
|
||||||
if (triggerFilter) {
|
|
||||||
triggerList = filterTriggers(triggerList, triggerFilter);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Filter by tags
|
|
||||||
// const target = this.panel.targets[ds];
|
|
||||||
if (target.tags.filter) {
|
|
||||||
let tagsFilter = this.datasources[ds].replaceTemplateVars(target.tags.filter);
|
|
||||||
// replaceTemplateVars() builds regex-like string, so we should trim it.
|
|
||||||
tagsFilter = tagsFilter.replace('/^', '').replace('$/', '');
|
|
||||||
const tags = this.parseTags(tagsFilter);
|
|
||||||
triggerList = _.filter(triggerList, trigger => {
|
|
||||||
return _.every(tags, (tag) => {
|
|
||||||
return _.find(trigger.tags, {tag: tag.tag, value: tag.value});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return triggerList;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
filterTriggersPost(triggers) {
|
filterTriggersPost(triggers) {
|
||||||
@@ -408,41 +303,6 @@ export class TriggerPanelCtrl extends PanelCtrl {
|
|||||||
return triggerList;
|
return triggerList;
|
||||||
}
|
}
|
||||||
|
|
||||||
setMaintenanceStatus(triggers) {
|
|
||||||
_.each(triggers, (trigger) => {
|
|
||||||
let maintenance_status = _.some(trigger.hosts, (host) => host.maintenance_status === '1');
|
|
||||||
trigger.maintenance = maintenance_status;
|
|
||||||
});
|
|
||||||
return triggers;
|
|
||||||
}
|
|
||||||
|
|
||||||
setAckButtonStatus(triggers, showAckButton) {
|
|
||||||
_.each(triggers, (trigger) => {
|
|
||||||
trigger.showAckButton = showAckButton;
|
|
||||||
});
|
|
||||||
return triggers;
|
|
||||||
}
|
|
||||||
|
|
||||||
addTriggerDataSource(triggers, target) {
|
|
||||||
_.each(triggers, (trigger) => {
|
|
||||||
trigger.datasource = target.datasource;
|
|
||||||
});
|
|
||||||
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) {
|
sortTriggers(triggerList) {
|
||||||
if (this.panel.sortTriggersBy.value === 'priority') {
|
if (this.panel.sortTriggersBy.value === 'priority') {
|
||||||
triggerList = _.orderBy(triggerList, ['priority', 'lastchangeUnix', 'triggerid'], ['desc', 'desc', 'desc']);
|
triggerList = _.orderBy(triggerList, ['priority', 'lastchangeUnix', 'triggerid'], ['desc', 'desc', 'desc']);
|
||||||
@@ -721,15 +581,3 @@ export class TriggerPanelCtrl extends PanelCtrl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TriggerPanelCtrl.templateUrl = 'public/plugins/alexanderzobnin-zabbix-app/panel-triggers/partials/module.html';
|
TriggerPanelCtrl.templateUrl = 'public/plugins/alexanderzobnin-zabbix-app/panel-triggers/partials/module.html';
|
||||||
|
|
||||||
function filterTriggers(triggers, triggerFilter) {
|
|
||||||
if (utils.isRegex(triggerFilter)) {
|
|
||||||
return _.filter(triggers, function(trigger) {
|
|
||||||
return utils.buildRegex(triggerFilter).test(trigger.description);
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
return _.filter(triggers, function(trigger) {
|
|
||||||
return trigger.description === triggerFilter;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user