Skip to content

Commit 901f3f3

Browse files
author
Eugene Cheung
authored
feat(lambda): include enhanced CPU and memory alarm annotations in dashboard (#298)
Closes #292 --- _By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license_
1 parent d7a3cd4 commit 901f3f3

File tree

3 files changed

+1847
-162
lines changed

3 files changed

+1847
-162
lines changed

lib/monitoring/aws-lambda/LambdaFunctionMonitoring.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,7 @@ export class LambdaFunctionMonitoring extends Monitoring {
640640
/* eslint-enable @typescript-eslint/no-non-null-assertion */
641641
],
642642
leftYAxis: TimeAxisMillisFromZero,
643+
leftAnnotations: this.cpuTotalTimeAnnotations,
643644
});
644645
}
645646

@@ -656,6 +657,7 @@ export class LambdaFunctionMonitoring extends Monitoring {
656657
/* eslint-enable @typescript-eslint/no-non-null-assertion */
657658
],
658659
leftYAxis: PercentageAxisFromZeroToHundred,
660+
leftAnnotations: this.memoryUsageAnnotations,
659661
});
660662
}
661663

test/monitoring/aws-lambda/LambdaFunctionMonitoring.test.ts

Lines changed: 130 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
} from "aws-cdk-lib/aws-lambda";
1010

1111
import { AlarmWithAnnotation, LambdaFunctionMonitoring } from "../../../lib";
12+
import { addMonitoringDashboardsToStack } from "../../utils/SnapshotUtil";
1213
import { TestMonitoringScope } from "../TestMonitoringScope";
1314

