131 lines
3.4 KiB
TypeScript
131 lines
3.4 KiB
TypeScript
import _ from 'lodash';
|
|
import { ZabbixMetricsQuery } from './types';
|
|
import * as c from './constants';
|
|
|
|
/**
|
|
* 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;
|
|
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';
|
|
}
|
|
}
|
|
|
|
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);
|
|
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 const DS_CONFIG_SCHEMA = 2;
|
|
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;
|
|
}
|
|
|
|
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;
|
|
}
|