From e034765112bde1c1daa55dc7be7d507985683a06 Mon Sep 17 00:00:00 2001 From: "grafana-delivery-bot[bot]" <132647405+grafana-delivery-bot[bot]@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:20:41 -0500 Subject: [PATCH] [v10.2.x] CloudWatch: Correctly quote metric names with special characters (#78975) CloudWatch: Correctly quote metric names with special characters (#78958) (cherry picked from commit d894f4cc79df18a55c75ff9fc5992eb708d1ea5f) Co-authored-by: Isabella Siu --- .../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}"`; }