Skip to content

Commit 3ce4dbd

Browse files
author
Eugene Cheung
authored
feat(lambda): allow alarming on max latency (#486)
Closes #448 This also aligns how we create/present latency metrics with how we do it for other things like API Gateway. --- _By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license_
1 parent 01e865f commit 3ce4dbd

File tree

9 files changed

+330
-86
lines changed

9 files changed

+330
-86
lines changed

API.md

Lines changed: 55 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/common/monitoring/alarms/LatencyAlarmFactory.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export enum LatencyType {
2828
TM999_TOP = "TM(99.9%:100%)",
2929
TM9999_TOP = "TM(99.99%:100%)",
3030
AVERAGE = "Average",
31+
MAX = "Maximum",
3132
}
3233

3334
export function getLatencyTypeStatistic(latencyType: LatencyType) {
@@ -72,6 +73,8 @@ export function getLatencyTypeStatistic(latencyType: LatencyType) {
7273
return MetricStatistic.TM9999_TOP;
7374
case LatencyType.AVERAGE:
7475
return MetricStatistic.AVERAGE;
76+
case LatencyType.MAX:
77+
return MetricStatistic.MAX;
7578
default:
7679
throw new Error(
7780
"Unsupported latency type (unknown statistic): " + latencyType
@@ -90,10 +93,12 @@ export function getLatencyTypeExpressionId(latencyType: LatencyType) {
9093
case LatencyType.P9999:
9194
case LatencyType.P100:
9295
// remove the P prefix
93-
return latencyType.substr(1);
96+
return latencyType.substring(1);
9497
case LatencyType.AVERAGE:
9598
// making it shorter for backwards compatibility
9699
return "Avg";
100+
case LatencyType.MAX:
101+
return "Max";
97102
default:
98103
// use as-is
99104
return latencyType;
@@ -119,6 +124,8 @@ export function getLatencyTypeLabel(latencyType: LatencyType) {
119124
case LatencyType.AVERAGE:
120125
// no suffix here, since we already have average
121126
return "Average";
127+
case LatencyType.MAX:
128+
return "Maximum";
122129
default:
123130
// use as-is
124131
return latencyType + averageSuffix;

lib/monitoring/aws-apigateway/ApiGatewayMetricFactory.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,21 +138,21 @@ export class ApiGatewayMetricFactory {
138138
}
139139

140140
/**
141-
* @deprecated use metricLatencyInMillis instead
141+
* @deprecated Use {@link metricLatencyInMillis} instead.
142142
*/
143143
metricLatencyP99InMillis() {
144144
return this.metricLatencyInMillis(LatencyType.P99);
145145
}
146146

147147
/**
148-
* @deprecated use metricLatencyInMillis instead
148+
* @deprecated Use {@link metricLatencyInMillis} instead.
149149
*/
150150
metricLatencyP90InMillis() {
151151
return this.metricLatencyInMillis(LatencyType.P90);
152152
}
153153

154154
/**
155-
* @deprecated use metricLatencyInMillis instead
155+
* @deprecated Use {@link metricLatencyInMillis} instead.
156156
*/
157157
metricLatencyP50InMillis() {
158158
return this.metricLatencyInMillis(LatencyType.P50);

lib/monitoring/aws-apigatewayv2/ApiGatewayV2HttpApiMetricFactory.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,42 +133,42 @@ export class ApiGatewayV2HttpApiMetricFactory {
133133
}
134134

135135
/**
136-
* @deprecated use metricLatencyInMillis instead
136+
* @deprecated Use {@link metricLatencyInMillis} instead.
137137
*/
138138
metricLatencyP50InMillis() {
139139
return this.metricLatencyInMillis(LatencyType.P50);
140140
}
141141

142142
/**
143-
* @deprecated use metricLatencyInMillis instead
143+
* @deprecated Use {@link metricLatencyInMillis} instead.
144144
*/
145145
metricLatencyP90InMillis() {
146146
return this.metricLatencyInMillis(LatencyType.P90);
147147
}
148148

149149
/**
150-
* @deprecated use metricLatencyInMillis instead
150+
* @deprecated Use {@link metricLatencyInMillis} instead.
151151
*/
152152
metricLatencyP99InMillis() {
153153
return this.metricLatencyInMillis(LatencyType.P99);
154154
}
155155

156156
/**
157-
* @deprecated use metricIntegrationLatencyInMillis instead
157+
* @deprecated Use {@link metricIntegrationLatencyInMillis} instead.
158158
*/
159159
metricIntegrationLatencyP50InMillis() {
160160
return this.metricIntegrationLatencyInMillis(LatencyType.P50);
161161
}
162162

163163
/**
164-
* @deprecated use metricIntegrationLatencyInMillis instead
164+
* @deprecated Use {@link metricIntegrationLatencyInMillis} instead.
165165
*/
166166
metricIntegrationLatencyP90InMillis() {
167167
return this.metricIntegrationLatencyInMillis(LatencyType.P90);
168168
}
169169

170170
/**
171-
* @deprecated use metricIntegrationLatencyInMillis instead
171+
* @deprecated Use {@link metricIntegrationLatencyInMillis} instead.
172172
*/
173173
metricIntegrationLatencyP99InMillis() {
174174
return this.metricIntegrationLatencyInMillis(LatencyType.P99);

lib/monitoring/aws-lambda/LambdaFunctionMetricFactory.ts

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import { IFunction } from "aws-cdk-lib/aws-lambda";
22

33
import {
4+
LatencyType,
45
MetricFactory,
56
MetricStatistic,
67
RateComputationMethod,
8+
getLatencyTypeLabel,
9+
getLatencyTypeStatistic,
710
} from "../../common";
811

912
export interface LambdaFunctionMetricFactoryProps {
@@ -45,7 +48,7 @@ export class LambdaFunctionMetricFactory {
4548
}
4649

4750
/**
48-
* @deprecated use metricInvocationRate
51+
* @deprecated Use {@link metricInvocationRate} instead.
4952
*/
5053
metricTps() {
5154
return this.metricFactory.toRate(
@@ -111,31 +114,34 @@ export class LambdaFunctionMetricFactory {
111114
);
112115
}
113116

114-
metricLatencyP99InMillis() {
117+
metricLatencyInMillis(latencyType: LatencyType) {
115118
return this.metricFactory.adaptMetric(
116119
this.lambdaFunction.metricDuration({
117-
statistic: MetricStatistic.P99,
118-
label: "P99",
120+
statistic: getLatencyTypeStatistic(latencyType),
121+
label: getLatencyTypeLabel(latencyType),
119122
})
120123
);
121124
}
122125

126+
/**
127+
* @deprecated Use {@link metricLatencyInMillis} instead.
128+
*/
129+
metricLatencyP99InMillis() {
130+
return this.metricLatencyInMillis(LatencyType.P99);
131+
}
132+
133+
/**
134+
* @deprecated Use {@link metricLatencyInMillis} instead.
135+
*/
123136
metricLatencyP90InMillis() {
124-
return this.metricFactory.adaptMetric(
125-
this.lambdaFunction.metricDuration({
126-
statistic: MetricStatistic.P90,
127-
label: "P90",
128-
})
129-
);
137+
return this.metricLatencyInMillis(LatencyType.P90);
130138
}
131139

140+
/**
141+
* @deprecated Use {@link metricLatencyInMillis} instead.
142+
*/
132143
metricLatencyP50InMillis() {
133-
return this.metricFactory.adaptMetric(
134-
this.lambdaFunction.metricDuration({
135-
statistic: MetricStatistic.P50,
136-
label: "P50",
137-
})
138-
);
144+
return this.metricLatencyInMillis(LatencyType.P50);
139145
}
140146

141147
metricConcurrentExecutions() {

lib/monitoring/aws-lambda/LambdaFunctionMonitoring.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export interface LambdaFunctionMonitoringOptions extends BaseMonitoringProps {
5656
readonly addLatencyP50Alarm?: Record<string, LatencyThreshold>;
5757
readonly addLatencyP90Alarm?: Record<string, LatencyThreshold>;
5858
readonly addLatencyP99Alarm?: Record<string, LatencyThreshold>;
59+
readonly addMaxLatencyAlarm?: Record<string, LatencyThreshold>;
5960

6061
readonly addFaultCountAlarm?: Record<string, ErrorCountThreshold>;
6162
readonly addFaultRateAlarm?: Record<string, ErrorRateThreshold>;
@@ -143,6 +144,7 @@ export class LambdaFunctionMonitoring extends Monitoring {
143144
readonly p50LatencyMetric: MetricWithAlarmSupport;
144145
readonly p90LatencyMetric: MetricWithAlarmSupport;
145146
readonly p99LatencyMetric: MetricWithAlarmSupport;
147+
readonly maxLatencyMetric: MetricWithAlarmSupport;
146148
readonly faultCountMetric: MetricWithAlarmSupport;
147149
readonly faultRateMetric: MetricWithAlarmSupport;
148150
readonly invocationCountMetric: MetricWithAlarmSupport;
@@ -202,9 +204,18 @@ export class LambdaFunctionMonitoring extends Monitoring {
202204
props
203205
);
204206
this.tpsMetric = this.metricFactory.metricTps();
205-
this.p50LatencyMetric = this.metricFactory.metricLatencyP50InMillis();
206-
this.p90LatencyMetric = this.metricFactory.metricLatencyP90InMillis();
207-
this.p99LatencyMetric = this.metricFactory.metricLatencyP99InMillis();
207+
this.p50LatencyMetric = this.metricFactory.metricLatencyInMillis(
208+
LatencyType.P50
209+
);
210+
this.p90LatencyMetric = this.metricFactory.metricLatencyInMillis(
211+
LatencyType.P90
212+
);
213+
this.p99LatencyMetric = this.metricFactory.metricLatencyInMillis(
214+
LatencyType.P99
215+
);
216+
this.maxLatencyMetric = this.metricFactory.metricLatencyInMillis(
217+
LatencyType.MAX
218+
);
208219
this.faultCountMetric = this.metricFactory.metricFaultCount();
209220
this.faultRateMetric = this.metricFactory.metricFaultRate();
210221
this.invocationCountMetric = this.metricFactory.metricInvocationCount();
@@ -359,6 +370,18 @@ export class LambdaFunctionMonitoring extends Monitoring {
359370
this.latencyAnnotations.push(createdAlarm.annotation);
360371
this.addAlarm(createdAlarm);
361372
}
373+
for (const disambiguator in props.addMaxLatencyAlarm) {
374+
const alarmProps = props.addMaxLatencyAlarm[disambiguator];
375+
const createdAlarm = this.latencyAlarmFactory.addLatencyAlarm(
376+
this.maxLatencyMetric,
377+
LatencyType.MAX,
378+
alarmProps,
379+
disambiguator
380+
);
381+
this.latencyAnnotations.push(createdAlarm.annotation);
382+
this.addAlarm(createdAlarm);
383+
}
384+
362385
for (const disambiguator in props.addFaultCountAlarm) {
363386
const alarmProps = props.addFaultCountAlarm[disambiguator];
364387
const createdAlarm = this.errorAlarmFactory.addErrorCountAlarm(

0 commit comments

Comments
 (0)