1415
test("snapshot test: no alarms", () => {
@@ -55,7 +56,7 @@ test("snapshot test: all alarms", () => {
5556

5657
let numAlarmsCreated = 0;
5758

58-
new LambdaFunctionMonitoring(scope, {
59+
const monitoring = new LambdaFunctionMonitoring(scope, {
5960
lambdaFunction,
6061
humanReadableName: "Dummy Lambda for testing",
6162
alarmFriendlyName: "DummyLambda",
@@ -143,6 +144,7 @@ test("snapshot test: all alarms", () => {
143144
},
144145
});
145146

147+
addMonitoringDashboardsToStack(stack, monitoring);
146148
expect(numAlarmsCreated).toStrictEqual(13);
147149
expect(Template.fromStack(stack)).toMatchSnapshot();
148150
});
@@ -201,10 +203,11 @@ test("snapshot test: all alarms, alarmPrefix on error dedupeString", () => {
201203

202204
let numAlarmsCreated = 0;
203205

204-
new LambdaFunctionMonitoring(scope, {
206+
const monitoring = new LambdaFunctionMonitoring(scope, {
205207
lambdaFunction,
206208
humanReadableName: "Dummy Lambda for testing",
207209
alarmFriendlyName: "DummyLambda",
210+
lambdaInsightsEnabled: true,
208211
addFaultRateAlarm: {
209212
Warning: {
210213
maxErrorRate: 1,
@@ -282,14 +285,45 @@ test("snapshot test: all alarms, alarmPrefix on error dedupeString", () => {
282285
maxAgeInMillis: 1_000_000,
283286
},
284287
},
288+
addEnhancedMonitoringMaxCpuTotalTimeAlarm: {
289+
Warning: {
290+
maxDuration: Duration.millis(100),
291+
},
292+
},
293+
addEnhancedMonitoringP90CpuTotalTimeAlarm: {
294+
Warning: {
295+
maxDuration: Duration.millis(100),
296+
},
297+
},
298+
addEnhancedMonitoringAvgCpuTotalTimeAlarm: {
299+
Warning: {
300+
maxDuration: Duration.millis(100),
301+
},
302+
},
303+
addEnhancedMonitoringMaxMemoryUtilizationAlarm: {
304+
Warning: {
305+
maxUsagePercent: 50,
306+
},
307+
},
308+
addEnhancedMonitoringP90MemoryUtilizationAlarm: {
309+
Warning: {
310+
maxUsagePercent: 50,
311+
},
312+
},
313+
addEnhancedMonitoringAvgMemoryUtilizationAlarm: {
314+
Warning: {
315+
maxUsagePercent: 50,
316+
},
317+
},
285318
useCreatedAlarms: {
286319
consume(alarms: AlarmWithAnnotation[]) {
287320
numAlarmsCreated = alarms.length;
288321
},
289322
},
290323
});
291324

292-
expect(numAlarmsCreated).toStrictEqual(13);
325+
addMonitoringDashboardsToStack(stack, monitoring);
326+
expect(numAlarmsCreated).toStrictEqual(19);
293327
expect(Template.fromStack(stack)).toMatchSnapshot();
294328
});
295329

@@ -307,10 +341,11 @@ test("snapshot test: all alarms, alarmPrefix on latency dedupeString", () => {
307341

308342
let numAlarmsCreated = 0;
309343

310-
new LambdaFunctionMonitoring(scope, {
344+
const monitoring = new LambdaFunctionMonitoring(scope, {
311345
lambdaFunction,
312346
humanReadableName: "Dummy Lambda for testing",
313347
alarmFriendlyName: "DummyLambda",
348+
lambdaInsightsEnabled: true,
314349
addFaultRateAlarm: {
315350
Warning: {
316351
maxErrorRate: 1,
@@ -388,13 +423,103 @@ test("snapshot test: all alarms, alarmPrefix on latency dedupeString", () => {
388423
maxAgeInMillis: 1_000_000,
389424
},
390425
},
426+
addEnhancedMonitoringMaxCpuTotalTimeAlarm: {
427+
Warning: {
428+
maxDuration: Duration.millis(100),
429+
},
430+
},
431+
addEnhancedMonitoringP90CpuTotalTimeAlarm: {
432+
Warning: {
433+
maxDuration: Duration.millis(100),
434+
},
435+
},
436+
addEnhancedMonitoringAvgCpuTotalTimeAlarm: {
437+
Warning: {
438+
maxDuration: Duration.millis(100),
439+
},
440+
},
441+
addEnhancedMonitoringMaxMemoryUtilizationAlarm: {
442+
Warning: {
443+
maxUsagePercent: 50,
444+
},
445+
},
446+
addEnhancedMonitoringP90MemoryUtilizationAlarm: {
447+
Warning: {
448+
maxUsagePercent: 50,
449+
},
450+
},
451+
addEnhancedMonitoringAvgMemoryUtilizationAlarm: {
452+
Warning: {
453+
maxUsagePercent: 50,
454+
},
455+
},
391456
useCreatedAlarms: {
392457
consume(alarms: AlarmWithAnnotation[]) {
393458
numAlarmsCreated = alarms.length;
394459
},
395460
},
396461
});
397462

398-
expect(numAlarmsCreated).toStrictEqual(13);
463+
addMonitoringDashboardsToStack(stack, monitoring);
464+
expect(numAlarmsCreated).toStrictEqual(19);
399465
expect(Template.fromStack(stack)).toMatchSnapshot();
400466
});
467+
468+
test("doesn't create alarms for enhanced Lambda Insights metrics if not enabled", () => {
469+
const stack = new Stack();
470+
471+
const scope = new TestMonitoringScope(stack, "Scope");
472+
473+
const lambdaFunction = new Function(stack, "Function", {
474+
functionName: "DummyLambda",
475+
runtime: Runtime.NODEJS_12_X,
476+
code: InlineCode.fromInline("{}"),
477+
handler: "Dummy::handler",
478+
});
479+
480+
let numAlarmsCreated = 0;
481+
482+
new LambdaFunctionMonitoring(scope, {
483+
lambdaFunction,
484+
humanReadableName: "Dummy Lambda for testing",
485+
alarmFriendlyName: "DummyLambda",
486+
lambdaInsightsEnabled: false,
487+
addEnhancedMonitoringMaxCpuTotalTimeAlarm: {
488+
Warning: {
489+
maxDuration: Duration.millis(100),
490+
},
491+
},
492+
addEnhancedMonitoringP90CpuTotalTimeAlarm: {
493+
Warning: {
494+
maxDuration: Duration.millis(100),
495+
},
496+
},
497+
addEnhancedMonitoringAvgCpuTotalTimeAlarm: {
498+
Warning: {
499+
maxDuration: Duration.millis(100),
500+
},
501+
},
502+
addEnhancedMonitoringMaxMemoryUtilizationAlarm: {
503+
Warning: {
504+
maxUsagePercent: 50,
505+
},
506+
},
507+
addEnhancedMonitoringP90MemoryUtilizationAlarm: {
508+
Warning: {
509+
maxUsagePercent: 50,
510+
},
511+
},
512+
addEnhancedMonitoringAvgMemoryUtilizationAlarm: {
513+
Warning: {
514+
maxUsagePercent: 50,
515+
},
516+
},
517+
useCreatedAlarms: {
518+
consume(alarms: AlarmWithAnnotation[]) {
519+
numAlarmsCreated = alarms.length;
520+
},
521+
},
522+
});
523+
524+
expect(numAlarmsCreated).toStrictEqual(0);
525+
});

0 commit comments

Comments
 (0)