From f7150f9281fac9f941d635b58daae2aa388819a8 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Tue, 21 Mar 2023 14:00:17 +0100 Subject: [PATCH] Show acknowledge author, fixes #1281 Also fix displaying time --- src/datasource/datasource.ts | 12 ++++--- src/datasource/problemsHandler.ts | 34 ++++++++++++++++++- .../zabbix_api/zabbixAPIConnector.ts | 8 +++++ src/datasource/zabbix/zabbix.ts | 4 +++ .../components/Problems/AcknowledgesList.tsx | 10 +++++- 5 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/datasource/datasource.ts b/src/datasource/datasource.ts index d0eff6b..35a4ab2 100644 --- a/src/datasource/datasource.ts +++ b/src/datasource/datasource.ts @@ -630,11 +630,10 @@ export class ZabbixDatasource extends DataSourceApi { + let proxies; + let zabbixUsers; + const problemsPromises = Promise.all([getProblemsPromise, getProxiesPromise, getUsersPromise]) + .then(([problems, sourceProxies, users]) => { + zabbixUsers = _.keyBy(users, 'userid'); proxies = _.keyBy(sourceProxies, 'proxyid'); return problems; }) @@ -714,6 +717,7 @@ export class ZabbixDatasource extends DataSourceApi problemsHandler.filterTriggersPre(problems, replacedTarget)) .then((problems) => problemsHandler.sortProblems(problems, target)) .then((problems) => problemsHandler.addTriggerDataSource(problems, target)) + .then((problems) => problemsHandler.formatAcknowledges(problems, zabbixUsers)) .then((problems) => problemsHandler.addTriggerHostProxy(problems, proxies)); return problemsPromises.then((problems) => { diff --git a/src/datasource/problemsHandler.ts b/src/datasource/problemsHandler.ts index 1a5d4af..e284486 100644 --- a/src/datasource/problemsHandler.ts +++ b/src/datasource/problemsHandler.ts @@ -1,6 +1,6 @@ import _ from 'lodash'; 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'; export function joinTriggersWithProblems(problems: ZBXProblem[], triggers: ZBXTrigger[]): ProblemDTO[] { @@ -136,6 +136,37 @@ export function addTriggerHostProxy(triggers, proxies) { 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) { // Filter triggers by description const triggerFilter = replacedTarget.trigger.filter; @@ -197,6 +228,7 @@ export function toDataFrame(problems: any[], query: ZabbixMetricsQuery): DataFra const problemsHandler = { addTriggerDataSource, addTriggerHostProxy, + formatAcknowledges, setMaintenanceStatus, setAckButtonStatus, filterTriggersPre, diff --git a/src/datasource/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts b/src/datasource/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts index 4bc7ed4..4c7fff7 100644 --- a/src/datasource/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts +++ b/src/datasource/zabbix/connectors/zabbix_api/zabbixAPIConnector.ts @@ -875,6 +875,14 @@ export class ZabbixAPIConnector { return this.request('valuemap.get', params); } + + getUsers() { + const params = { + output: ['userid', 'username', 'name', 'surname'], + }; + + return this.request('user.get', params); + } } function filterTriggersByAcknowledge(triggers, acknowledged) { diff --git a/src/datasource/zabbix/zabbix.ts b/src/datasource/zabbix/zabbix.ts index 46c6160..f3483e1 100644 --- a/src/datasource/zabbix/zabbix.ts +++ b/src/datasource/zabbix/zabbix.ts @@ -47,6 +47,7 @@ const REQUESTS_TO_PROXYFY = [ 'getScripts', 'getValueMappings', 'getSLAList', + 'getUsers', ]; const REQUESTS_TO_CACHE = [ @@ -61,6 +62,7 @@ const REQUESTS_TO_CACHE = [ 'getProxies', 'getValueMappings', 'getSLAList', + 'getUsers', ]; const REQUESTS_TO_BIND = [ @@ -84,6 +86,7 @@ const REQUESTS_TO_BIND = [ 'executeScript', 'getValueMappings', 'getSLAList', + 'getUsers', ]; export class Zabbix implements ZabbixConnector { @@ -113,6 +116,7 @@ export class Zabbix implements ZabbixConnector { getUserMacros: (hostmacroids) => Promise; getValueMappings: () => Promise; getSLAList: () => Promise; + getUsers: () => Promise; constructor(options) { const { diff --git a/src/panel-triggers/components/Problems/AcknowledgesList.tsx b/src/panel-triggers/components/Problems/AcknowledgesList.tsx index d0c1ecf..1c75fb1 100644 --- a/src/panel-triggers/components/Problems/AcknowledgesList.tsx +++ b/src/panel-triggers/components/Problems/AcknowledgesList.tsx @@ -19,7 +19,7 @@ export default function AcknowledgesList(props: AcknowledgesListProps) {
{acknowledges.map((ack) => ( - {ack.user} + {formatUserName(ack)} ))}
@@ -33,3 +33,11 @@ export default function AcknowledgesList(props: AcknowledgesListProps) { ); } + +function formatUserName(ack: ZBXAcknowledge): string { + if (!ack.name && !ack.surname) { + return ack.user; + } else { + return `${ack.name} ${ack.surname}`.trim(); + } +}