Show acknowledge author, fixes #1281

Also fix displaying time
This commit is contained in:
Alexander Zobnin
2023-03-21 14:00:17 +01:00
parent f1c3c57c9f
commit f7150f9281
5 changed files with 62 additions and 6 deletions

View File

@@ -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) => {

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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 {

View File

@@ -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();
}
}