Files
grafana-zabbix/src/datasource/migrations.ts
Sriram c4065fb0f3 config updates (#1800)
* 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>
2024-03-13 15:20:53 +00:00

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;
};