@renovosolutions/cdk-library-cloudwatch-alarms
Version:
AWS CDK Construct Library to automatically create CloudWatch Alarms for resources in a CDK app based on resource type.
576 lines • 93.4 kB
JavaScript
"use strict";
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ApiGatewayRecommendedAlarmsAspect = exports.RestApi = exports.ApiGatewayRestApiRecommendedAlarms = exports.ApiGatewayRestApiDetailedLatencyAlarm = exports.ApiGatewayRestApiDetailedCountAlarm = exports.ApiGatewayRestApiLatencyAlarm = exports.ApiGatewayRestApiCountAlarm = exports.ApiGatewayRestApi5XXErrorAlarm = exports.ApiGatewayRestApi4XXErrorAlarm = exports.ApiGatewayRecommendedAlarmsMetrics = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs_1 = require("constructs");
const common_1 = require("./common");
/**
* The recommended metrics for ApiGateway alarms.
*/
var ApiGatewayRecommendedAlarmsMetrics;
(function (ApiGatewayRecommendedAlarmsMetrics) {
/**
* The number of client-side errors captured in a given period.
*/
ApiGatewayRecommendedAlarmsMetrics["ERROR_4XX"] = "4XXError";
/**
* The number of server-side errors captured in a given period.
*/
ApiGatewayRecommendedAlarmsMetrics["ERROR_5XX"] = "5XXError";
/**
* The total number API requests in a given period.
*/
ApiGatewayRecommendedAlarmsMetrics["COUNT"] = "Count";
/**
* The time (milliseconds) between when API Gateway receives a request from a client and
* when it returns a response to the client. The latency includes the integration latency
* and other API Gateway overhead.
*/
ApiGatewayRecommendedAlarmsMetrics["LATENCY"] = "Latency";
})(ApiGatewayRecommendedAlarmsMetrics || (exports.ApiGatewayRecommendedAlarmsMetrics = ApiGatewayRecommendedAlarmsMetrics = {}));
/**
* This alarm detects a high number of client-side errors.
*
* This can indicate an issue in the authorization or client request parameters. It could also mean that a resource was
* removed or a client is requesting one that doesn't exist. Consider enabling CloudWatch Logs and checking for any errors
* that may be causing the 4XX errors. Moreover, consider enabling detailed CloudWatch metrics to view this metric per
* resource and method and narrow down the source of the errors. Errors could also be caused by exceeding the configured
* throttling limit.
*
* The alarm is triggered when number of client-errors exceeds the threshold.
*/
class ApiGatewayRestApi4XXErrorAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.api.restApiName} - ${ApiGatewayRecommendedAlarmsMetrics.ERROR_4XX}`;
const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1);
const evaluationPeriods = props.evaluationPeriods ?? 5;
const datapointsToAlarm = props.datapointsToAlarm ?? 5;
const threshold = props.threshold;
const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING;
const alarmDescription = props.alarmDescription ?? 'This alarm can detect high rates of client-side errors for the'
+ ' API Gateway requests.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: props.api.metricClientError({
dimensionsMap: {
ApiName: props.api.restApiName,
Stage: props.api.deploymentStage.stageName,
},
statistic: 'Average',
period,
}),
threshold,
evaluationPeriods,
datapointsToAlarm,
treatMissingData,
comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
alarmDescription,
});
if (props.alarmAction)
this.addAlarmAction(props.alarmAction);
if (props.okAction)
this.addOkAction(props.okAction);
if (props.insufficientDataAction)
this.addInsufficientDataAction(props.insufficientDataAction);
}
}
exports.ApiGatewayRestApi4XXErrorAlarm = ApiGatewayRestApi4XXErrorAlarm;
_a = JSII_RTTI_SYMBOL_1;
ApiGatewayRestApi4XXErrorAlarm[_a] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApiGatewayRestApi4XXErrorAlarm", version: "0.0.13" };
;
/**
* This alarm detects a high number of server-side errors.
*
* This can indicate that there is something wrong on the API backend, the network,
* or the integration between the API gateway and the backend API.
*
* The alarm is triggered when number of server-errors exceeds the threshold.
*/
class ApiGatewayRestApi5XXErrorAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.api.restApiName} - ${ApiGatewayRecommendedAlarmsMetrics.ERROR_5XX}`;
const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1);
const evaluationPeriods = props.evaluationPeriods ?? 3;
const datapointsToAlarm = props.datapointsToAlarm ?? 3;
const threshold = props.threshold;
const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING;
const alarmDescription = props.alarmDescription ?? 'This alarm can detect high rates of server-side errors for the'
+ ' API Gateway requests.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: props.api.metricServerError({
dimensionsMap: {
ApiName: props.api.restApiName,
Stage: props.api.deploymentStage.stageName,
},
statistic: 'Average',
period,
}),
threshold,
evaluationPeriods,
datapointsToAlarm,
treatMissingData,
comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
alarmDescription,
});
if (props.alarmAction)
this.addAlarmAction(props.alarmAction);
if (props.okAction)
this.addOkAction(props.okAction);
if (props.insufficientDataAction)
this.addInsufficientDataAction(props.insufficientDataAction);
}
}
exports.ApiGatewayRestApi5XXErrorAlarm = ApiGatewayRestApi5XXErrorAlarm;
_b = JSII_RTTI_SYMBOL_1;
ApiGatewayRestApi5XXErrorAlarm[_b] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApiGatewayRestApi5XXErrorAlarm", version: "0.0.13" };
;
/**
* This alarm helps to detect low traffic volume for the REST API stage.
*
* This can be an indicator of an issue with the application calling the API such as using incorrect endpoints.
* It could also be an indicator of an issue with the configuration or permissions of the API making it unreachable
* for clients.
*
* The alarm is triggered when the number of requests in a given period is less than threshold.
*/
class ApiGatewayRestApiCountAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.api.restApiName} - ${ApiGatewayRecommendedAlarmsMetrics.COUNT}`;
const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1);
const evaluationPeriods = props.evaluationPeriods ?? 10;
const datapointsToAlarm = props.datapointsToAlarm ?? 10;
const threshold = props.threshold;
const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING;
const alarmDescription = props.alarmDescription ?? 'This alarm can detect unexpectedly low traffic volume for'
+ ' the REST API stage.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: props.api.metricCount({
dimensionsMap: {
ApiName: props.api.restApiName,
Stage: props.api.deploymentStage.stageName,
},
statistic: 'SampleCount',
period,
}),
threshold,
evaluationPeriods,
datapointsToAlarm,
treatMissingData,
comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
alarmDescription,
});
if (props.alarmAction)
this.addAlarmAction(props.alarmAction);
if (props.okAction)
this.addOkAction(props.okAction);
if (props.insufficientDataAction)
this.addInsufficientDataAction(props.insufficientDataAction);
}
}
exports.ApiGatewayRestApiCountAlarm = ApiGatewayRestApiCountAlarm;
_c = JSII_RTTI_SYMBOL_1;
ApiGatewayRestApiCountAlarm[_c] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApiGatewayRestApiCountAlarm", version: "0.0.13" };
;
/**
* This alarm can detect when the API Gateway requests in a stage have high latency.
*
* If you have detailed CloudWatch metrics enabled and you have different latency performance
* requirements for each method and resource, we recommend that you create alternative alarms to
* have more fine-grained monitoring of the latency for each resource and method.
*
* The alarm is triggered when time in milliseconds exceeds or equals the threshold.
*/
class ApiGatewayRestApiLatencyAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.api.restApiName} - ${ApiGatewayRecommendedAlarmsMetrics.LATENCY}`;
const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1);
const evaluationPeriods = props.evaluationPeriods ?? 5;
const datapointsToAlarm = props.datapointsToAlarm ?? 5;
const threshold = props.threshold ?? 2500;
const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING;
const alarmDescription = props.alarmDescription ?? 'This alarm can detect when the API Gateway requests in a'
+ ' stage have high latency.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: props.api.metricLatency({
dimensionsMap: {
ApiName: props.api.restApiName,
Stage: props.api.deploymentStage.stageName,
},
statistic: 'p90',
period,
}),
threshold,
evaluationPeriods,
datapointsToAlarm,
treatMissingData,
comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
alarmDescription,
});
if (props.alarmAction)
this.addAlarmAction(props.alarmAction);
if (props.okAction)
this.addOkAction(props.okAction);
if (props.insufficientDataAction)
this.addInsufficientDataAction(props.insufficientDataAction);
}
}
exports.ApiGatewayRestApiLatencyAlarm = ApiGatewayRestApiLatencyAlarm;
_d = JSII_RTTI_SYMBOL_1;
ApiGatewayRestApiLatencyAlarm[_d] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApiGatewayRestApiLatencyAlarm", version: "0.0.13" };
;
/**
* This alarm can detect unexpectedly low traffic volume for the REST API resource and method
* in the stage.
*
* We recommend that you create this alarm if your API receives a predictable and
* consistent number of requests under normal conditions. This alarm is not recommended for APIs
* that don't expect constant and consistent traffic.
*
* The alarm is triggered when the number of requests in a given period is less than threshold.
*/
class ApiGatewayRestApiDetailedCountAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.api.restApiName}-${props.alias} - ${ApiGatewayRecommendedAlarmsMetrics.COUNT}`;
const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1);
const evaluationPeriods = props.evaluationPeriods ?? 10;
const datapointsToAlarm = props.datapointsToAlarm ?? 10;
const threshold = props.threshold;
const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING;
const alarmDescription = props.alarmDescription ?? 'This alarm can detect when the API Gateway requests for a'
+ ' resource and method in a stage have high latency.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: props.api.metricCount({
dimensionsMap: {
ApiName: props.api.restApiName,
Stage: props.api.deploymentStage.stageName,
Resource: props.resource,
Method: props.method,
},
statistic: 'SampleCount',
period,
}),
threshold,
evaluationPeriods,
datapointsToAlarm,
treatMissingData,
comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
alarmDescription,
});
if (props.alarmAction)
this.addAlarmAction(props.alarmAction);
if (props.okAction)
this.addOkAction(props.okAction);
if (props.insufficientDataAction)
this.addInsufficientDataAction(props.insufficientDataAction);
}
}
exports.ApiGatewayRestApiDetailedCountAlarm = ApiGatewayRestApiDetailedCountAlarm;
_e = JSII_RTTI_SYMBOL_1;
ApiGatewayRestApiDetailedCountAlarm[_e] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApiGatewayRestApiDetailedCountAlarm", version: "0.0.13" };
;
/**
* This alarm detects high latency for a resource and method in a stage.
*
* Find the IntegrationLatency metric value to check the API backend latency. If the two
* metrics are mostly aligned, the API backend is the source of higher latency and you should
* investigate there for performance issues. Consider also enabling CloudWatch Logs and checking
* for any errors that might be causing the high latency.
*
* The alarm is triggered when time in milliseconds exceeds or equals the threshold.
*/
class ApiGatewayRestApiDetailedLatencyAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.api.restApiName}-${props.alias} - ${ApiGatewayRecommendedAlarmsMetrics.LATENCY}`;
const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1);
const evaluationPeriods = props.evaluationPeriods ?? 5;
const datapointsToAlarm = props.datapointsToAlarm ?? 5;
const threshold = props.threshold ?? 2500;
const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING;
const alarmDescription = props.alarmDescription ?? 'This alarm can detect when the API Gateway requests for a'
+ ' resource and method in a stage have high latency.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: props.api.metricLatency({
dimensionsMap: {
ApiName: props.api.restApiName,
Stage: props.api.deploymentStage.stageName,
Resource: props.resource,
Method: props.method,
},
statistic: 'p90',
period,
}),
threshold,
evaluationPeriods,
datapointsToAlarm,
treatMissingData,
comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
alarmDescription,
});
if (props.alarmAction)
this.addAlarmAction(props.alarmAction);
if (props.okAction)
this.addOkAction(props.okAction);
if (props.insufficientDataAction)
this.addInsufficientDataAction(props.insufficientDataAction);
}
}
exports.ApiGatewayRestApiDetailedLatencyAlarm = ApiGatewayRestApiDetailedLatencyAlarm;
_f = JSII_RTTI_SYMBOL_1;
ApiGatewayRestApiDetailedLatencyAlarm[_f] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApiGatewayRestApiDetailedLatencyAlarm", version: "0.0.13" };
;
/**
* A construct that creates the recommended alarms for an ApiGateway api.
*
* The recommended alarms created by default for the ApiName and Stage are:
* - 4XXError alarm
* - 5XXError alarm
* - Count alarm
* - Latency alarm
*
* In order to create the Count or Latency alarms for the Resource and Method dimensions the
* configDetailedCountAlarmList or configDetailedLatencyAlarmList must be specified.
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#ApiGateway
*/
class ApiGatewayRestApiRecommendedAlarms extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
if (!props.excludeAlarms?.includes(ApiGatewayRecommendedAlarmsMetrics.ERROR_4XX)) {
this.alarm4XXError = new ApiGatewayRestApi4XXErrorAlarm(this, `${props.api.node.id}_4XXError`, {
api: props.api,
treatMissingData: props.treatMissingData,
...props.config4XXErrorAlarm,
});
if (props.defaultAlarmAction && !props.config4XXErrorAlarm?.alarmAction) {
this.alarm4XXError.addAlarmAction(props.defaultAlarmAction);
}
if (props.defaultOkAction && !props.config4XXErrorAlarm?.okAction) {
this.alarm4XXError.addOkAction(props.defaultOkAction);
}
if (props.defaultInsufficientDataAction && !props.config4XXErrorAlarm?.insufficientDataAction) {
this.alarm4XXError.addInsufficientDataAction(props.defaultInsufficientDataAction);
}
}
if (!props.excludeAlarms?.includes(ApiGatewayRecommendedAlarmsMetrics.ERROR_5XX)) {
this.alarm5XXError = new ApiGatewayRestApi5XXErrorAlarm(this, `${props.api.node.id}_5XXError`, {
api: props.api,
treatMissingData: props.treatMissingData,
...props.config5XXErrorAlarm,
});
if (props.defaultAlarmAction && !props.config5XXErrorAlarm?.alarmAction) {
this.alarm5XXError.addAlarmAction(props.defaultAlarmAction);
}
if (props.defaultOkAction && !props.config5XXErrorAlarm?.okAction) {
this.alarm5XXError.addOkAction(props.defaultOkAction);
}
if (props.defaultInsufficientDataAction && !props.config5XXErrorAlarm?.insufficientDataAction) {
this.alarm5XXError.addInsufficientDataAction(props.defaultInsufficientDataAction);
}
}
if (!props.excludeAlarms?.includes(ApiGatewayRecommendedAlarmsMetrics.COUNT)) {
this.alarmCount = new ApiGatewayRestApiCountAlarm(this, `${props.api.node.id}_Count`, {
api: props.api,
treatMissingData: props.treatMissingData,
...props.configCountAlarm,
});
if (props.defaultAlarmAction && !props.configCountAlarm.alarmAction) {
this.alarmCount.addAlarmAction(props.defaultAlarmAction);
}
if (props.defaultOkAction && !props.configCountAlarm.okAction) {
this.alarmCount.addOkAction(props.defaultOkAction);
}
if (props.defaultInsufficientDataAction && !props.configCountAlarm.insufficientDataAction) {
this.alarmCount.addInsufficientDataAction(props.defaultInsufficientDataAction);
}
}
if (!props.excludeAlarms?.includes(ApiGatewayRecommendedAlarmsMetrics.LATENCY)) {
this.alarmLatency = new ApiGatewayRestApiLatencyAlarm(this, `${props.api.node.id}_Latency`, {
api: props.api,
treatMissingData: props.treatMissingData,
...props.configLatencyAlarm,
});
if (props.defaultAlarmAction && !props.configLatencyAlarm?.alarmAction) {
this.alarmLatency.addAlarmAction(props.defaultAlarmAction);
}
if (props.defaultOkAction && !props.configLatencyAlarm?.okAction) {
this.alarmLatency.addOkAction(props.defaultOkAction);
}
if (props.defaultInsufficientDataAction && !props.configLatencyAlarm?.insufficientDataAction) {
this.alarmLatency.addInsufficientDataAction(props.defaultInsufficientDataAction);
}
}
if (!props.excludeAlarms?.includes(ApiGatewayRecommendedAlarmsMetrics.COUNT) && props.configDetailedCountAlarmList) {
props.configDetailedCountAlarmList.forEach((config, index) => {
let alarmConfig = {
api: props.api,
treatMissingData: props.treatMissingData,
...config,
};
if (props.defaultAlarmAction && !config.alarmAction) {
alarmConfig = { ...alarmConfig, alarmAction: props.defaultAlarmAction };
}
if (props.defaultOkAction && !config.okAction) {
alarmConfig = { ...alarmConfig, okAction: props.defaultOkAction };
}
if (props.defaultInsufficientDataAction && !config.insufficientDataAction) {
alarmConfig = { ...alarmConfig, insufficientDataAction: props.defaultInsufficientDataAction };
}
new ApiGatewayRestApiDetailedCountAlarm(this, `${props.api.node.id}_DetailedCount${index}`, alarmConfig);
});
}
if (!props.excludeAlarms?.includes(ApiGatewayRecommendedAlarmsMetrics.LATENCY) && props.configDetailedLatencyAlarmList) {
props.configDetailedLatencyAlarmList.forEach((config, index) => {
let alarmConfig = {
api: props.api,
treatMissingData: props.treatMissingData,
...config,
};
if (props.defaultAlarmAction && !config.alarmAction) {
alarmConfig = { ...alarmConfig, alarmAction: props.defaultAlarmAction };
}
if (props.defaultOkAction && !config.okAction) {
alarmConfig = { ...alarmConfig, okAction: props.defaultOkAction };
}
if (props.defaultInsufficientDataAction && !config.insufficientDataAction) {
alarmConfig = { ...alarmConfig, insufficientDataAction: props.defaultInsufficientDataAction };
}
new ApiGatewayRestApiDetailedLatencyAlarm(this, `${props.api.node.id}_DetailedLatency${index}`, alarmConfig);
});
}
}
}
exports.ApiGatewayRestApiRecommendedAlarms = ApiGatewayRestApiRecommendedAlarms;
_g = JSII_RTTI_SYMBOL_1;
ApiGatewayRestApiRecommendedAlarms[_g] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApiGatewayRestApiRecommendedAlarms", version: "0.0.13" };
/**
* An extension for the RestApi construct that provides methods
* to create recommended alarms.
*/
class RestApi extends aws_cdk_lib_1.aws_apigateway.RestApi {
constructor(scope, id, props) {
super(scope, id, props);
}
/**
* Creates an alarm that monitors the number of client-side errors captured in a given period.
*/
alarm4XXError(props) {
return new ApiGatewayRestApi4XXErrorAlarm(this, '4XXErrorAlarm', {
api: this,
...props,
});
}
/**
* Creates an alarm that monitors the number of server-side errors captured in a given period.
*/
alarm5XXError(props) {
return new ApiGatewayRestApi5XXErrorAlarm(this, '5XXErrorAlarm', {
api: this,
...props,
});
}
/**
* Creates an alarm that monitors the total number API requests in a given period.
*/
alarmCount(props) {
return new ApiGatewayRestApiCountAlarm(this, 'CountAlarm', {
api: this,
...props,
});
}
/**
* Creates an alarm that monitors the time between when API Gateway receives a request
* from a client and when it returns a response to the client.
*/
alarmLatency(props) {
return new ApiGatewayRestApiLatencyAlarm(this, 'LatencyAlarm', {
api: this,
...props,
});
}
/**
* Creates a list of alarms that monitor the total number API requests in a given period for
* the methods and resources specified.
*/
alarmDetailedCount(props) {
let alarmList = [];
props.forEach((config, index) => {
const alarm = new ApiGatewayRestApiDetailedCountAlarm(this, `DetailedCount${index}`, {
api: this,
...config,
});
alarmList.push(alarm);
});
return alarmList;
}
/**
* Creates a list of alarms the time between when API Gateway receives a request
* from a client and when it returns a response to the client for the methods and
* resources specified.
*/
alarmDetailedLatency(props) {
let alarmList = [];
props.forEach((config, index) => {
const alarm = new ApiGatewayRestApiDetailedLatencyAlarm(this, `DetailedLatency${index}`, {
api: this,
...config,
});
alarmList.push(alarm);
});
return alarmList;
}
/**
* Creates the recommended alarms for the ApiGateway api.
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#ApiGateway
*/
applyRecommendedAlarms(props) {
return new ApiGatewayRestApiRecommendedAlarms(this, 'ApiGatewayRestApiRecommendedAlarms', {
api: this,
...props,
});
}
}
exports.RestApi = RestApi;
_h = JSII_RTTI_SYMBOL_1;
RestApi[_h] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RestApi", version: "0.0.13" };
/**
* Configures the recommended alarms for an ApiGateway api.
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#ApiGateway
*/
class ApiGatewayRecommendedAlarmsAspect {
constructor(props) {
this.props = props;
}
visit(node) {
if (node instanceof aws_cdk_lib_1.aws_apigateway.RestApi) {
if (this.props.excludeResources && this.props.excludeResources.includes(node.node.id)) {
return;
}
else {
const api = node;
new ApiGatewayRestApiRecommendedAlarms(api, 'ApiGatewayRestApiRecommendedAlarmsFromAspect', {
api,
...this.props,
});
}
}
}
}
exports.ApiGatewayRecommendedAlarmsAspect = ApiGatewayRecommendedAlarmsAspect;
_j = JSII_RTTI_SYMBOL_1;
ApiGatewayRecommendedAlarmsAspect[_j] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ApiGatewayRecommendedAlarmsAspect", version: "0.0.13" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcGlnYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBS3FCO0FBQ3JCLDJDQUFtRDtBQUNuRCxxQ0FBb0U7QUFFcEU7O0dBRUc7QUFDSCxJQUFZLGtDQW1CWDtBQW5CRCxXQUFZLGtDQUFrQztJQUM1Qzs7T0FFRztJQUNILDREQUFzQixDQUFBO0lBQ3RCOztPQUVHO0lBQ0gsNERBQXNCLENBQUE7SUFDdEI7O09BRUc7SUFDSCxxREFBZSxDQUFBO0lBQ2Y7Ozs7T0FJRztJQUNILHlEQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFuQlcsa0NBQWtDLGtEQUFsQyxrQ0FBa0MsUUFtQjdDO0FBcUZEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLDhCQUErQixTQUFRLDRCQUFVLENBQUMsS0FBSztJQUNsRSxZQUFZLEtBQWlCLEVBQUUsRUFBVSxFQUFFLEtBQTBDO1FBQ25GLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsTUFBTSxrQ0FBa0MsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsSCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQztRQUN2RCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDdkQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNsQyxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSw0QkFBVSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztRQUN2RixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxn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LEdBQUcsTUFBTTthQUNWLENBQUMsQ0FBQztZQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHNCQUFzQixDQUFDLEtBQStDO1FBQzNFLE9BQU8sSUFBSSxrQ0FBa0MsQ0FBQyxJQUFJLEVBQUUsb0NBQW9DLEVBQUU7WUFDeEYsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDOztBQTNGSCwwQkE0RkM7OztBQUVEOzs7O0dBSUc7QUFDSCxNQUFhLGlDQUFpQztJQUM1QyxZQUE2QixLQUErQztRQUEvQyxVQUFLLEdBQUwsS0FBSyxDQUEwQztJQUFHLENBQUM7SUFFekUsS0FBSyxDQUFDLElBQWdCO1FBQzNCLElBQUksSUFBSSxZQUFZLDRCQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDdEYsT0FBTztZQUNULENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLEdBQUcsR0FBRyxJQUEwQixDQUFDO2dCQUV2QyxJQUFJLGtDQUFrQyxDQUFDLEdBQUcsRUFBRSw4Q0FBOEMsRUFBRTtvQkFDMUYsR0FBRztvQkFDSCxHQUFHLElBQUksQ0FBQyxLQUFLO2lCQUNkLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzs7QUFoQkgsOEVBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSUFzcGVjdCxcbiAgYXdzX2FwaWdhdGV3YXkgYXMgYXBpZ2F0ZXdheSxcbiAgYXdzX2Nsb3Vkd2F0Y2ggYXMgY2xvdWR3YXRjaCxcbiAgRHVyYXRpb24sXG59IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQWxhcm1CYXNlUHJvcHMsIHZhbGlkYXRlVG90YWxBbGFybVBlcmlvZCB9IGZyb20gJy4vY29tbW9uJztcblxuLyoqXG4gKiBUaGUgcmVjb21tZW5kZWQgbWV0cmljcyBmb3IgQXBpR2F0ZXdheSBhbGFybXMuXG4gKi9cbmV4cG9ydCBlbnVtIEFwaUdhdGV3YXlSZWNvbW1lbmRlZEFsYXJtc01ldHJpY3Mge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjbGllbnQtc2lkZSBlcnJvcnMgY2FwdHVyZWQgaW4gYSBnaXZlbiBwZXJpb2QuXG4gICAqL1xuICBFUlJPUl80WFggPSAnNFhYRXJyb3InLFxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBzZXJ2ZXItc2lkZSBlcnJvcnMgY2FwdHVyZWQgaW4gYSBnaXZlbiBwZXJpb2QuXG4gICAqL1xuICBFUlJPUl81WFggPSAnNVhYRXJyb3InLFxuICAvKipcbiAgICogVGhlIHRvdGFsIG51bWJlciBBUEkgcmVxdWVzdHMgaW4gYSBnaXZlbiBwZXJpb2QuXG4gICAqL1xuICBDT1VOVCA9ICdDb3VudCcsXG4gIC8qKlxuICAgKiBUaGUgdGltZSAobWlsbGlzZWNvbmRzKSBiZXR3ZWVuIHdoZW4gQVBJIEdhdGV3YXkgcmVjZWl2ZXMgYSByZXF1ZXN0IGZyb20gYSBjbGllbnQgYW5kXG4gICAqIHdoZW4gaXQgcmV0dXJucyBhIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQuIFRoZSBsYXRlbmN5IGluY2x1ZGVzIHRoZSBpbnRlZ3JhdGlvbiBsYXRlbmN5XG4gICAqIGFuZCBvdGhlciBBUEkgR2F0ZXdheSBvdmVyaGVhZC5cbiAgICovXG4gIExBVEVOQ1kgPSAnTGF0ZW5jeScsXG59XG5cbi8qKlxuICogVGhlIGNvbW1vbiBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGUgYWxhcm1zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUdhdGV3YXlBbGFybUJhc2VDb25maWcgZXh0ZW5kcyBBbGFybUJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcGVyaW9kIG92ZXIgd2hpY2ggdGhlIHNwZWNpZmllZCBzdGF0aXN0aWMgaXMgYXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24ubWludXRlcygxKVxuICAgKi9cbiAgcmVhZG9ubHkgcGVyaW9kPzogRHVyYXRpb247XG59XG5cbi8qKlxuICogVGhlIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciB0aGUgQXBpR2F0ZXdheSBhbGFybXMgd2hlbiBtb25pdG9yaW5nIHJlc291cmNlIGFuZCBtZXRob2QgZGltZW5zaW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlHYXRld2F5RGV0YWlsZWRBbGFybUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgYWxpYXMgb2YgdGhlIHJlc291cmNlIHRvIG1vbml0b3IsIHVzZWQgYXMgYSBkaXNjcmltaW5hdG9yIGluIHRoZSBhbGFybSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM6IHN0cmluZ