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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user