Skip to content

Commit

Permalink
[v10.4.x] CloudMonitoring: Improve legacy query migrations (#87647)
Browse files Browse the repository at this point in the history
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 95667f6)

Co-authored-by: Andreas Christou <andreas.christou@grafana.com>
  • Loading branch information
grafana-delivery-bot[bot] and aangelisc committed May 10, 2024
1 parent 4d4cc11 commit 6e6fbf6
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
62 changes: 62 additions & 0 deletions public/app/plugins/datasource/cloud-monitoring/datasource.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
9 changes: 8 additions & 1 deletion public/app/plugins/datasource/cloud-monitoring/datasource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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',
},
};
Expand All @@ -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,
Expand Down

0 comments on commit 6e6fbf6

Please sign in to comment.