UNPKG

@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.

585 lines 110 kB
"use strict"; var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; Object.defineProperty(exports, "__esModule", { value: true }); exports.SnsRecommendedAlarmsAspect = exports.Topic = exports.SnsRecommendedAlarms = exports.SnsNumberOfNotificationsFailedToRedriveToDlqAlarm = exports.SnsNumberOfNotificationsRedrivenToDlqAlarm = exports.SnsNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm = exports.SnsNumberOfNotificationsFilteredOutInvalidAttributesAlarm = exports.SnsNumberOfNotificationsFailedAlarm = exports.SnsNumberOfNotificationsDeliveredAlarm = exports.SnsNumberOfMessagesPublishedAlarm = exports.SnsRecommendedAlarmsMetrics = 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 SNS topic alarms. */ var SnsRecommendedAlarmsMetrics; (function (SnsRecommendedAlarmsMetrics) { /** * The number of messages published to the topic. */ SnsRecommendedAlarmsMetrics["NUMBER_OF_MESSAGES_PUBLISHED"] = "NumberOfMessagesPublished"; /** * The number of notifications delivered. */ SnsRecommendedAlarmsMetrics["NUMBER_OF_NOTIFICATIONS_DELIVERED"] = "NumberOfNotificationsDelivered"; /** * The number of notifications failed. */ SnsRecommendedAlarmsMetrics["NUMBER_OF_NOTIFICATIONS_FAILED"] = "NumberOfNotificationsFailed"; /** * The number of notifications filtered out due to invalid attributes. */ SnsRecommendedAlarmsMetrics["NUMBER_OF_NOTIFICATIONS_FILTERED_OUT_INVALID_ATTRIBUTES"] = "NumberOfNotificationsFilteredOut-InvalidAttributes"; /** * The number of notifications filtered out due to invalid message body. */ SnsRecommendedAlarmsMetrics["NUMBER_OF_NOTIFICATIONS_FILTERED_OUT_INVALID_MESSAGE_BODY"] = "NumberOfNotificationsFilteredOut-InvalidMessageBody"; /** * The number of notifications redriven to the dead-letter queue. */ SnsRecommendedAlarmsMetrics["NUMBER_OF_NOTIFICATIONS_REDRIVEN_TO_DLQ"] = "NumberOfNotificationsRedrivenToDlq"; /** * The number of notifications failed to redrive to the dead-letter queue. */ SnsRecommendedAlarmsMetrics["NUMBER_OF_NOTIFICATIONS_FAILED_TO_REDRIVE_TO_DLQ"] = "NumberOfNotificationsFailedToRedriveToDlq"; })(SnsRecommendedAlarmsMetrics || (exports.SnsRecommendedAlarmsMetrics = SnsRecommendedAlarmsMetrics = {})); /** * An alarm that monitors the number of messages published to an SNS topic. * * This alarm helps you proactively monitor and detect significant drops in * notification publishing. This helps you identify potential issues with * your application or business processes, so that you can take appropriate * actions to maintain the expected flow of notifications. You should create * this alarm if you expect your system to have a minimum traffic that it * is serving. * * The alarm is triggered when the number of messages published to the topic * is less than the specified threshold. */ class SnsNumberOfMessagesPublishedAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.topic.topicName} - ${SnsRecommendedAlarmsMetrics.NUMBER_OF_MESSAGES_PUBLISHED}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 5; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: props.topic.metricNumberOfMessagesPublished({ period, }), threshold: props.threshold, evaluationPeriods, datapointsToAlarm: props.datapointsToAlarm ?? 5, treatMissingData: props.treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD, alarmDescription: props.alarmDescription ?? 'This alarm can detect when the number of SNS messages published is too low. For troubleshooting, check why the publishers are sending less traffic.', }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.SnsNumberOfMessagesPublishedAlarm = SnsNumberOfMessagesPublishedAlarm; _a = JSII_RTTI_SYMBOL_1; SnsNumberOfMessagesPublishedAlarm[_a] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.SnsNumberOfMessagesPublishedAlarm", version: "0.0.13" }; /** * An alarm that monitors the number of notifications delivered by an SNS topic. * * This alarm helps you detect a drop in the volume of messages delivered. * You should create this alarm if you expect your system to have a * minimum traffic that it is serving. * * The alarm is triggered when the number of messages delivered by the topic * is less than the specified threshold. */ class SnsNumberOfNotificationsDeliveredAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.topic.topicName} - ${SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_DELIVERED}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 5; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: props.topic.metricNumberOfNotificationsDelivered({ period, }), threshold: props.threshold, evaluationPeriods, datapointsToAlarm: props.datapointsToAlarm ?? 5, treatMissingData: props.treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD, alarmDescription: props.alarmDescription ?? 'This alarm can detect when the number of SNS messages delivered is too low. This could be because of unintentional unsubscribing of an endpoint, or because of an SNS event that causes messages to experience delay.', }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.SnsNumberOfNotificationsDeliveredAlarm = SnsNumberOfNotificationsDeliveredAlarm; _b = JSII_RTTI_SYMBOL_1; SnsNumberOfNotificationsDeliveredAlarm[_b] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.SnsNumberOfNotificationsDeliveredAlarm", version: "0.0.13" }; /** * An alarm that monitors the number of notifications failed by an SNS topic. * * This alarm helps you proactively find issues with the delivery of notifications * and take appropriate actions to address them. * * The alarm is triggered when the number of messages failed by the topic * is greater than the specified threshold. */ class SnsNumberOfNotificationsFailedAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.topic.topicName} - ${SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_FAILED}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 5; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: props.topic.metricNumberOfNotificationsFailed({ period, }), threshold: props.threshold, evaluationPeriods, datapointsToAlarm: props.datapointsToAlarm ?? 5, treatMissingData: props.treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD, alarmDescription: props.alarmDescription ?? 'This alarm can detect when the number of failed SNS messages is too high.' + ' To troubleshoot failed notifications, enable logging to CloudWatch Logs. Checking the logs can help you find which' + ' subscribers are failing, as well as the status codes they are returning.', }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.SnsNumberOfNotificationsFailedAlarm = SnsNumberOfNotificationsFailedAlarm; _c = JSII_RTTI_SYMBOL_1; SnsNumberOfNotificationsFailedAlarm[_c] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.SnsNumberOfNotificationsFailedAlarm", version: "0.0.13" }; /** * An alarm that monitors the number of notifications filtered out due * to invalid attributes. * * The alarm is used to detect if the published messages are not valid or * if inappropriate filters have been applied to a subscriber. * * The alarm is triggered when the number of messages filtered out due to * invalid attributes is greater than the specified threshold. */ class SnsNumberOfNotificationsFilteredOutInvalidAttributesAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.topic.topicName} - ${SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_FILTERED_OUT_INVALID_ATTRIBUTES}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 5; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: props.topic.metricNumberOfNotificationsFilteredOutInvalidAttributes({ period, }), threshold: props.threshold ?? 0, evaluationPeriods, datapointsToAlarm: props.datapointsToAlarm ?? 5, treatMissingData: props.treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD, alarmDescription: props.alarmDescription ?? 'This alarm helps to monitor and resolve potential problems with the publisher or ' + 'subscribers. Check if a publisher is publishing messages with invalid attributes or if an inappropriate filter is applied ' + 'to a subscriber. You can also analyze CloudWatch Logs to help find the root cause of the issue.', }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.SnsNumberOfNotificationsFilteredOutInvalidAttributesAlarm = SnsNumberOfNotificationsFilteredOutInvalidAttributesAlarm; _d = JSII_RTTI_SYMBOL_1; SnsNumberOfNotificationsFilteredOutInvalidAttributesAlarm[_d] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.SnsNumberOfNotificationsFilteredOutInvalidAttributesAlarm", version: "0.0.13" }; /** * An alarm that monitors the number of notifications filtered out due * to invalid message body. * * The alarm is used to detect if the published messages are not valid or * if inappropriate filters have been applied to a subscriber. * * The alarm is triggered when the number of messages filtered out due to * invalid message body is greater than the specified threshold. */ class SnsNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.topic.topicName} - ${SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_FILTERED_OUT_INVALID_MESSAGE_BODY}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 5; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/SNS', metricName: SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_FILTERED_OUT_INVALID_MESSAGE_BODY, dimensionsMap: { TopicName: props.topic.topicName, }, period, statistic: 'Sum', }), threshold: props.threshold ?? 0, evaluationPeriods, datapointsToAlarm: props.datapointsToAlarm ?? 5, treatMissingData: props.treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD, alarmDescription: props.alarmDescription ?? 'This alarm helps to monitor and resolve potential problems with the publisher or subscribers. ' + 'Check if a publisher is publishing messages with invalid message bodies, or if an inappropriate filter is applied to a subscriber. You ' + 'can also analyze CloudWatch Logs to help find the root cause of the issue.', }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.SnsNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm = SnsNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm; _e = JSII_RTTI_SYMBOL_1; SnsNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm[_e] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.SnsNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm", version: "0.0.13" }; /** * An alarm that monitors the number of notifications redriven * to the dead-letter queue. * * The alarm is used to detect messages that moved to a dead-letter * queue. We recommend that you create this alarm when SNS is coupled * with SQS, Lambda or Firehose. * * The alarm is triggered when the number of messages redriven to the * dead-letter queue is greater than the specified threshold. */ class SnsNumberOfNotificationsRedrivenToDlqAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.topic.topicName} - ${SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_REDRIVEN_TO_DLQ}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 5; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/SNS', metricName: SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_REDRIVEN_TO_DLQ, dimensionsMap: { TopicName: props.topic.topicName, }, period, statistic: 'Sum', }), threshold: props.threshold ?? 0, evaluationPeriods, datapointsToAlarm: props.datapointsToAlarm ?? 5, treatMissingData: props.treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD, alarmDescription: props.alarmDescription ?? 'This alarm helps to monitor the number of messages that are moved to a dead-letter queue.', }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.SnsNumberOfNotificationsRedrivenToDlqAlarm = SnsNumberOfNotificationsRedrivenToDlqAlarm; _f = JSII_RTTI_SYMBOL_1; SnsNumberOfNotificationsRedrivenToDlqAlarm[_f] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.SnsNumberOfNotificationsRedrivenToDlqAlarm", version: "0.0.13" }; /** * An alarm that monitors the number of notifications failed to redrive * to the dead-letter queue. * * The alarm is used to detect messages that couldn't be moved to a dead-letter * queue. * * The alarm is triggered when the number of messages failed to redrive to the * dead-letter queue is greater than the specified threshold. */ class SnsNumberOfNotificationsFailedToRedriveToDlqAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.topic.topicName} - ${SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_FAILED_TO_REDRIVE_TO_DLQ}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 5; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/SNS', metricName: SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_FAILED_TO_REDRIVE_TO_DLQ, dimensionsMap: { TopicName: props.topic.topicName, }, period, statistic: 'Sum', }), threshold: props.threshold ?? 0, evaluationPeriods, datapointsToAlarm: props.datapointsToAlarm ?? 5, treatMissingData: props.treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD, alarmDescription: props.alarmDescription ?? 'This alarm helps to monitor messages that couldn\'t be moved to a dead-letter ' + 'queue. Check whether your dead-letter queue exists and that it\'s configured correctly. Also, verify that SNS has ' + 'permissions to access the dead-letter queue. Refer to the dead-letter queue documentation ' + '(https://docs.aws.amazon.com/sns/latest/dg/sns-dead-letter-queues.html) to learn more.', }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.SnsNumberOfNotificationsFailedToRedriveToDlqAlarm = SnsNumberOfNotificationsFailedToRedriveToDlqAlarm; _g = JSII_RTTI_SYMBOL_1; SnsNumberOfNotificationsFailedToRedriveToDlqAlarm[_g] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.SnsNumberOfNotificationsFailedToRedriveToDlqAlarm", version: "0.0.13" }; /** * A construct that creates recommended alarms for an SNS topic. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SNS */ class SnsRecommendedAlarms extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); if (!props.excludeAlarms?.includes(SnsRecommendedAlarmsMetrics.NUMBER_OF_MESSAGES_PUBLISHED)) { this.alarmNumberOfMessagesPublished = new SnsNumberOfMessagesPublishedAlarm(this, `${id}_NumberOfMessagesPublishedAlarm`, { topic: props.topic, treatMissingData: props.treatMissingData, ...props.configNumberOfMessagesPublishedAlarm, }); if (props.defaultAlarmAction && !props.configNumberOfMessagesPublishedAlarm.alarmAction) { this.alarmNumberOfMessagesPublished.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configNumberOfMessagesPublishedAlarm.okAction) { this.alarmNumberOfMessagesPublished.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configNumberOfMessagesPublishedAlarm.insufficientDataAction) { this.alarmNumberOfMessagesPublished.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_DELIVERED)) { this.alarmNumberOfNotificationsDelivered = new SnsNumberOfNotificationsDeliveredAlarm(this, `${id}_NumberOfNotificationsDeliveredAlarm`, { topic: props.topic, treatMissingData: props.treatMissingData, ...props.configNumberOfNotificationsDeliveredAlarm, }); if (props.defaultAlarmAction && !props.configNumberOfNotificationsDeliveredAlarm.alarmAction) { this.alarmNumberOfNotificationsDelivered.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configNumberOfNotificationsDeliveredAlarm.okAction) { this.alarmNumberOfNotificationsDelivered.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configNumberOfNotificationsDeliveredAlarm.insufficientDataAction) { this.alarmNumberOfNotificationsDelivered.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_FAILED)) { this.alarmNumberOfNotificationsFailed = new SnsNumberOfNotificationsFailedAlarm(this, `${id}_NumberOfNotificationsFailedAlarm`, { topic: props.topic, treatMissingData: props.treatMissingData, ...props.configNumberOfNotificationsFailedAlarm, }); if (props.defaultAlarmAction && !props.configNumberOfNotificationsFailedAlarm.alarmAction) { this.alarmNumberOfNotificationsFailed.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configNumberOfNotificationsFailedAlarm.okAction) { this.alarmNumberOfNotificationsFailed.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configNumberOfNotificationsFailedAlarm.insufficientDataAction) { this.alarmNumberOfNotificationsFailed.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_FILTERED_OUT_INVALID_ATTRIBUTES)) { this.alarmNumberOfNotificationsFilteredOutInvalidAttributes = new SnsNumberOfNotificationsFilteredOutInvalidAttributesAlarm(this, `${id}_NumberOfNotificationsFilteredOutInvalidAttributesAlarm`, { topic: props.topic, treatMissingData: props.treatMissingData, ...props.configNumberOfNotificationsFilteredOutInvalidAttributesAlarm, }); if (props.defaultAlarmAction && !props.configNumberOfNotificationsFilteredOutInvalidAttributesAlarm?.alarmAction) { this.alarmNumberOfNotificationsFilteredOutInvalidAttributes.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configNumberOfNotificationsFilteredOutInvalidAttributesAlarm?.okAction) { this.alarmNumberOfNotificationsFilteredOutInvalidAttributes.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configNumberOfNotificationsFilteredOutInvalidAttributesAlarm?.insufficientDataAction) { this.alarmNumberOfNotificationsFilteredOutInvalidAttributes.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_FILTERED_OUT_INVALID_MESSAGE_BODY)) { this.alarmNumberOfNotificationsFilteredOutInvalidMessageBody = new SnsNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm(this, `${id}_NumberOfNotificationsFilteredOutInvalidMessageBodyAlarm`, { topic: props.topic, treatMissingData: props.treatMissingData, ...props.configNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm, }); if (props.defaultAlarmAction && !props.configNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm?.alarmAction) { this.alarmNumberOfNotificationsFilteredOutInvalidMessageBody.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm?.okAction) { this.alarmNumberOfNotificationsFilteredOutInvalidMessageBody.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm?.insufficientDataAction) { this.alarmNumberOfNotificationsFilteredOutInvalidMessageBody.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_REDRIVEN_TO_DLQ)) { this.alarmNumberOfNotificationsRedrivenToDlq = new SnsNumberOfNotificationsRedrivenToDlqAlarm(this, `${id}_NumberOfNotificationsRedrivenToDlqAlarm`, { topic: props.topic, treatMissingData: props.treatMissingData, ...props.configNumberOfNotificationsRedrivenToDlqAlarm, }); if (props.defaultAlarmAction && !props.configNumberOfNotificationsRedrivenToDlqAlarm?.alarmAction) { this.alarmNumberOfNotificationsRedrivenToDlq.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configNumberOfNotificationsRedrivenToDlqAlarm?.okAction) { this.alarmNumberOfNotificationsRedrivenToDlq.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configNumberOfNotificationsRedrivenToDlqAlarm?.insufficientDataAction) { this.alarmNumberOfNotificationsRedrivenToDlq.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(SnsRecommendedAlarmsMetrics.NUMBER_OF_NOTIFICATIONS_FAILED_TO_REDRIVE_TO_DLQ)) { this.alarmNumberOfNotificationsFailedToRedriveToDlq = new SnsNumberOfNotificationsFailedToRedriveToDlqAlarm(this, `${id}_NumberOfNotificationsFailedToRedriveToDlqAlarm`, { topic: props.topic, treatMissingData: props.treatMissingData, ...props.configNumberOfNotificationsFailedToRedriveToDlqAlarm, }); if (props.defaultAlarmAction && !props.configNumberOfNotificationsFailedToRedriveToDlqAlarm?.alarmAction) { this.alarmNumberOfNotificationsFailedToRedriveToDlq.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configNumberOfNotificationsFailedToRedriveToDlqAlarm?.okAction) { this.alarmNumberOfNotificationsFailedToRedriveToDlq.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configNumberOfNotificationsFailedToRedriveToDlqAlarm?.insufficientDataAction) { this.alarmNumberOfNotificationsFailedToRedriveToDlq.addInsufficientDataAction(props.defaultInsufficientDataAction); } } } } exports.SnsRecommendedAlarms = SnsRecommendedAlarms; _h = JSII_RTTI_SYMBOL_1; SnsRecommendedAlarms[_h] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.SnsRecommendedAlarms", version: "0.0.13" }; /** * An extension of the SNS topic construct that provides helper * methods to create recommended alarms. */ class Topic extends aws_cdk_lib_1.aws_sns.Topic { constructor(scope, id, props) { super(scope, id, props); } /** * Creates an alarm for the NumberOfMessagesPublished metric. */ alarmNumberOfMessagesPublished(props) { return new SnsNumberOfMessagesPublishedAlarm(this, 'NumberOfMessagesPublishedAlarm', { topic: this, ...props, }); } /** * Creates an alarm for the NumberOfNotificationsDelivered metric. */ alarmNumberOfNotificationsDelivered(props) { return new SnsNumberOfNotificationsDeliveredAlarm(this, 'NumberOfNotificationsDeliveredAlarm', { topic: this, ...props, }); } /** * Creates an alarm for the NumberOfNotificationsFailed metric. */ alarmNumberOfNotificationsFailed(props) { return new SnsNumberOfNotificationsFailedAlarm(this, 'NumberOfNotificationsFailedAlarm', { topic: this, ...props, }); } /** * Creates an alarm for the NumberOfNotificationsFilteredOutInvalidAttributes metric. */ alarmNumberOfNotificationsFilteredOutInvalidAttributes(props) { return new SnsNumberOfNotificationsFilteredOutInvalidAttributesAlarm(this, 'NumberOfNotificationsFilteredOutInvalidAttributesAlarm', { topic: this, ...props, }); } /** * Creates an alarm for the NumberOfNotificationsFilteredOutInvalidMessageBody metric. */ alarmNumberOfNotificationsFilteredOutInvalidMessageBody(props) { return new SnsNumberOfNotificationsFilteredOutInvalidMessageBodyAlarm(this, 'NumberOfNotificationsFilteredOutInvalidMessageBodyAlarm', { topic: this, ...props, }); } /** * Creates an alarm for the NumberOfNotificationsRedrivenToDlq metric. */ alarmNumberOfNotificationsRedrivenToDlq(props) { return new SnsNumberOfNotificationsRedrivenToDlqAlarm(this, 'NumberOfNotificationsRedrivenToDlqAlarm', { topic: this, ...props, }); } /** * Creates an alarm for the NumberOfNotificationsFailedToRedriveToDlq metric. */ alarmNumberOfNotificationsFailedToRedriveToDlq(props) { return new SnsNumberOfNotificationsFailedToRedriveToDlqAlarm(this, 'NumberOfNotificationsFailedToRedriveToDlqAlarm', { topic: this, ...props, }); } /** * Creates recommended alarms for the SNS topic. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SNS */ applyRecommendedAlarms(props) { return new SnsRecommendedAlarms(this, 'SnsRecommendedAlarms', { topic: this, ...props, }); } } exports.Topic = Topic; _j = JSII_RTTI_SYMBOL_1; Topic[_j] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.Topic", version: "0.0.13" }; ; /** * An aspect that applies recommended alarms to SNS topics. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SNS */ class SnsRecommendedAlarmsAspect { constructor(props) { this.props = props; } visit(node) { if (node instanceof aws_cdk_lib_1.aws_sns.Topic) { if (this.props.excludeResources && this.props.excludeResources.includes(node.node.id)) { return; } else { const topic = node; new SnsRecommendedAlarms(node, 'SnsRecommendedAlarmsFromAspect', { topic, ...this.props, }); } } } } exports.SnsRecommendedAlarmsAspect = SnsRecommendedAlarmsAspect; _k = JSII_RTTI_SYMBOL_1; SnsRecommendedAlarmsAspect[_k] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.SnsRecommendedAlarmsAspect", version: "0.0.13" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Nucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUtxQjtBQUNyQiwyQ0FBbUQ7QUFDbkQscUNBQW9FO0FBRXBFOztHQUVHO0FBQ0gsSUFBWSwyQkE2Qlg7QUE3QkQsV0FBWSwyQkFBMkI7SUFDckM7O09BRUc7SUFDSCx5RkFBMEQsQ0FBQTtJQUMxRDs7T0FFRztJQUNILG1HQUFvRSxDQUFBO0lBQ3BFOztPQUVHO0lBQ0gsNkZBQThELENBQUE7SUFDOUQ7O09BRUc7SUFDSCw2SUFBOEcsQ0FBQTtJQUM5Rzs7T0FFRztJQUNILGdKQUFpSCxDQUFBO0lBQ2pIOztPQUVHO0lBQ0gsNkdBQThFLENBQUE7SUFDOUU7O09BRUc7SUFDSCw2SEFBOEYsQ0FBQTtBQUNoRyxDQUFDLEVBN0JXLDJCQUEyQiwyQ0FBM0IsMkJBQTJCLFFBNkJ0QztBQTRERDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGlDQUFrQyxTQUFRLDRCQUFVLENBQUMsS0FBSztJQUNyRSxZQUFZLEtBQWlCLEVBQUUsRUFBVSxFQUFFLEtBQTZDO1FBQ3RGLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsTUFBTSwyQkFBMkIsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQzlILE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO1FBRXZELElBQUEsaUNBQXdCLEVBQUMsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRS9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsU0FBUztZQUNULE1BQU0sRUFBRSxLQUFLLENBQUMs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