diff --git a/public/app/plugins/datasource/cloudwatch/datasource.ts b/public/app/plugins/datasource/cloudwatch/datasource.ts index e096e44ac25..714562114d4 100644 --- a/public/app/plugins/datasource/cloudwatch/datasource.ts +++ b/public/app/plugins/datasource/cloudwatch/datasource.ts @@ -44,7 +44,13 @@ export default class CloudWatchDatasource { // valid ExtendedStatistics is like p90.00, check the pattern const hasInvalidStatistics = item.statistics.some(s => { - return s.indexOf('p') === 0 && !/p\d{2}\.\d{2}/.test(s); + if (s.indexOf('p') === 0) { + const matches = /^p\d{2}(?:\.\d{1,2})?$/.exec(s); + + return !matches || matches[0] !== s; + } + + return false; }); if (hasInvalidStatistics) { throw { message: 'Invalid extended statistics' }; diff --git a/public/app/plugins/datasource/cloudwatch/specs/datasource.test.ts b/public/app/plugins/datasource/cloudwatch/specs/datasource.test.ts index 2825539f223..512767075a9 100644 --- a/public/app/plugins/datasource/cloudwatch/specs/datasource.test.ts +++ b/public/app/plugins/datasource/cloudwatch/specs/datasource.test.ts @@ -122,7 +122,7 @@ describe('CloudWatchDatasource', () => { }); }); - it('should cancel query for invalid extended statistics', () => { + it.each(['pNN.NN', 'p9', 'p99.', 'p99.999'])('should cancel query for invalid extended statistics (%s)', stat => { const query = { range: { from: 'now-1h', to: 'now' }, rangeRaw: { from: 1483228800, to: 1483232400 }, @@ -134,7 +134,7 @@ describe('CloudWatchDatasource', () => { dimensions: { InstanceId: 'i-12345678', }, - statistics: ['pNN.NN'], + statistics: [stat], period: '60s', }, ],