@@ -630,11 +630,10 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
|
|||||||
return responseHandler.handleTriggersResponse(alerts, groups, timeRange, target);
|
return responseHandler.handleTriggersResponse(alerts, groups, timeRange, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
queryProblems(target: ZabbixMetricsQuery, timeRange, options) {
|
async queryProblems(target: ZabbixMetricsQuery, timeRange, options) {
|
||||||
const [timeFrom, timeTo] = timeRange;
|
const [timeFrom, timeTo] = timeRange;
|
||||||
const userIsEditor = contextSrv.isEditor || contextSrv.isGrafanaAdmin;
|
const userIsEditor = contextSrv.isEditor || contextSrv.isGrafanaAdmin;
|
||||||
|
|
||||||
let proxies;
|
|
||||||
let showAckButton = true;
|
let showAckButton = true;
|
||||||
|
|
||||||
const showProblems = target.showProblems || ShowProblemTypes.Problems;
|
const showProblems = target.showProblems || ShowProblemTypes.Problems;
|
||||||
@@ -703,9 +702,13 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
|
|||||||
} else {
|
} else {
|
||||||
getProblemsPromise = this.zabbix.getProblems(groupFilter, hostFilter, appFilter, proxyFilter, problemsOptions);
|
getProblemsPromise = this.zabbix.getProblems(groupFilter, hostFilter, appFilter, proxyFilter, problemsOptions);
|
||||||
}
|
}
|
||||||
|
const getUsersPromise = this.zabbix.getUsers();
|
||||||
|
|
||||||
const problemsPromises = Promise.all([getProblemsPromise, getProxiesPromise])
|
let proxies;
|
||||||
.then(([problems, sourceProxies]) => {
|
let zabbixUsers;
|
||||||
|
const problemsPromises = Promise.all([getProblemsPromise, getProxiesPromise, getUsersPromise])
|
||||||
|
.then(([problems, sourceProxies, users]) => {
|
||||||
|
zabbixUsers = _.keyBy(users, 'userid');
|
||||||
proxies = _.keyBy(sourceProxies, 'proxyid');
|
proxies = _.keyBy(sourceProxies, 'proxyid');
|
||||||
return problems;
|
return problems;
|
||||||
})
|
})
|
||||||
@@ -714,6 +717,7 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
|
|||||||
.then((problems) => problemsHandler.filterTriggersPre(problems, replacedTarget))
|
.then((problems) => problemsHandler.filterTriggersPre(problems, replacedTarget))
|
||||||
.then((problems) => problemsHandler.sortProblems(problems, target))
|
.then((problems) => problemsHandler.sortProblems(problems, target))
|
||||||
.then((problems) => problemsHandler.addTriggerDataSource(problems, target))
|
.then((problems) => problemsHandler.addTriggerDataSource(problems, target))
|
||||||
|
.then((problems) => problemsHandler.formatAcknowledges(problems, zabbixUsers))
|
||||||
.then((problems) => problemsHandler.addTriggerHostProxy(problems, proxies));
|
.then((problems) => problemsHandler.addTriggerHostProxy(problems, proxies));
|
||||||
|
|
||||||
return problemsPromises.then((problems) => {
|
return problemsPromises.then((problems) => {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import * as utils from './utils';
|
import * as utils from './utils';
|
||||||
import { DataFrame, Field, FieldType, ArrayVector } from '@grafana/data';
|
import { DataFrame, Field, FieldType, ArrayVector, dateTime } from '@grafana/data';
|
||||||
import { ZBXProblem, ZBXTrigger, ProblemDTO, ZBXEvent, ZabbixMetricsQuery } from './types';
|
import { ZBXProblem, ZBXTrigger, ProblemDTO, ZBXEvent, ZabbixMetricsQuery } from './types';
|
||||||
|
|
||||||
export function joinTriggersWithProblems(problems: ZBXProblem[], triggers: ZBXTrigger[]): ProblemDTO[] {
|
export function joinTriggersWithProblems(problems: ZBXProblem[], triggers: ZBXTrigger[]): ProblemDTO[] {
|
||||||
@@ -136,6 +136,37 @@ export function addTriggerHostProxy(triggers, proxies) {
|
|||||||
return triggers;
|
return triggers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function formatAcknowledges(triggers, users) {
|
||||||
|
if (!users) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
triggers.forEach((trigger) => {
|
||||||
|
if (trigger.acknowledges?.length) {
|
||||||
|
for (let i = 0; i < trigger.acknowledges.length; i++) {
|
||||||
|
const ack = trigger.acknowledges[i];
|
||||||
|
let userData = users[ack.userid];
|
||||||
|
|
||||||
|
// User with id 1 is Admin
|
||||||
|
if (!userData && ack.userid === '1') {
|
||||||
|
userData = {
|
||||||
|
username: 'Admin',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ack['user'] = userData?.username || '';
|
||||||
|
ack['name'] = userData?.name || '';
|
||||||
|
ack['surname'] = userData?.surname || '';
|
||||||
|
|
||||||
|
const ts = Number(ack.clock) * 1000;
|
||||||
|
if (!isNaN(ts)) {
|
||||||
|
ack['time'] = dateTime(ts).format('YYYY-MM-DD HH:mm:ss');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return triggers;
|
||||||
|
}
|
||||||
|
|
||||||
export function filterTriggersPre(triggerList, replacedTarget) {
|
export function filterTriggersPre(triggerList, replacedTarget) {
|
||||||
// Filter triggers by description
|
// Filter triggers by description
|
||||||
const triggerFilter = replacedTarget.trigger.filter;
|
const triggerFilter = replacedTarget.trigger.filter;
|
||||||
@@ -197,6 +228,7 @@ export function toDataFrame(problems: any[], query: ZabbixMetricsQuery): DataFra
|
|||||||
const problemsHandler = {
|
const problemsHandler = {
|
||||||
addTriggerDataSource,
|
addTriggerDataSource,
|
||||||
addTriggerHostProxy,
|
addTriggerHostProxy,
|
||||||
|
formatAcknowledges,
|
||||||
setMaintenanceStatus,
|
setMaintenanceStatus,
|
||||||
setAckButtonStatus,
|
setAckButtonStatus,
|
||||||
filterTriggersPre,
|
filterTriggersPre,
|
||||||
|
|||||||
@@ -875,6 +875,14 @@ export class ZabbixAPIConnector {
|
|||||||
|
|
||||||
return this.request('valuemap.get', params);
|
return this.request('valuemap.get', params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getUsers() {
|
||||||
|
const params = {
|
||||||
|
output: ['userid', 'username', 'name', 'surname'],
|
||||||
|
};
|
||||||
|
|
||||||
|
return this.request('user.get', params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function filterTriggersByAcknowledge(triggers, acknowledged) {
|
function filterTriggersByAcknowledge(triggers, acknowledged) {
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ const REQUESTS_TO_PROXYFY = [
|
|||||||
'getScripts',
|
'getScripts',
|
||||||
'getValueMappings',
|
'getValueMappings',
|
||||||
'getSLAList',
|
'getSLAList',
|
||||||
|
'getUsers',
|
||||||
];
|
];
|
||||||
|
|
||||||
const REQUESTS_TO_CACHE = [
|
const REQUESTS_TO_CACHE = [
|
||||||
@@ -61,6 +62,7 @@ const REQUESTS_TO_CACHE = [
|
|||||||
'getProxies',
|
'getProxies',
|
||||||
'getValueMappings',
|
'getValueMappings',
|
||||||
'getSLAList',
|
'getSLAList',
|
||||||
|
'getUsers',
|
||||||
];
|
];
|
||||||
|
|
||||||
const REQUESTS_TO_BIND = [
|
const REQUESTS_TO_BIND = [
|
||||||
@@ -84,6 +86,7 @@ const REQUESTS_TO_BIND = [
|
|||||||
'executeScript',
|
'executeScript',
|
||||||
'getValueMappings',
|
'getValueMappings',
|
||||||
'getSLAList',
|
'getSLAList',
|
||||||
|
'getUsers',
|
||||||
];
|
];
|
||||||
|
|
||||||
export class Zabbix implements ZabbixConnector {
|
export class Zabbix implements ZabbixConnector {
|
||||||
@@ -113,6 +116,7 @@ export class Zabbix implements ZabbixConnector {
|
|||||||
getUserMacros: (hostmacroids) => Promise<any>;
|
getUserMacros: (hostmacroids) => Promise<any>;
|
||||||
getValueMappings: () => Promise<any>;
|
getValueMappings: () => Promise<any>;
|
||||||
getSLAList: () => Promise<any>;
|
getSLAList: () => Promise<any>;
|
||||||
|
getUsers: () => Promise<any>;
|
||||||
|
|
||||||
constructor(options) {
|
constructor(options) {
|
||||||
const {
|
const {
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export default function AcknowledgesList(props: AcknowledgesListProps) {
|
|||||||
<div className="problem-ack-col problem-ack-user">
|
<div className="problem-ack-col problem-ack-user">
|
||||||
{acknowledges.map((ack) => (
|
{acknowledges.map((ack) => (
|
||||||
<span key={ack.acknowledgeid} className="problem-ack-user">
|
<span key={ack.acknowledgeid} className="problem-ack-user">
|
||||||
{ack.user}
|
{formatUserName(ack)}
|
||||||
</span>
|
</span>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
@@ -33,3 +33,11 @@ export default function AcknowledgesList(props: AcknowledgesListProps) {
|
|||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function formatUserName(ack: ZBXAcknowledge): string {
|
||||||
|
if (!ack.name && !ack.surname) {
|
||||||
|
return ack.user;
|
||||||
|
} else {
|
||||||
|
return `${ack.name} ${ack.surname}`.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user