CloudMonitoring: Improve legacy query migrations (#86069)

* Match backend and correctly migrate metricType

Update tests

* Ensure project is migrated or set if not defined

* Improve migrations logic
This commit is contained in:
Andreas Christou 2024-05-10 16:57:18 +01:00 committed by GitHub
parent b226ddfa53
commit 95667f6a53
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 79 additions and 6 deletions

View File

@ -21,18 +21,22 @@ export type Props = QueryEditorProps<CloudMonitoringDatasource, CloudMonitoringQ
export const QueryEditor = (props: Props) => {
const { datasource, query: oldQ, onRunQuery, onChange, range } = props;
const [modalIsOpen, setModalIsOpen] = useState<boolean>(false);
// Migrate query if needed
const [migrated, setMigrated] = useState(false);
const [migratedQuery, setMigratedQuery] = useState<CloudMonitoringQuery | undefined>();
const query = useMemo(() => {
if (!migrated) {
setMigrated(true);
if (!migratedQuery) {
const migratedQuery = datasource.migrateQuery(oldQ);
setMigratedQuery(migratedQuery);
// Update the query once the migrations have been completed.
onChange({ ...migratedQuery });
return migratedQuery;
}
if (migratedQuery) {
return migratedQuery;
}
return oldQ;
}, [oldQ, datasource, onChange, migrated]);
}, [oldQ, datasource, onChange, migratedQuery]);
const [currentQuery, setCurrentQuery] = useState<CloudMonitoringQuery>(query);
const [queryHasBeenEdited, setQueryHasBeenEdited] = useState<boolean>(false);

View File

@ -249,6 +249,68 @@ describe('Cloud Monitoring Datasource', () => {
sloQuery: {},
},
},
{
description: 'legacy metrics query with metricType defined',
input: {
refId: 'A',
queryType: 'metrics',
intervalMs: 1000,
metricType: 'test-metric-type',
},
expected: {
queryType: QueryType.TIME_SERIES_LIST,
timeSeriesList: {
filters: ['metric.type', '=', 'test-metric-type'],
},
},
},
{
description: 'legacy metrics query with metricType and additional filters defined',
input: {
refId: 'A',
queryType: 'metrics',
intervalMs: 1000,
metricType: 'test-metric-type',
filters: ['test.filter', '=', 'test-filter-value'],
},
expected: {
queryType: QueryType.TIME_SERIES_LIST,
timeSeriesList: {
filters: ['test.filter', '=', 'test-filter-value', 'AND', 'metric.type', '=', 'test-metric-type'],
},
},
},
{
description: 'legacy metrics query without projectName defined',
input: {
refId: 'A',
queryType: 'metrics',
intervalMs: 1000,
metricType: 'test-metric-type',
},
expected: {
queryType: QueryType.TIME_SERIES_LIST,
timeSeriesList: {
projectName: 'test-project',
},
},
},
{
description: 'legacy metrics query with projectName defined',
input: {
refId: 'A',
queryType: 'metrics',
intervalMs: 1000,
metricType: 'test-metric-type',
projectName: 'test-project-defined',
},
expected: {
queryType: QueryType.TIME_SERIES_LIST,
timeSeriesList: {
projectName: 'test-project-defined',
},
},
},
].forEach((t) =>
it(t.description, () => {
const mockInstanceSettings = createMockInstanceSetttings();

View File

@ -241,6 +241,11 @@ export default class CloudMonitoringDatasource extends DataSourceWithBackend<
!query.hasOwnProperty('timeSeriesQuery') &&
!query.hasOwnProperty('timeSeriesList')
) {
let filters = rest.filters || [];
if (rest.metricType) {
filters = this.migrateMetricTypeFilter(rest.metricType, filters);
}
return {
datasource,
key,
@ -250,6 +255,8 @@ export default class CloudMonitoringDatasource extends DataSourceWithBackend<
queryType: type === 'annotationQuery' ? QueryType.ANNOTATION : QueryType.TIME_SERIES_LIST,
timeSeriesList: {
...rest,
projectName: get(query, 'projectName') || this.getDefaultProject(),
filters,
view: rest.view || 'FULL',
},
};
@ -266,7 +273,7 @@ export default class CloudMonitoringDatasource extends DataSourceWithBackend<
query.queryType = QueryType.TIME_SERIES_QUERY;
} else {
query.timeSeriesList = {
projectName: metricQuery.projectName,
projectName: metricQuery.projectName || this.getDefaultProject(),
crossSeriesReducer: metricQuery.crossSeriesReducer,
alignmentPeriod: metricQuery.alignmentPeriod,
perSeriesAligner: metricQuery.perSeriesAligner,