Files
2022-08-01 17:48:49 +02:00

156 lines
4.9 KiB
TypeScript

import { setKustoQuery } from '../components/LogsQueryEditor/setQueryValue';
import {
appendDimensionFilter,
setTimeGrain as setMetricsTimeGrain,
} from '../components/MetricsQueryEditor/setQueryValue';
import { parseResourceDetails } from '../components/ResourcePicker/utils';
import TimegrainConverter from '../time_grain_converter';
import { AzureMetricDimension, AzureMonitorQuery, AzureQueryType } from '../types';
const OLD_DEFAULT_DROPDOWN_VALUE = 'select';
export default function migrateQuery(query: AzureMonitorQuery): AzureMonitorQuery {
let workingQuery = query;
if (!workingQuery.queryType) {
workingQuery = {
...workingQuery,
queryType: AzureQueryType.AzureMonitor,
};
}
workingQuery = migrateLogAnalyticsToFromTimes(workingQuery);
if (workingQuery.queryType === AzureQueryType.AzureMonitor && workingQuery.azureMonitor) {
workingQuery = migrateTimeGrains(workingQuery);
workingQuery = migrateToDefaultNamespace(workingQuery);
workingQuery = migrateDimensionToDimensionFilter(workingQuery);
workingQuery = migrateDimensionFilterToArray(workingQuery);
workingQuery = migrateDimensionToResourceObj(workingQuery);
}
return workingQuery;
}
function migrateTimeGrains(query: AzureMonitorQuery): AzureMonitorQuery {
let workingQuery = query;
if (workingQuery.azureMonitor?.timeGrainUnit && workingQuery.azureMonitor.timeGrain !== 'auto') {
const newTimeGrain = TimegrainConverter.createISO8601Duration(
workingQuery.azureMonitor.timeGrain ?? 'auto',
workingQuery.azureMonitor.timeGrainUnit
);
workingQuery = setMetricsTimeGrain(workingQuery, newTimeGrain);
delete workingQuery.azureMonitor?.timeGrainUnit;
}
return workingQuery;
}
function migrateLogAnalyticsToFromTimes(query: AzureMonitorQuery): AzureMonitorQuery {
let workingQuery = query;
if (workingQuery.azureLogAnalytics?.query?.match(/\$__from\s/gi)) {
workingQuery = setKustoQuery(
workingQuery,
workingQuery.azureLogAnalytics.query.replace(/\$__from\s/gi, '$__timeFrom() ')
);
}
if (workingQuery.azureLogAnalytics?.query?.match(/\$__to\s/gi)) {
workingQuery = setKustoQuery(
workingQuery,
workingQuery.azureLogAnalytics.query.replace(/\$__to\s/gi, '$__timeTo() ')
);
}
return workingQuery;
}
function migrateToDefaultNamespace(query: AzureMonitorQuery): AzureMonitorQuery {
const haveMetricNamespace =
query.azureMonitor?.metricNamespace && query.azureMonitor.metricNamespace !== OLD_DEFAULT_DROPDOWN_VALUE;
if (!haveMetricNamespace && query.azureMonitor?.metricDefinition) {
return {
...query,
azureMonitor: {
...query.azureMonitor,
metricNamespace: query.azureMonitor.metricDefinition,
metricDefinition: undefined,
},
};
}
return query;
}
function migrateDimensionToDimensionFilter(query: AzureMonitorQuery): AzureMonitorQuery {
let workingQuery = query;
const oldDimension = workingQuery.azureMonitor?.dimension;
if (oldDimension && oldDimension !== 'None') {
workingQuery = appendDimensionFilter(workingQuery, oldDimension, 'eq', [
workingQuery.azureMonitor?.dimensionFilter || '',
]);
}
return workingQuery;
}
function migrateDimensionFilterToArray(query: AzureMonitorQuery): AzureMonitorQuery {
const azureMonitorQuery = query.azureMonitor;
if (!azureMonitorQuery) {
return query;
}
const newFilters: AzureMetricDimension[] = [];
const dimensionFilters = azureMonitorQuery.dimensionFilters;
if (dimensionFilters && dimensionFilters.length > 0) {
dimensionFilters.forEach((filter) => {
const staticProps = { dimension: filter.dimension, operator: filter.operator };
if (!filter.filters && filter.filter) {
newFilters.push({ ...staticProps, filters: [filter.filter] });
} else {
let hasFilter = false;
if (filter.filters && filter.filter) {
for (const oldFilter of filter.filters) {
if (filter.filter === oldFilter) {
hasFilter = true;
break;
}
}
if (!hasFilter && filter.filter !== '*') {
filter.filters.push(filter.filter);
}
newFilters.push({ ...staticProps, filters: filter.filters });
}
}
});
if (newFilters.length > 0) {
return { ...query, azureMonitor: { ...azureMonitorQuery, dimensionFilters: newFilters } };
}
}
return query;
}
function migrateDimensionToResourceObj(query: AzureMonitorQuery): AzureMonitorQuery {
if (query.azureMonitor?.resourceUri) {
const details = parseResourceDetails(query.azureMonitor.resourceUri);
return {
...query,
subscription: details?.subscription,
azureMonitor: {
...query.azureMonitor,
resourceGroup: details?.resourceGroup,
metricNamespace: details?.metricNamespace,
resourceName: details?.resourceName,
resourceUri: undefined,
},
};
}
return query;
}