[v11.0.x] CloudMonitoring: Improve legacy query migrations (#87648)

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

(cherry picked from commit 95667f6a53)

Co-authored-by: Andreas Christou <andreas.christou@grafana.com>
pull/87672/head
grafana-delivery-bot[bot] 1 year ago committed by GitHub
parent e52d86e9bc
commit 47f85d898b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 14
      public/app/plugins/datasource/cloud-monitoring/components/QueryEditor.tsx
  2. 62
      public/app/plugins/datasource/cloud-monitoring/datasource.test.ts
  3. 9
      public/app/plugins/datasource/cloud-monitoring/datasource.ts

@ -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);

@ -222,6 +222,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();

@ -240,6 +240,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,
@ -249,6 +254,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',
},
};
@ -265,7 +272,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,

Loading…
Cancel
Save