Problems count mode (#1493)

* Problems count mode

* Use tooltip from grafana ui

* Add editors for new modes

* Fix macro mode

* Fix bugs

* Unify editors to use one Triggers editor for all count queries

* Use time range toggle for triggers query, #918

* Add item tags suport for triggers count mode

* Fix triggers count by items

* Use data frames for triggers data, #1441

* Return empty result if no items found

* Add migration for problems count mode

* bump version to 4.3.0-pre

* Add zip task to makefile

* Add schema to query model

* Minor refactor

* Refactor: move components to separate files

* Minor refactor

* Support url in event tags

* Add tooltip with link url

* Update grafana packages

* Fix adding new problems panel

* ProblemDetails: rewrite as a functional component

* minor refactor
This commit is contained in:
Alexander Zobnin
2023-01-20 14:23:46 +01:00
committed by GitHub
parent 445b46a6aa
commit a5c239f77b
31 changed files with 2216 additions and 514 deletions

View File

@@ -16,7 +16,7 @@ import {
TIME_SERIES_TIME_FIELD_NAME,
TIME_SERIES_VALUE_FIELD_NAME,
} from '@grafana/data';
import { ZabbixMetricsQuery } from './types';
import { ZabbixMetricsQuery, ZBXGroup, ZBXTrigger } from './types';
/**
* Convert Zabbix API history.get response to Grafana format
@@ -74,6 +74,29 @@ function convertHistory(history, items, addHostName, convertPointCallback) {
});
}
function handleMacro(macros, target): MutableDataFrame {
const frame = new MutableDataFrame({
refId: target.refId,
name: 'macros',
fields: [
{ name: 'Host', type: FieldType.string },
{ name: 'Macros', type: FieldType.string },
{ name: TIME_SERIES_VALUE_FIELD_NAME, type: FieldType.string },
],
});
for (let i = 0; i < macros.length; i++) {
const m = macros[i];
const dataRow: any = {
Host: m.hosts[0]!.name,
Macros: m.macro,
[TIME_SERIES_VALUE_FIELD_NAME]: m.value,
};
frame.add(dataRow);
}
return frame;
}
export function seriesToDataFrame(
timeseries,
target: ZabbixMetricsQuery,
@@ -589,7 +612,7 @@ export function handleSLAResponse(itservice, slaProperty, slaObject) {
}
}
function handleTriggersResponse(triggers, groups, timeRange) {
function handleTriggersResponse(triggers: ZBXTrigger[], groups: ZBXGroup[], timeRange: number[], target) {
if (!_.isArray(triggers)) {
let triggersCount = null;
try {
@@ -597,29 +620,47 @@ function handleTriggersResponse(triggers, groups, timeRange) {
} catch (err) {
console.log('Error when handling triggers count: ', err);
}
return {
target: 'triggers count',
datapoints: [[triggersCount, timeRange[1] * 1000]],
};
const frame = new MutableDataFrame({
refId: target.refId,
fields: [
{ name: TIME_SERIES_TIME_FIELD_NAME, type: FieldType.time, values: new ArrayVector([timeRange[1] * 1000]) },
{ name: TIME_SERIES_VALUE_FIELD_NAME, type: FieldType.number, values: new ArrayVector([triggersCount]) },
],
length: 1,
});
return frame;
} else {
const stats = getTriggerStats(triggers);
const groupNames = _.map(groups, 'name');
const table: any = new TableModel();
table.addColumn({ text: 'Host group' });
_.each(_.orderBy(c.TRIGGER_SEVERITY, ['val'], ['desc']), (severity) => {
table.addColumn({ text: severity.text });
const frame = new MutableDataFrame({
refId: target.refId,
fields: [{ name: 'Host group', type: FieldType.string, values: new ArrayVector() }],
});
_.each(stats, (severity_stats, group) => {
if (_.includes(groupNames, group)) {
let row = _.map(
_.orderBy(_.toPairs(severity_stats), (s) => s[0], ['desc']),
(s) => s[1]
);
row = _.concat([group], ...row);
table.rows.push(row);
}
for (let i = c.TRIGGER_SEVERITY.length - 1; i >= 0; i--) {
frame.fields.push({
name: c.TRIGGER_SEVERITY[i].text,
type: FieldType.number,
config: { unit: 'none', decimals: 0 },
values: new ArrayVector(),
});
}
const groupNames = groups?.map((g) => g.name);
groupNames?.forEach((group) => {
frame.add({
'Host group': group,
Disaster: stats[group] ? stats[group][5] : 0,
High: stats[group] ? stats[group][4] : 0,
Average: stats[group] ? stats[group][3] : 0,
Warning: stats[group] ? stats[group][2] : 0,
Information: stats[group] ? stats[group][1] : 0,
'Not classified': stats[group] ? stats[group][0] : 0,
});
});
return table;
return frame;
}
}
@@ -673,6 +714,7 @@ export default {
convertHistory,
handleTrends,
handleText,
handleMacro,
handleHistoryAsTable,
handleSLAResponse,
handleTriggersResponse,