Skip to content

Commit 12f3e44

Browse files
authored
feat(metrics): warn when overwriting dimension (#3352)
1 parent a403567 commit 12f3e44

File tree

2 files changed

+29
-25
lines changed

2 files changed

+29
-25
lines changed

Diff for: packages/metrics/src/Metrics.ts

+10-18
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,14 @@ class Metrics extends Utility implements MetricsInterface {
239239
`The number of metric dimensions must be lower than ${MAX_DIMENSION_COUNT}`
240240
);
241241
}
242+
if (
243+
Object.hasOwn(this.dimensions, name) ||
244+
Object.hasOwn(this.defaultDimensions, name)
245+
) {
246+
this.#logger.warn(
247+
`Dimension "${name}" has already been added. The previous value will be overwritten.`
248+
);
249+
}
242250
this.dimensions[name] = value;
243251
}
244252

@@ -255,25 +263,9 @@ class Metrics extends Utility implements MetricsInterface {
255263
* @param dimensions - An object with key-value pairs of dimensions
256264
*/
257265
public addDimensions(dimensions: Dimensions): void {
258-
const newDimensions = { ...this.dimensions };
259-
for (const dimensionName of Object.keys(dimensions)) {
260-
const value = dimensions[dimensionName];
261-
if (value) {
262-
newDimensions[dimensionName] = value;
263-
} else {
264-
this.#logger.warn(
265-
`The dimension ${dimensionName} doesn't meet the requirements and won't be added. Ensure the dimension name and value are non empty strings`
266-
);
267-
}
268-
}
269-
if (Object.keys(newDimensions).length > MAX_DIMENSION_COUNT) {
270-
throw new RangeError(
271-
`Unable to add ${
272-
Object.keys(dimensions).length
273-
} dimensions: the number of metric dimensions must be lower than ${MAX_DIMENSION_COUNT}`
274-
);
266+
for (const [name, value] of Object.entries(dimensions)) {
267+
this.addDimension(name, value);
275268
}
276-
this.dimensions = newDimensions;
277269
}
278270

279271
/**

Diff for: packages/metrics/tests/unit/Metrics.test.ts

+19-7
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
*
44
* @group unit/metrics/class
55
*/
6-
import type { LambdaInterface } from '@aws-lambda-powertools/commons/types';
6+
import type {
7+
GenericLogger,
8+
LambdaInterface,
9+
} from '@aws-lambda-powertools/commons/types';
710
import context from '@aws-lambda-powertools/testing-utils/context';
811
import type { Context, Handler } from 'aws-lambda';
912
import { EnvironmentVariablesService } from '../../src/config/EnvironmentVariablesService.js';
@@ -350,7 +353,13 @@ describe('Class: Metrics', () => {
350353

351354
test('it should update existing dimension value if same dimension is added again', () => {
352355
// Prepare
353-
const metrics: Metrics = new Metrics({ namespace: TEST_NAMESPACE });
356+
const logger = {
357+
warn: jest.fn(),
358+
} as unknown as GenericLogger;
359+
const metrics: Metrics = new Metrics({
360+
namespace: TEST_NAMESPACE,
361+
logger,
362+
});
354363
const dimensionName = 'test-dimension';
355364

356365
// Act
@@ -365,6 +374,9 @@ describe('Class: Metrics', () => {
365374
},
366375
})
367376
);
377+
expect(logger.warn).toHaveBeenCalledWith(
378+
`Dimension "test-dimension" has already been added. The previous value will be overwritten.`
379+
);
368380
});
369381

370382
test('it should throw error if the number of dimensions exceeds the maximum allowed', () => {
@@ -521,7 +533,7 @@ describe('Class: Metrics', () => {
521533
const dimensionName = 'test-dimension';
522534
const dimensionValue = 'test-value';
523535
const dimensionsToBeAdded: LooseObject = {};
524-
for (let i = 0; i < MAX_DIMENSION_COUNT; i++) {
536+
for (let i = 0; i < MAX_DIMENSION_COUNT - 1; i++) {
525537
dimensionsToBeAdded[`${dimensionName}-${i}`] = `${dimensionValue}-${i}`;
526538
}
527539

@@ -531,7 +543,7 @@ describe('Class: Metrics', () => {
531543
).not.toThrowError();
532544
// biome-ignore lint/complexity/useLiteralKeys: This needs to be accessed with literal key for testing
533545
expect(Object.keys(metrics['dimensions']).length).toBe(
534-
MAX_DIMENSION_COUNT
546+
MAX_DIMENSION_COUNT - 1 // Starts from 1 because the service dimension is already added by default
535547
);
536548
});
537549

@@ -541,22 +553,22 @@ describe('Class: Metrics', () => {
541553
const dimensionName = 'test-dimension';
542554
const dimensionValue = 'test-value';
543555
const dimensionsToBeAdded: LooseObject = {};
544-
for (let i = 0; i < MAX_DIMENSION_COUNT; i++) {
556+
for (let i = 0; i < MAX_DIMENSION_COUNT - 1; i++) {
545557
dimensionsToBeAdded[`${dimensionName}-${i}`] = `${dimensionValue}-${i}`;
546558
}
547559

548560
// Act & Assess
549561
metrics.addDimensions(dimensionsToBeAdded);
550562
// biome-ignore lint/complexity/useLiteralKeys: This needs to be accessed with literal key for testing
551563
expect(Object.keys(metrics['dimensions']).length).toBe(
552-
MAX_DIMENSION_COUNT
564+
MAX_DIMENSION_COUNT - 1 // Starts from 1 because the service dimension is already added by default
553565
);
554566
expect(() =>
555567
metrics.addDimensions({
556568
'another-dimension': 'another-dimension-value',
557569
})
558570
).toThrowError(
559-
`Unable to add 1 dimensions: the number of metric dimensions must be lower than ${MAX_DIMENSION_COUNT}`
571+
`The number of metric dimensions must be lower than ${MAX_DIMENSION_COUNT}`
560572
);
561573
});
562574

0 commit comments

Comments
 (0)