From 1c8ad04f8d76c4d08763bacc34fbb6aca2919448 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ida=20=C5=A0tambuk?= Date: Thu, 9 Mar 2023 13:24:48 +0100 Subject: [PATCH] Cloudwatch: Add expression field to interpolate variables in Metrics Code Builder (#64288) --- .../app/plugins/datasource/cloudwatch/datasource.test.ts | 4 ++-- .../query-runner/CloudWatchMetricsQueryRunner.test.ts | 9 ++++++--- .../query-runner/CloudWatchMetricsQueryRunner.ts | 6 +++++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/public/app/plugins/datasource/cloudwatch/datasource.test.ts b/public/app/plugins/datasource/cloudwatch/datasource.test.ts index 258023ac047..0d47ea95070 100644 --- a/public/app/plugins/datasource/cloudwatch/datasource.test.ts +++ b/public/app/plugins/datasource/cloudwatch/datasource.test.ts @@ -338,9 +338,9 @@ describe('datasource', () => { datasource.interpolateVariablesInQueries([metricsQuery], {}); - // We interpolate `expression`, `region`, `period`, `alias`, `metricName`, and `nameSpace` in CloudWatchMetricsQuery + // We interpolate `expression`, `sqlExpression`, `region`, `period`, `alias`, `metricName`, `dimensions`, and `nameSpace` in CloudWatchMetricsQuery expect(templateService.replace).toHaveBeenCalledWith(`$${variableName}`, {}); - expect(templateService.replace).toHaveBeenCalledTimes(7); + expect(templateService.replace).toHaveBeenCalledTimes(8); expect(templateService.getVariableName).toHaveBeenCalledWith(`$${variableName}`); expect(templateService.getVariableName).toHaveBeenCalledTimes(1); diff --git a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts index cf4d7154e76..722ac0a4120 100644 --- a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts +++ b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.test.ts @@ -694,18 +694,20 @@ describe('CloudWatchMetricsQueryRunner', () => { ); }); }); - describe('interpolateMetricsQueryVariables', () => { - it('interpolates dimensions correctly', () => { + it('interpolates values correctly', () => { const testQuery = { id: 'a', refId: 'a', region: 'us-east-2', namespace: '', + expression: 'ABS($datasource)', + sqlExpression: 'select SUM(CPUUtilization) from $datasource', dimensions: { InstanceId: '$dimension' }, }; const { runner } = setupMockedMetricsQueryRunner({ variables: [dimensionVariable], mockGetVariableName: false }); const result = runner.interpolateMetricsQueryVariables(testQuery, { + datasource: { text: 'foo', value: 'foo' }, dimension: { text: 'foo', value: 'foo' }, }); expect(result).toStrictEqual({ @@ -713,7 +715,8 @@ describe('CloudWatchMetricsQueryRunner', () => { metricName: '', namespace: '', period: '', - sqlExpression: '', + sqlExpression: 'select SUM(CPUUtilization) from foo', + expression: 'ABS(foo)', dimensions: { InstanceId: ['foo'] }, }); }); diff --git a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts index 978075a3a4d..5efe8dcfd81 100644 --- a/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts +++ b/public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchMetricsQueryRunner.ts @@ -99,12 +99,16 @@ export class CloudWatchMetricsQueryRunner extends CloudWatchRequest { interpolateMetricsQueryVariables( query: CloudWatchMetricsQuery, scopedVars: ScopedVars - ): Pick { + ): Pick< + CloudWatchMetricsQuery, + 'alias' | 'metricName' | 'namespace' | 'period' | 'dimensions' | 'sqlExpression' | 'expression' + > { return { alias: this.replaceVariableAndDisplayWarningIfMulti(query.alias, scopedVars), metricName: this.replaceVariableAndDisplayWarningIfMulti(query.metricName, scopedVars), namespace: this.replaceVariableAndDisplayWarningIfMulti(query.namespace, scopedVars), period: this.replaceVariableAndDisplayWarningIfMulti(query.period, scopedVars), + expression: this.templateSrv.replace(query.expression, scopedVars), sqlExpression: this.replaceVariableAndDisplayWarningIfMulti(query.sqlExpression, scopedVars), dimensions: this.convertDimensionFormat(query.dimensions ?? {}, scopedVars), };