* cleanup * update create plugin config and query help fix * query types file * Update docker-compose.yml Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com> * addressed review comments --------- Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>
228 lines
5.9 KiB
TypeScript
228 lines
5.9 KiB
TypeScript
import _ from 'lodash';
|
|
import { ZabbixMetricsQuery } from './types/query';
|
|
import * as c from './constants';
|
|
|
|
export const DS_QUERY_SCHEMA = 12;
|
|
export const DS_CONFIG_SCHEMA = 3;
|
|
|
|
/**
|
|
* Query format migration.
|
|
* This module can detect query format version and make migration.
|
|
*/
|
|
|
|
export function isGrafana2target(target) {
|
|
if (!target.mode || target.mode === 0 || target.mode === 2) {
|
|
if (
|
|
(target.hostFilter || target.itemFilter || target.downsampleFunction || (target.host && target.host.host)) &&
|
|
target.item.filter === undefined &&
|
|
target.host.filter === undefined
|
|
) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export function migrateFrom2To3version(target: ZabbixMetricsQuery) {
|
|
target.group.filter = target.group.name === '*' ? '/.*/' : target.group.name;
|
|
target.host.filter = target.host.name === '*' ? convertToRegex(target.hostFilter) : target.host.name;
|
|
target.application.filter = target.application.name === '*' ? '' : target.application.name;
|
|
target.item.filter = target.item.name === 'All' ? convertToRegex(target.itemFilter) : target.item.name;
|
|
target.macro.filter = target.macro.macro === '*' ? convertToRegex(target.macroFilter) : target.macro.macro;
|
|
return target;
|
|
}
|
|
|
|
function migratePercentileAgg(target) {
|
|
if (target.functions) {
|
|
for (const f of target.functions) {
|
|
if (f.def && f.def.name === 'percentil') {
|
|
f.def.name = 'percentile';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function migrateQueryType(target) {
|
|
if (target.queryType === undefined) {
|
|
if (target.mode === 'Metrics') {
|
|
// Explore mode
|
|
target.queryType = c.MODE_METRICS;
|
|
} else if (target.mode !== undefined) {
|
|
target.queryType = target.mode;
|
|
delete target.mode;
|
|
}
|
|
}
|
|
|
|
// queryType is a string in query model
|
|
if (typeof target.queryType === 'number') {
|
|
target.queryType = (target.queryType as number)?.toString();
|
|
}
|
|
}
|
|
|
|
function migrateSLA(target) {
|
|
if (target.queryType === c.MODE_ITSERVICE && !target.slaInterval) {
|
|
target.slaInterval = 'none';
|
|
}
|
|
}
|
|
|
|
function migrateProblemSort(target) {
|
|
if (target.options?.sortProblems === 'priority') {
|
|
target.options.sortProblems = 'severity';
|
|
}
|
|
}
|
|
|
|
function migrateApplications(target) {
|
|
if (!target.itemTag) {
|
|
target.itemTag = { filter: '' };
|
|
if (target.application?.filter) {
|
|
target.itemTag.filter = `Application: ${target.application?.filter}`;
|
|
}
|
|
}
|
|
}
|
|
|
|
function migrateSLAProperty(target) {
|
|
if (target.slaProperty?.property) {
|
|
target.slaProperty = target.slaProperty?.property;
|
|
}
|
|
}
|
|
|
|
function migrateTriggersMode(target: any) {
|
|
if (target.triggers?.minSeverity) {
|
|
target.options.minSeverity = target.triggers?.minSeverity;
|
|
delete target.triggers.minSeverity;
|
|
}
|
|
if (target.triggers?.count) {
|
|
target.options.count = target.triggers?.count;
|
|
delete target.triggers.count;
|
|
}
|
|
}
|
|
|
|
function migrateNewTriggersCountModes(target: any) {
|
|
if (target.schema >= 11) {
|
|
return;
|
|
}
|
|
if (target.queryType === '6') {
|
|
target.queryType = c.MODE_TRIGGERS;
|
|
target.countTriggersBy = 'items';
|
|
} else if (target.queryType === '7') {
|
|
target.queryType = c.MODE_TRIGGERS;
|
|
target.countTriggersBy = 'problems';
|
|
} else if (target.queryType === '8') {
|
|
target.queryType = c.MODE_MACROS;
|
|
}
|
|
}
|
|
|
|
function migrateProblemsSeverity(target: any) {
|
|
if (target.schema >= 12) {
|
|
return;
|
|
}
|
|
if (target?.options?.minSeverity) {
|
|
target.options.severities = [0, 1, 2, 3, 4, 5].filter((v) => v >= target.options.minSeverity);
|
|
}
|
|
}
|
|
|
|
export function migrate(target) {
|
|
target.resultFormat = target.resultFormat || 'time_series';
|
|
target = fixTargetGroup(target);
|
|
if (isGrafana2target(target)) {
|
|
return migrateFrom2To3version(target);
|
|
}
|
|
migratePercentileAgg(target);
|
|
migrateQueryType(target);
|
|
migrateSLA(target);
|
|
migrateProblemSort(target);
|
|
migrateApplications(target);
|
|
migrateSLAProperty(target);
|
|
migrateTriggersMode(target);
|
|
migrateNewTriggersCountModes(target);
|
|
migrateProblemsSeverity(target);
|
|
|
|
target.schema = DS_QUERY_SCHEMA;
|
|
return target;
|
|
}
|
|
|
|
function fixTargetGroup(target) {
|
|
if (target.group && Array.isArray(target.group)) {
|
|
target.group = { filter: '' };
|
|
}
|
|
return target;
|
|
}
|
|
|
|
function convertToRegex(str) {
|
|
if (str) {
|
|
return '/' + str + '/';
|
|
} else {
|
|
return '/.*/';
|
|
}
|
|
}
|
|
|
|
export function migrateDSConfig(jsonData) {
|
|
if (!jsonData) {
|
|
jsonData = {};
|
|
}
|
|
|
|
if (!shouldMigrateDSConfig(jsonData)) {
|
|
return jsonData;
|
|
}
|
|
|
|
const oldVersion = jsonData.schema || 1;
|
|
jsonData.schema = DS_CONFIG_SCHEMA;
|
|
|
|
if (oldVersion < 2) {
|
|
const dbConnectionOptions = jsonData.dbConnection || {};
|
|
jsonData.dbConnectionEnable = dbConnectionOptions.enable || false;
|
|
jsonData.dbConnectionDatasourceId = dbConnectionOptions.datasourceId || null;
|
|
delete jsonData.dbConnection;
|
|
}
|
|
|
|
if (oldVersion < 3) {
|
|
jsonData.timeout = (jsonData.timeout as string) === '' ? null : Number(jsonData.timeout as string);
|
|
}
|
|
|
|
return jsonData;
|
|
}
|
|
|
|
function shouldMigrateDSConfig(jsonData): boolean {
|
|
if (jsonData.dbConnection && !_.isEmpty(jsonData.dbConnection)) {
|
|
return true;
|
|
}
|
|
if (jsonData.schema && jsonData.schema < DS_CONFIG_SCHEMA) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const getDefaultAnnotationTarget = (json: any) => {
|
|
return {
|
|
group: { filter: json.group ?? '' },
|
|
host: { filter: json.host ?? '' },
|
|
application: { filter: json.application ?? '' },
|
|
trigger: { filter: json.trigger ?? '' },
|
|
options: {
|
|
minSeverity: json.minseverity ?? 0,
|
|
showOkEvents: json.showOkEvents ?? false,
|
|
hideAcknowledged: json.hideAcknowledged ?? false,
|
|
showHostname: json.showHostname ?? false,
|
|
},
|
|
};
|
|
};
|
|
|
|
export const prepareAnnotation = (json: any) => {
|
|
const defaultTarget = getDefaultAnnotationTarget(json);
|
|
|
|
json.target = {
|
|
...defaultTarget,
|
|
...json.target,
|
|
fromAnnotations: true,
|
|
options: {
|
|
...defaultTarget.options!,
|
|
...json.target?.options,
|
|
},
|
|
};
|
|
|
|
return json;
|
|
};
|