Skip to content

Commit 9002122

Browse files
feat(alarm): Make AlarmNamingStrategy customizable (#316)
Making the AlarmNamingStrategy configurable. My team wants to add the disambiguator to the alarm dedupe string. This requires custom logic for generating the deduplication string, which is why we want to be able to override this class's functionality. _By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license_
1 parent cb2bca9 commit 9002122

File tree

6 files changed

+164
-16
lines changed

6 files changed

+164
-16
lines changed

API.md

Lines changed: 82 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/common/alarm/AlarmFactory.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
IAlarmAnnotationStrategy,
2020
} from "./IAlarmAnnotationStrategy";
2121
import { IAlarmDedupeStringProcessor } from "./IAlarmDedupeStringProcessor";
22+
import { IAlarmNamingStrategy } from "./IAlarmNamingStrategy";
2223
import { noopAction } from "./NoopAlarmActionStrategy";
2324
import {
2425
MetricFactoryDefaults,
@@ -403,6 +404,13 @@ export interface AlarmFactoryDefaults {
403404
*/
404405
readonly dedupeStringProcessor?: IAlarmDedupeStringProcessor;
405406

407+
/**
408+
* Custom strategy to name alarms
409+
*
410+
* @default - default behaviour (no change)
411+
*/
412+
readonly alarmNamingStrategy?: IAlarmNamingStrategy;
413+
406414
/**
407415
* Number of breaches required to transition into an ALARM state.
408416
*
@@ -460,17 +468,19 @@ export class AlarmFactory {
460468
protected readonly alarmScope: Construct;
461469
protected readonly globalAlarmDefaults: AlarmFactoryDefaults;
462470
protected readonly globalMetricDefaults: MetricFactoryDefaults;
463-
protected readonly alarmNamingStrategy: AlarmNamingStrategy;
471+
protected readonly alarmNamingStrategy: IAlarmNamingStrategy;
464472

465473
constructor(alarmScope: Construct, props: AlarmFactoryProps) {
466474
this.alarmScope = alarmScope;
467475
this.globalAlarmDefaults = props.globalAlarmDefaults;
468476
this.globalMetricDefaults = props.globalMetricDefaults;
469-
this.alarmNamingStrategy = new AlarmNamingStrategy(
470-
props.globalAlarmDefaults.alarmNamePrefix,
471-
props.localAlarmNamePrefix,
472-
props.globalAlarmDefaults.dedupeStringProcessor
473-
);
477+
this.alarmNamingStrategy =
478+
props.globalAlarmDefaults.alarmNamingStrategy ??
479+
new AlarmNamingStrategy(
480+
props.globalAlarmDefaults.alarmNamePrefix,
481+
props.localAlarmNamePrefix,
482+
props.globalAlarmDefaults.dedupeStringProcessor
483+
);
474484
}
475485

476486
addAlarm(

lib/common/alarm/AlarmNamingStrategy.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,12 @@ import {
22
DoNotModifyDedupeString,
33
IAlarmDedupeStringProcessor,
44
} from "./IAlarmDedupeStringProcessor";
5+
import { AlarmNamingInput, IAlarmNamingStrategy } from "./IAlarmNamingStrategy";
56

67
const AlarmNamePartSeparator = "-";
78
const AlarmLabelPartSeparator = " ";
89

9-
export interface AlarmNamingInput {
10-
readonly alarmNameSuffix: string;
11-
readonly alarmNameOverride?: string;
12-
readonly alarmDedupeStringSuffix?: string;
13-
readonly dedupeStringOverride?: string;
14-
readonly disambiguator?: string;
15-
}
16-
17-
export class AlarmNamingStrategy {
10+
export class AlarmNamingStrategy implements IAlarmNamingStrategy {
1811
protected readonly globalPrefix: string;
1912
protected readonly localPrefix: string;
2013
protected readonly dedupeStringStrategy: IAlarmDedupeStringProcessor;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
export interface AlarmNamingInput {
2+
readonly alarmNameSuffix: string;
3+
readonly alarmNameOverride?: string;
4+
readonly alarmDedupeStringSuffix?: string;
5+
readonly dedupeStringOverride?: string;
6+
readonly disambiguator?: string;
7+
}
8+
9+
/**
10+
* Strategy used to name alarms, their widgets, and their dedupe strings.
11+
*/
12+
export interface IAlarmNamingStrategy {
13+
/**
14+
* How to generate the name of an alarm.
15+
*
16+
* @param props AlarmNamingInput
17+
*/
18+
getName(props: AlarmNamingInput): string;
19+
20+
/**
21+
* How to generate the label for the alarm displayed on a widget.
22+
*
23+
* @param props AlarmNamingInput
24+
*/
25+
getWidgetLabel(props: AlarmNamingInput): string;
26+
27+
/**
28+
* How to generate the deduplication string for an alarm.
29+
*/
30+
getDedupeString(props: AlarmNamingInput): string | undefined;
31+
}

lib/common/alarm/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export * from "./CustomAlarmThreshold";
44
export * from "./IAlarmActionStrategy";
55
export * from "./IAlarmAnnotationStrategy";
66
export * from "./IAlarmDedupeStringProcessor";
7+
export * from "./IAlarmNamingStrategy";
78
export * from "./MultipleAlarmActionStrategy";
89
export * from "./NoopAlarmActionStrategy";
910
export * from "./OpsItemAlarmActionStrategy";

test/common/alarm/AlarmFactory.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import {
1414
AddAlarmProps,
1515
AlarmFactory,
1616
AlarmFactoryDefaults,
17+
AlarmNamingInput,
1718
CompositeAlarmOperator,
19+
IAlarmNamingStrategy,
1820
MetricFactoryDefaults,
1921
multipleActions,
2022
noopAction,
@@ -409,3 +411,33 @@ test("addAlarm: disambigatorAction takes precedence over default action", () =>
409411

410412
expect(alarm.action).toStrictEqual(snsAction);
411413
});
414+
415+
test("addAlarm: custom alarm naming strategy", () => {
416+
const alarmName = "alarmName";
417+
const alarmLabel = "alarmLabel";
418+
const alarmDedupe = "alarmDedupe";
419+
const disambiguator = "Critical";
420+
const stack = new Stack();
421+
const customNamingStrategy: IAlarmNamingStrategy = {
422+
getName: (props: AlarmNamingInput) => `${alarmName}-${props.disambiguator}`,
423+
getWidgetLabel: (props: AlarmNamingInput) =>
424+
`${alarmLabel}-${props.disambiguator}`,
425+
getDedupeString: (props: AlarmNamingInput) =>
426+
`${alarmDedupe}-${props.disambiguator}`,
427+
};
428+
const factory = new AlarmFactory(stack, {
429+
globalMetricDefaults,
430+
globalAlarmDefaults: {
431+
...globalAlarmDefaultsWithDisambiguator,
432+
alarmNamingStrategy: customNamingStrategy,
433+
},
434+
localAlarmNamePrefix: "prefix",
435+
});
436+
const alarm = factory.addAlarm(metric, {
437+
...props,
438+
disambiguator,
439+
});
440+
expect(alarm.alarmName).toBe(`${alarmName}-${disambiguator}`);
441+
expect(alarm.alarmLabel).toBe(`${alarmLabel}-${disambiguator}`);
442+
expect(alarm.dedupeString).toBe(`${alarmDedupe}-${disambiguator}`);
443+
});

0 commit comments

Comments
 (0)