From d894f4cc79df18a55c75ff9fc5992eb708d1ea5f Mon Sep 17 00:00:00 2001 From: Isabella Siu Date: Fri, 1 Dec 2023 14:37:09 -0500 Subject: [PATCH] CloudWatch: Correctly quote metric names with special characters (#78958) --- .../language/cloudwatch-sql/SQLGenerator.test.ts | 7 +++++++ .../cloudwatch/language/cloudwatch-sql/SQLGenerator.ts | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/SQLGenerator.test.ts b/public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/SQLGenerator.test.ts index b256ea1399a..93c68c2bf0b 100644 --- a/public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/SQLGenerator.test.ts +++ b/public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/SQLGenerator.test.ts @@ -62,6 +62,13 @@ describe('SQLGenerator', () => { `SELECT COUNT("Bytes-Per-Second") FROM SCHEMA("AWS/EC2")` ); }); + + it('should wrap in double quotes if metric name starts with a number ', () => { + const select = createFunctionWithParameter('COUNT', ['4xxErrorRate']); + expect(new SQLGenerator().expressionToSqlQuery({ ...baseQuery, select })).toEqual( + `SELECT COUNT("4xxErrorRate") FROM SCHEMA("AWS/EC2")` + ); + }); }); describe('from', () => { diff --git a/public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/SQLGenerator.ts b/public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/SQLGenerator.ts index 3858b13132e..b98136e1f89 100644 --- a/public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/SQLGenerator.ts +++ b/public/app/plugins/datasource/cloudwatch/language/cloudwatch-sql/SQLGenerator.ts @@ -146,10 +146,11 @@ export default class SQLGenerator { } private formatValue(label: string): string { - const specialCharacters = /[/\s\.-]/; // slash, space, dot or dash + const specialCharacters = /[/\s\.%-]/; // slash, space, dot, percent, or dash + const startsWithNumber = /^\d/; const interpolated = this.templateSrv.replace(label, {}, 'raw'); - if (specialCharacters.test(interpolated)) { + if (specialCharacters.test(interpolated) || startsWithNumber.test(interpolated)) { return `"${label}"`; }