diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/DashboardAndWidgetWithStartAndEnd.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/DashboardAndWidgetWithStartAndEnd.assets.json index 048b1a92a7635..0716094f8358f 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/DashboardAndWidgetWithStartAndEnd.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/DashboardAndWidgetWithStartAndEnd.assets.json @@ -1,7 +1,7 @@ { - "version": "34.0.0", + "version": "38.0.1", "files": { - "874df94f43f12341a3001f4b19d4e1bba754a4fc3a33c6a592ae6c265fc99a44": { + "ffda0354b028815a1953777c34e49bbf4ec8eb0eb04ccd47e60eff77dbcefe33": { "source": { "path": "DashboardAndWidgetWithStartAndEnd.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "874df94f43f12341a3001f4b19d4e1bba754a4fc3a33c6a592ae6c265fc99a44.json", + "objectKey": "ffda0354b028815a1953777c34e49bbf4ec8eb0eb04ccd47e60eff77dbcefe33.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/DashboardAndWidgetWithStartAndEnd.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/DashboardAndWidgetWithStartAndEnd.template.json index 9ff3f1cedf6cc..8f7e608fdb1e3 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/DashboardAndWidgetWithStartAndEnd.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/DashboardAndWidgetWithStartAndEnd.template.json @@ -11,15 +11,15 @@ { "Ref": "AWS::Region" }, - "\",\"metrics\":[[\"CDK/Test\",\"Metric\"]],\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}},{\"type\":\"metric\",\"width\":6,\"height\":6,\"x\":0,\"y\":3,\"properties\":{\"view\":\"timeSeries\",\"region\":\"", + "\",\"metrics\":[[\"CDK/Test\",\"Metric\",{\"accountId\":\"1234\",\"region\":\"us-north-5\"}]],\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}},{\"type\":\"metric\",\"width\":6,\"height\":6,\"x\":0,\"y\":3,\"properties\":{\"view\":\"timeSeries\",\"region\":\"", { "Ref": "AWS::Region" }, - "\",\"metrics\":[[\"CDK/Test\",\"Metric\"]],\"yAxis\":{},\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}},{\"type\":\"metric\",\"width\":6,\"height\":6,\"x\":0,\"y\":9,\"properties\":{\"view\":\"gauge\",\"region\":\"", + "\",\"metrics\":[[\"CDK/Test\",\"Metric\",{\"accountId\":\"1234\",\"region\":\"us-north-5\"}]],\"yAxis\":{},\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}},{\"type\":\"metric\",\"width\":6,\"height\":6,\"x\":0,\"y\":9,\"properties\":{\"view\":\"gauge\",\"region\":\"", { "Ref": "AWS::Region" }, - "\",\"metrics\":[[\"CDK/Test\",\"Metric\"]],\"yAxis\":{\"left\":{\"min\":0,\"max\":100}},\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}}]}" + "\",\"metrics\":[[\"CDK/Test\",\"Metric\",{\"accountId\":\"1234\",\"region\":\"us-north-5\"}]],\"yAxis\":{\"left\":{\"min\":0,\"max\":100}},\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}}]}" ] ] } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/cdk.out index 2313ab5436501..c6e612584e352 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/cdk.out +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/cdk.out @@ -1 +1 @@ -{"version":"34.0.0"} \ No newline at end of file +{"version":"38.0.1"} \ No newline at end of file diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/cdkintegdashboardandwidgetwithstartandendDefaultTestDeployAssert4D8483F4.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/cdkintegdashboardandwidgetwithstartandendDefaultTestDeployAssert4D8483F4.assets.json index eff956f039962..382c5bbbce8d5 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/cdkintegdashboardandwidgetwithstartandendDefaultTestDeployAssert4D8483F4.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/cdkintegdashboardandwidgetwithstartandendDefaultTestDeployAssert4D8483F4.assets.json @@ -1,5 +1,5 @@ { - "version": "34.0.0", + "version": "38.0.1", "files": { "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { "source": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/integ.json index 0ef12514015b1..f68abd5b184d3 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/integ.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/integ.json @@ -1,5 +1,5 @@ { - "version": "34.0.0", + "version": "38.0.1", "testCases": { "cdk-integ-dashboard-and-widget-with-start-and-end/DefaultTest": { "stacks": [ diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/manifest.json index da40c03020eed..2a45f59d0938e 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/manifest.json @@ -1,5 +1,5 @@ { - "version": "34.0.0", + "version": "38.0.1", "artifacts": { "DashboardAndWidgetWithStartAndEnd.assets": { "type": "cdk:asset-manifest", @@ -14,10 +14,11 @@ "environment": "aws://unknown-account/unknown-region", "properties": { "templateFile": "DashboardAndWidgetWithStartAndEnd.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/874df94f43f12341a3001f4b19d4e1bba754a4fc3a33c6a592ae6c265fc99a44.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/ffda0354b028815a1953777c34e49bbf4ec8eb0eb04ccd47e60eff77dbcefe33.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -67,6 +68,7 @@ "environment": "aws://unknown-account/unknown-region", "properties": { "templateFile": "cdkintegdashboardandwidgetwithstartandendDefaultTestDeployAssert4D8483F4.template.json", + "terminationProtection": false, "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/tree.json index dec19d3db0811..397fccf676f79 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.js.snapshot/tree.json @@ -26,15 +26,15 @@ { "Ref": "AWS::Region" }, - "\",\"metrics\":[[\"CDK/Test\",\"Metric\"]],\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}},{\"type\":\"metric\",\"width\":6,\"height\":6,\"x\":0,\"y\":3,\"properties\":{\"view\":\"timeSeries\",\"region\":\"", + "\",\"metrics\":[[\"CDK/Test\",\"Metric\",{\"accountId\":\"1234\",\"region\":\"us-north-5\"}]],\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}},{\"type\":\"metric\",\"width\":6,\"height\":6,\"x\":0,\"y\":3,\"properties\":{\"view\":\"timeSeries\",\"region\":\"", { "Ref": "AWS::Region" }, - "\",\"metrics\":[[\"CDK/Test\",\"Metric\"]],\"yAxis\":{},\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}},{\"type\":\"metric\",\"width\":6,\"height\":6,\"x\":0,\"y\":9,\"properties\":{\"view\":\"gauge\",\"region\":\"", + "\",\"metrics\":[[\"CDK/Test\",\"Metric\",{\"accountId\":\"1234\",\"region\":\"us-north-5\"}]],\"yAxis\":{},\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}},{\"type\":\"metric\",\"width\":6,\"height\":6,\"x\":0,\"y\":9,\"properties\":{\"view\":\"gauge\",\"region\":\"", { "Ref": "AWS::Region" }, - "\",\"metrics\":[[\"CDK/Test\",\"Metric\"]],\"yAxis\":{\"left\":{\"min\":0,\"max\":100}},\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}}]}" + "\",\"metrics\":[[\"CDK/Test\",\"Metric\",{\"accountId\":\"1234\",\"region\":\"us-north-5\"}]],\"yAxis\":{\"left\":{\"min\":0,\"max\":100}},\"start\":\"-P7D\",\"end\":\"2018-12-17T06:00:00.000Z\"}}]}" ] ] } @@ -86,7 +86,7 @@ "path": "cdk-integ-dashboard-and-widget-with-start-and-end/DefaultTest/Default", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.2.70" + "version": "10.4.2" } }, "DeployAssert": { @@ -132,7 +132,7 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.2.70" + "version": "10.4.2" } } }, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.ts index 280845d4e60ab..38e68985deb12 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-cloudwatch/test/integ.dashboard-and-widget-with-start-and-end.ts @@ -11,6 +11,8 @@ class TestStack extends Stack { const testMetric = new Metric({ namespace: 'CDK/Test', metricName: 'Metric', + account: '1234', + region: 'us-north-5', }); const singleValueWidget = new SingleValueWidget({ diff --git a/packages/aws-cdk-lib/aws-cloudwatch/lib/metric-types.ts b/packages/aws-cdk-lib/aws-cloudwatch/lib/metric-types.ts index 7b02013c48a27..46efb0bc56a87 100644 --- a/packages/aws-cdk-lib/aws-cloudwatch/lib/metric-types.ts +++ b/packages/aws-cdk-lib/aws-cloudwatch/lib/metric-types.ts @@ -323,6 +323,20 @@ export interface MetricStatConfig { * @default Deployment account. */ readonly account?: string; + + /** + * Region set directly on the metric, not inherited from the attached stack. + * + * @default No override. + */ + readonly regionOverride?: string; + + /** + * Account set directly on the metric, not inherited from the attached stack. + * + * @default No override. + */ + readonly accountOverride?: string; } /** diff --git a/packages/aws-cdk-lib/aws-cloudwatch/lib/metric.ts b/packages/aws-cdk-lib/aws-cloudwatch/lib/metric.ts index 428598e9602b5..a39a439ddcabf 100644 --- a/packages/aws-cdk-lib/aws-cloudwatch/lib/metric.ts +++ b/packages/aws-cdk-lib/aws-cloudwatch/lib/metric.ts @@ -6,6 +6,7 @@ import { normalizeStatistic, pairStatisticToString, parseStatistic, singleStatis import { Stats } from './stats'; import * as iam from '../../aws-iam'; import * as cdk from '../../core'; +import { makeEnumerable } from './private/make-enumerable'; export type DimensionHash = { [dim: string]: any }; @@ -115,6 +116,20 @@ export interface CommonMetricOptions { * @default - Deployment region. */ readonly region?: string; + + /** + * Account of the stack this metric is attached to. + * + * @default - Deployment account. + */ + readonly stackAccount?: string; + + /** + * Region of the stack this metric is attached to. + * + * @default - Deployment region. + */ + readonly stackRegion?: string; } /** @@ -306,11 +321,17 @@ export class Metric implements IMetric { /** Unit of the metric. */ public readonly unit?: Unit; - /** Account which this metric comes from */ - public readonly account?: string; + /** Account of the stack this metric is attached to. */ + readonly #stackAccount?: string; + + /** Region of the stack this metric is attached to. */ + readonly #stackRegion?: string; - /** Region which this metric comes from. */ - public readonly region?: string; + /** Account set directly on the metric, taking precedence over the stack account. */ + readonly #accountOverride?: string; + + /** Region set directly on the metric, taking precedence over the stack region. */ + readonly #regionOverride?: string; /** * Warnings attached to this metric. @@ -352,8 +373,14 @@ export class Metric implements IMetric { this.label = props.label; this.color = props.color; this.unit = props.unit; - this.account = props.account; - this.region = props.region; + this.#accountOverride = props.account; + this.#regionOverride = props.region; + this.#stackAccount = props.stackAccount; + this.#stackRegion = props.stackRegion; + + // Make getters enumerable. + makeEnumerable(Metric.prototype, this, 'account'); + makeEnumerable(Metric.prototype, this, 'region'); } /** @@ -369,8 +396,10 @@ export class Metric implements IMetric { && (props.color === undefined || props.color === this.color) && (props.statistic === undefined || props.statistic === this.statistic) && (props.unit === undefined || props.unit === this.unit) - && (props.account === undefined || props.account === this.account) - && (props.region === undefined || props.region === this.region) + && (props.account === undefined || props.account === this.#accountOverride) + && (props.region === undefined || props.region === this.#regionOverride) + && (props.stackAccount === undefined || props.stackAccount === this.#stackAccount) + && (props.stackRegion === undefined || props.stackRegion === this.#stackRegion) // For these we're not going to do deep equality, misses some opportunity for optimization // but that's okay. && (props.dimensions === undefined) @@ -388,8 +417,10 @@ export class Metric implements IMetric { unit: ifUndefined(props.unit, this.unit), label: ifUndefined(props.label, this.label), color: ifUndefined(props.color, this.color), - account: ifUndefined(props.account, this.account), - region: ifUndefined(props.region, this.region), + account: ifUndefined(props.account, this.#accountOverride), + region: ifUndefined(props.region, this.#regionOverride), + stackAccount: ifUndefined(props.stackAccount, this.#stackAccount), + stackRegion: ifUndefined(props.stackRegion, this.#stackRegion), }); } @@ -409,11 +440,25 @@ export class Metric implements IMetric { const stack = cdk.Stack.of(scope); return this.with({ - region: cdk.Token.isUnresolved(stack.region) ? undefined : stack.region, - account: cdk.Token.isUnresolved(stack.account) ? undefined : stack.account, + stackAccount: cdk.Token.isUnresolved(stack.account) ? undefined : stack.account, + stackRegion: cdk.Token.isUnresolved(stack.region) ? undefined : stack.region, }); } + /** + * Account which this metric comes from. + */ + public get account(): string | undefined { + return this.#accountOverride || this.#stackAccount; + } + + /** + * Region which this metric comes from. + */ + public get region(): string | undefined { + return this.#regionOverride || this.#stackRegion; + } + public toMetricConfig(): MetricConfig { const dims = this.dimensionsAsList(); return { @@ -426,6 +471,8 @@ export class Metric implements IMetric { unitFilter: this.unit, account: this.account, region: this.region, + accountOverride: this.#accountOverride, + regionOverride: this.#regionOverride, }, renderingProperties: { color: this.color, diff --git a/packages/aws-cdk-lib/aws-cloudwatch/lib/private/make-enumerable.ts b/packages/aws-cdk-lib/aws-cloudwatch/lib/private/make-enumerable.ts new file mode 100644 index 0000000000000..ab721bfa9f605 --- /dev/null +++ b/packages/aws-cdk-lib/aws-cloudwatch/lib/private/make-enumerable.ts @@ -0,0 +1,9 @@ +/** + * Make a property from the specified prototype enumerable on the specific instance. + */ +export function makeEnumerable(prototype: object, instance: object, propertyKey: string) { + Object.defineProperty(instance, propertyKey, { + ...Object.getOwnPropertyDescriptor(prototype, propertyKey), + enumerable: true, + }); +} diff --git a/packages/aws-cdk-lib/aws-cloudwatch/lib/private/rendering.ts b/packages/aws-cdk-lib/aws-cloudwatch/lib/private/rendering.ts index 1aff96bbd120b..db815e42986c4 100644 --- a/packages/aws-cdk-lib/aws-cloudwatch/lib/private/rendering.ts +++ b/packages/aws-cdk-lib/aws-cloudwatch/lib/private/rendering.ts @@ -47,8 +47,16 @@ function metricGraphJson(metric: IMetric, yAxis?: string, id?: string) { } // Metric attributes that are rendered to graph options - if (stat.account) { options.accountId = accountIfDifferentFromStack(stat.account); } - if (stat.region) { options.region = regionIfDifferentFromStack(stat.region); } + if (stat.accountOverride) { + options.accountId = stat.accountOverride; + } else if (stat.account) { + options.accountId = accountIfDifferentFromStack(stat.account); + } + if (stat.regionOverride) { + options.region = stat.regionOverride; + } else if (stat.region) { + options.region = regionIfDifferentFromStack(stat.region); + } if (stat.period && stat.period.toSeconds() !== 300) { options.period = stat.period.toSeconds(); } if (stat.statistic && stat.statistic !== 'Average') { options.stat = stat.statistic; } }, diff --git a/packages/aws-cdk-lib/aws-cloudwatch/test/cross-environment.test.ts b/packages/aws-cdk-lib/aws-cloudwatch/test/cross-environment.test.ts index 14a68d64355fd..ece55e300cf21 100644 --- a/packages/aws-cdk-lib/aws-cloudwatch/test/cross-environment.test.ts +++ b/packages/aws-cdk-lib/aws-cloudwatch/test/cross-environment.test.ts @@ -59,7 +59,20 @@ describe('cross environment', () => { graphMetricsAre(new Stack(), graph, [ ['Test', 'ACount', { accountId: '1234', region: 'us-north-5' }], ]); + }); + test('metric with explicit account and region that match stack will render as-is', () => { + // GIVEN + const graph = new GraphWidget({ + left: [ + a.with({ account: '1234', region: 'us-north-5' }), + ], + }); + + // THEN + graphMetricsAre(new Stack(undefined, undefined, { env: { region: 'us-north-5', account: '1234' } }), graph, [ + ['Test', 'ACount', { accountId: '1234', region: 'us-north-5' }], + ]); }); test('metric attached to agnostic stack will not render in agnostic stack', () => { diff --git a/packages/aws-cdk-lib/aws-cloudwatch/test/metrics.test.ts b/packages/aws-cdk-lib/aws-cloudwatch/test/metrics.test.ts index 42f3bd14a1fbb..3fb54f4e1b58d 100644 --- a/packages/aws-cdk-lib/aws-cloudwatch/test/metrics.test.ts +++ b/packages/aws-cdk-lib/aws-cloudwatch/test/metrics.test.ts @@ -273,6 +273,35 @@ describe('Metrics', () => { expect(metric.statistic).toEqual(customStat); }); + test('region and account getters are enumerable', () => { + const metric = new Metric({ + namespace: 'Test', + metricName: 'Metric', + period: cdk.Duration.minutes(10), + region: 'test-region', + account: 'test-account', + }); + + expect(metric.region).toBe('test-region'); + expect(metric.account).toBe('test-account'); + + const metricObject = { ...metric }; + expect(metricObject).toEqual(expect.objectContaining({ + region: 'test-region', + account: 'test-account', + })); + + // Check that private fields are not included. + // @ts-expect-error + expect(metricObject.accountOverride).toBeUndefined(); + // @ts-expect-error + expect(metricObject.stackAccount).toBeUndefined(); + // @ts-expect-error + expect(metricObject.regionOverride).toBeUndefined(); + // @ts-expect-error + expect(metricObject.stackRegion).toBeUndefined(); + }); + test('statistic is properly parsed', () => { const checkParsingSingle = (statistic: string, statPrefix: string, statName: string, value: number) => { const parsed = parseStatistic(statistic);