diff --git a/.gitignore b/.gitignore index 3f1196546a..cb2d901eae 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,5 @@ site tmp # TS build files -tsconfig.tsbuildinfo \ No newline at end of file +tsconfig.tsbuildinfo +.tsbuildinfo \ No newline at end of file diff --git a/packages/metrics/src/Metrics.ts b/packages/metrics/src/Metrics.ts index e729c9946a..5bf9fba97f 100644 --- a/packages/metrics/src/Metrics.ts +++ b/packages/metrics/src/Metrics.ts @@ -440,8 +440,10 @@ class Metrics extends Utility implements MetricsInterface { ); const dimensionNames = [ - ...Object.keys(this.defaultDimensions), - ...Object.keys(this.dimensions), + ...new Set([ + ...Object.keys(this.defaultDimensions), + ...Object.keys(this.dimensions), + ]), ]; return { diff --git a/packages/metrics/tests/unit/Metrics.test.ts b/packages/metrics/tests/unit/Metrics.test.ts index 81808a0f5c..936ea142eb 100644 --- a/packages/metrics/tests/unit/Metrics.test.ts +++ b/packages/metrics/tests/unit/Metrics.test.ts @@ -466,9 +466,7 @@ describe('Class: Metrics', () => { } // Act & Assess - expect(() => - metrics.addDimensions(dimensionsToBeAdded) - ).not.toThrowError(); + metrics.addDimensions(dimensionsToBeAdded); expect(Object.keys(metrics['dimensions']).length).toBe( MAX_DIMENSION_COUNT ); @@ -1505,6 +1503,53 @@ describe('Class: Metrics', () => { }); }); + test('it should log dimensions once when default dimensions are set and addDimension is called', () => { + // Prepare + const additionalDimensions = { + foo: 'bar', + env: 'dev', + }; + const testMetric = 'test-metric'; + const metrics: Metrics = new Metrics({ + defaultDimensions: additionalDimensions, + namespace: TEST_NAMESPACE, + }); + + // Act + metrics.addMetric(testMetric, MetricUnits.Count, 10); + metrics.addDimension('foo', 'baz'); + const loggedData = metrics.serializeMetrics(); + + // Assess + expect(loggedData._aws.CloudWatchMetrics[0].Dimensions[0].length).toEqual( + 3 + ); + expect(loggedData.service).toEqual(defaultServiceName); + expect(loggedData.foo).toEqual('baz'); + expect(loggedData.env).toEqual(additionalDimensions.env); + expect(loggedData).toEqual({ + _aws: { + CloudWatchMetrics: [ + { + Dimensions: [['service', 'foo', 'env']], + Metrics: [ + { + Name: testMetric, + Unit: MetricUnits.Count, + }, + ], + Namespace: TEST_NAMESPACE, + }, + ], + Timestamp: mockDate.getTime(), + }, + service: 'service_undefined', + [testMetric]: 10, + env: 'dev', + foo: 'baz', + }); + }); + test('it should log additional dimensions correctly', () => { // Prepare const testMetric = 'test-metric';