@@ -630,11 +630,10 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
|
||||
return responseHandler.handleTriggersResponse(alerts, groups, timeRange, target);
|
||||
}
|
||||
|
||||
queryProblems(target: ZabbixMetricsQuery, timeRange, options) {
|
||||
async queryProblems(target: ZabbixMetricsQuery, timeRange, options) {
|
||||
const [timeFrom, timeTo] = timeRange;
|
||||
const userIsEditor = contextSrv.isEditor || contextSrv.isGrafanaAdmin;
|
||||
|
||||
let proxies;
|
||||
let showAckButton = true;
|
||||
|
||||
const showProblems = target.showProblems || ShowProblemTypes.Problems;
|
||||
@@ -703,9 +702,13 @@ export class ZabbixDatasource extends DataSourceApi<ZabbixMetricsQuery, ZabbixDS
|
||||
} else {
|
||||
getProblemsPromise = this.zabbix.getProblems(groupFilter, hostFilter, appFilter, proxyFilter, problemsOptions);
|
||||
}
|
||||
const getUsersPromise = this.zabbix.getUsers();
|
||||
|
||||
const problemsPromises = Promise.all([getProblemsPromise, getProxiesPromise])
|
||||
.then(([problems, sourceProxies]) => {
|
||||
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<ZabbixMetricsQuery, ZabbixDS
|
||||
.then((problems) => 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) => {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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<any>;
|
||||
getValueMappings: () => Promise<any>;
|
||||
getSLAList: () => Promise<any>;
|
||||
getUsers: () => Promise<any>;
|
||||
|
||||
constructor(options) {
|
||||
const {
|
||||
|
||||
@@ -19,7 +19,7 @@ export default function AcknowledgesList(props: AcknowledgesListProps) {
|
||||
<div className="problem-ack-col problem-ack-user">
|
||||
{acknowledges.map((ack) => (
|
||||
<span key={ack.acknowledgeid} className="problem-ack-user">
|
||||
{ack.user}
|
||||
{formatUserName(ack)}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
@@ -33,3 +33,11 @@ export default function AcknowledgesList(props: AcknowledgesListProps) {
|
||||
</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