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.

963 lines 172 kB
"use strict"; var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; Object.defineProperty(exports, "__esModule", { value: true }); exports.RdsAuroraRecommendedAlarmsAspect = exports.RdsInstanceRecommendedAlarmsAspect = exports.DatabaseCluster = exports.DatabaseInstance = exports.RdsAuroraRecommendedAlarms = exports.RdsInstanceRecommendedAlarms = exports.RdsAuroraBinLogReplicationLagAlarm = exports.RdsAuroraVolumeBytesLeftTotalAlarm = exports.RdsInstanceDbLoadAlarm = exports.RdsInstanceWriteLatencyAlarm = exports.RdsInstanceReadLatencyAlarm = exports.RdsInstanceFreeStorageSpaceAlarm = exports.RdsInstanceFreeLocalStorageAlarm = exports.RdsInstanceFreeableMemoryAlarm = exports.RdsInstanceDatabaseConnectionsAlarm = exports.RdsInstanceCpuUtilizationAlarm = exports.RdsRecommendedAlarmsMetrics = void 0; exports.validateInstanceIdentifier = validateInstanceIdentifier; 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 RDS alarms. */ var RdsRecommendedAlarmsMetrics; (function (RdsRecommendedAlarmsMetrics) { /** * The percentage of CPU utilization for an RDS instance. */ RdsRecommendedAlarmsMetrics["INSTANCE_CPU_UTILIZATION"] = "CPUUtilization"; /** * The number of client network connections to the database instance. */ RdsRecommendedAlarmsMetrics["INSTANCE_DATABASE_CONNECTIONS"] = "DatabaseConnections"; /** * The amount of available memory (RAM) on the RDS instance. */ RdsRecommendedAlarmsMetrics["INSTANCE_FREEABLE_MEMORY"] = "FreeableMemory"; /** * The amount of available local storage space for an Aurora instance used for temporary files. */ RdsRecommendedAlarmsMetrics["INSTANCE_FREE_LOCAL_STORAGE"] = "FreeLocalStorage"; /** * The amount of available storage space for an Aurora instance. */ RdsRecommendedAlarmsMetrics["INSTANCE_FREE_STORAGE_SPACE"] = "FreeStorageSpace"; /** * The average amount of time taken per disk read I/O operation. */ RdsRecommendedAlarmsMetrics["INSTANCE_READ_LATENCY"] = "ReadLatency"; /** * The average amount of time taken per disk write I/O operation. */ RdsRecommendedAlarmsMetrics["INSTANCE_WRITE_LATENCY"] = "WriteLatency"; /** * The average active sessions (AAS) for the DB instance which shows how many sessions are concurrently active on the database. */ RdsRecommendedAlarmsMetrics["INSTANCE_DB_LOAD"] = "DBLoad"; /** * The remaining available space for the cluster volume. */ RdsRecommendedAlarmsMetrics["AURORA_VOLUME_BYTES_LEFT_TOTAL"] = "AuroraVolumeBytesLeftTotal"; /** * The amount of time that a binary log replica DB cluster running on Aurora MySQL lags behind the binary log replication source. */ RdsRecommendedAlarmsMetrics["AURORA_BIN_LOG_REPLICATION_LAG"] = "AuroraBinLogReplicaLag"; })(RdsRecommendedAlarmsMetrics || (exports.RdsRecommendedAlarmsMetrics = RdsRecommendedAlarmsMetrics = {})); /** * Validates that either instanceIdentifier or databaseInstance is specified. * * @param props The properties for the RdsInstanceAlarm construct. */ function validateInstanceIdentifier(props) { if (!props.instanceIdentifier && !props.databaseInstance) { throw new Error('Either instanceIdentifier or databaseInstance must be specified.'); } } /** * An alarm that monitors CPU utilization for an RDS instance. * * This alarm is used to detect consistent high CPU utilization in order to prevent very * high response time and time-outs. * * The alarm is triggered when the CPU utilization exceeds the % threshold. */ class RdsInstanceCpuUtilizationAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const instanceIdentifier = props.instanceIdentifier ? props.instanceIdentifier : props.databaseInstance?.instanceIdentifier; const alarmName = props.alarmName ?? `${instanceIdentifier} - ${RdsRecommendedAlarmsMetrics.INSTANCE_CPU_UTILIZATION}`; 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 ?? 90; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm is used to detect consistent high CPU utilization in order to ' + 'prevent very high response time and time-outs. If you want to check micro-bursting ' + 'of CPU utilization you can set a lower alarm evaluation time.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); validateInstanceIdentifier(props); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/RDS', metricName: RdsRecommendedAlarmsMetrics.INSTANCE_CPU_UTILIZATION, dimensionsMap: { DBInstanceIdentifier: instanceIdentifier, }, 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.RdsInstanceCpuUtilizationAlarm = RdsInstanceCpuUtilizationAlarm; _a = JSII_RTTI_SYMBOL_1; RdsInstanceCpuUtilizationAlarm[_a] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsInstanceCpuUtilizationAlarm", version: "0.0.13" }; /** * An alarm that monitors the number of client network connections to the database instance. * * This alarm is used to help prevent rejected connections when the maximum number of DB * connections is reached. * * The alarm is triggered when number of connections is greater than threshold. */ class RdsInstanceDatabaseConnectionsAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const instanceIdentifier = props.instanceIdentifier ? props.instanceIdentifier : props.databaseInstance?.instanceIdentifier; const alarmName = props.alarmName ?? `${instanceIdentifier} - ${RdsRecommendedAlarmsMetrics.INSTANCE_DATABASE_CONNECTIONS}`; 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 is used to help prevent rejected connections when' + ' the maximum number of DB connections is reached. This alarm is not recommended if you frequently change DB' + ' instance class, because doing so changes the memory and default maximum number of connections.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); validateInstanceIdentifier(props); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/RDS', metricName: RdsRecommendedAlarmsMetrics.INSTANCE_DATABASE_CONNECTIONS, dimensionsMap: { DBInstanceIdentifier: instanceIdentifier, }, 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.RdsInstanceDatabaseConnectionsAlarm = RdsInstanceDatabaseConnectionsAlarm; _b = JSII_RTTI_SYMBOL_1; RdsInstanceDatabaseConnectionsAlarm[_b] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsInstanceDatabaseConnectionsAlarm", version: "0.0.13" }; /** * An alarm that monitors the amount of available memory (RAM) on the RDS instance. * * This alarm is used to help prevent running out of memory which can result in rejected connections. * * The alarm is triggered when the percentage of available memory is less than threshold. */ class RdsInstanceFreeableMemoryAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const instanceIdentifier = props.instanceIdentifier ? props.instanceIdentifier : props.databaseInstance?.instanceIdentifier; const alarmName = props.alarmName ?? `${instanceIdentifier} - ${RdsRecommendedAlarmsMetrics.INSTANCE_FREEABLE_MEMORY}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 15; const datapointsToAlarm = props.datapointsToAlarm ?? 15; const threshold = props.threshold; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm is used to help prevent running' + ' out of memory which can result in rejected connections.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); validateInstanceIdentifier(props); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/RDS', metricName: RdsRecommendedAlarmsMetrics.INSTANCE_FREEABLE_MEMORY, dimensionsMap: { DBInstanceIdentifier: instanceIdentifier, }, statistic: 'Average', 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.RdsInstanceFreeableMemoryAlarm = RdsInstanceFreeableMemoryAlarm; _c = JSII_RTTI_SYMBOL_1; RdsInstanceFreeableMemoryAlarm[_c] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsInstanceFreeableMemoryAlarm", version: "0.0.13" }; /** * An alarm that monitors the amount of available local storage space for an Aurora instance * used for temporary files. * * This alarm is used to detect how close the Aurora DB instance is to reaching the local storage limit. * This alarm can prevent an out-of-space error that occurs when your DB instance runs out of local storage. * * The alarm is triggered when the amount of available local storage space (bytes) is less than threshold. */ class RdsInstanceFreeLocalStorageAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const instanceIdentifier = props.instanceIdentifier ? props.instanceIdentifier : props.databaseInstance?.instanceIdentifier; const alarmName = props.alarmName ?? `${instanceIdentifier} - ${RdsRecommendedAlarmsMetrics.INSTANCE_FREE_LOCAL_STORAGE}`; 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 is used to detect how close the Aurora DB instance is' + ' to reaching the local storage limit, if you do not use Aurora Serverless v2 or higher. Local storage can reach' + ' capacity when you store non-persistent data, such as temporary table and log files, in the local storage. This' + ' alarm can prevent an out-of-space error that occurs when your DB instance runs out of local storage.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); validateInstanceIdentifier(props); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/RDS', metricName: RdsRecommendedAlarmsMetrics.INSTANCE_FREE_LOCAL_STORAGE, dimensionsMap: { DBInstanceIdentifier: instanceIdentifier, }, statistic: 'Average', 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.RdsInstanceFreeLocalStorageAlarm = RdsInstanceFreeLocalStorageAlarm; _d = JSII_RTTI_SYMBOL_1; RdsInstanceFreeLocalStorageAlarm[_d] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsInstanceFreeLocalStorageAlarm", version: "0.0.13" }; /** * An alarm that monitors the amount of available storage space for an Aurora instance. * * This alarm helps prevent storage full issues. This can prevent downtime that occurs when your database * instance runs out of storage. * * The alarm is triggered when the amount of available storage space (bytes) is less than threshold. */ class RdsInstanceFreeStorageSpaceAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const instanceIdentifier = props.instanceIdentifier ? props.instanceIdentifier : props.databaseInstance?.instanceIdentifier; const alarmName = props.alarmName ?? `${instanceIdentifier} - ${RdsRecommendedAlarmsMetrics.INSTANCE_FREE_STORAGE_SPACE}`; 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 helps prevent storage full issues. This can prevent downtime' + ' that occurs when your database instance runs out of storage. We do not recommend using this alarm if you have storage' + ' auto scaling enabled, or if you frequently change the storage capacity of the database instance.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); validateInstanceIdentifier(props); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/RDS', metricName: RdsRecommendedAlarmsMetrics.INSTANCE_FREE_STORAGE_SPACE, dimensionsMap: { DBInstanceIdentifier: instanceIdentifier, }, statistic: 'Average', 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.RdsInstanceFreeStorageSpaceAlarm = RdsInstanceFreeStorageSpaceAlarm; _e = JSII_RTTI_SYMBOL_1; RdsInstanceFreeStorageSpaceAlarm[_e] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsInstanceFreeStorageSpaceAlarm", version: "0.0.13" }; /** * An alarm that monitors the average amount of time taken per disk read I/O operation. * * This alarm is used to detect high read latency. Database disks normally have a low read/write latency, * but they can have issues that can cause high latency operations. * * The alarm is triggered when the average amount of time per disk read operation (in milliseconds) is * greater than threshold. */ class RdsInstanceReadLatencyAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const instanceIdentifier = props.instanceIdentifier ? props.instanceIdentifier : props.databaseInstance?.instanceIdentifier; const alarmName = props.alarmName ?? `${instanceIdentifier} - ${RdsRecommendedAlarmsMetrics.INSTANCE_READ_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; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm helps to monitor high read latency. Database disks' + ' normally have a low read/write latency, but they can have issues that can cause high latency operations.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); validateInstanceIdentifier(props); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/RDS', metricName: RdsRecommendedAlarmsMetrics.INSTANCE_READ_LATENCY, dimensionsMap: { DBInstanceIdentifier: instanceIdentifier, }, statistic: 'p90', 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.RdsInstanceReadLatencyAlarm = RdsInstanceReadLatencyAlarm; _f = JSII_RTTI_SYMBOL_1; RdsInstanceReadLatencyAlarm[_f] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsInstanceReadLatencyAlarm", version: "0.0.13" }; /** * An alarm that monitors the average amount of time taken per disk write I/O operation. * * This alarm is used to detect high write latency. Database disks normally have a low read/write latency, * but they can have issues that can cause high latency operations. * * The alarm is triggered when the average amount of time per disk write operation (in milliseconds) is * greater than threshold. */ class RdsInstanceWriteLatencyAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const instanceIdentifier = props.instanceIdentifier ? props.instanceIdentifier : props.databaseInstance?.instanceIdentifier; const alarmName = props.alarmName ?? `${instanceIdentifier} - ${RdsRecommendedAlarmsMetrics.INSTANCE_WRITE_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; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm helps to monitor high write latency.' + ' Although database disks typically have low read/write latency, they may experience problems' + ' that cause high latency operations. Monitoring this will assure you the disk latency is as low as expected.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); validateInstanceIdentifier(props); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/RDS', metricName: RdsRecommendedAlarmsMetrics.INSTANCE_WRITE_LATENCY, dimensionsMap: { DBInstanceIdentifier: instanceIdentifier, }, statistic: 'p90', 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.RdsInstanceWriteLatencyAlarm = RdsInstanceWriteLatencyAlarm; _g = JSII_RTTI_SYMBOL_1; RdsInstanceWriteLatencyAlarm[_g] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsInstanceWriteLatencyAlarm", version: "0.0.13" }; /** * An alarm that monitors the number of concurrent active sessions on the database. * * This alarm helps to monitor high DB load. If the number of processes exceed the number of vCPUs, * the processes start queuing. When the queuing increases, the performance is impacted. * * The alarm is triggered when the number of active sessions for the database is * greater than threshold. */ class RdsInstanceDbLoadAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const instanceIdentifier = props.instanceIdentifier ? props.instanceIdentifier : props.databaseInstance?.instanceIdentifier; const alarmName = props.alarmName ?? `${instanceIdentifier} - ${RdsRecommendedAlarmsMetrics.INSTANCE_DB_LOAD}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 15; const datapointsToAlarm = props.datapointsToAlarm ?? 15; const threshold = props.threshold; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm is used to detect a high DB load. High DB load' + ' can cause performance issues in the DB instance. This alarm is not applicable to serverless DB instances.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); validateInstanceIdentifier(props); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/RDS', metricName: RdsRecommendedAlarmsMetrics.INSTANCE_DB_LOAD, dimensionsMap: { DBInstanceIdentifier: instanceIdentifier, }, 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.RdsInstanceDbLoadAlarm = RdsInstanceDbLoadAlarm; _h = JSII_RTTI_SYMBOL_1; RdsInstanceDbLoadAlarm[_h] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsInstanceDbLoadAlarm", version: "0.0.13" }; /** * An alarm that monitors the remaining available space (in bytes) for the cluster volume. * * This alarm is used to detect how close the Aurora cluster is to the volume size limit. This * alarm can prevent an out-of-space error that occurs when your cluster runs out of space. * * The alarm is triggered when the remaining available space (in bytes) is less than threshold. */ class RdsAuroraVolumeBytesLeftTotalAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.databaseCluster.clusterIdentifier} - ${RdsRecommendedAlarmsMetrics.AURORA_VOLUME_BYTES_LEFT_TOTAL}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 2; const datapointsToAlarm = props.datapointsToAlarm ?? 2; const threshold = props.threshold; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm is used to detect how close the Aurora' + ' cluster is to the volume size limit. This alarm can prevent an out-of-space error that' + ' occurs when your cluster runs out of space. This alarm is recommended only for Aurora MySQL.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); if (!props.threshold) { throw new Error(`The threshold must be specified for ${RdsRecommendedAlarmsMetrics.AURORA_VOLUME_BYTES_LEFT_TOTAL} alarm.`); } super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/RDS', metricName: RdsRecommendedAlarmsMetrics.AURORA_VOLUME_BYTES_LEFT_TOTAL, dimensionsMap: { DBClusterIdentifier: props.databaseCluster.clusterIdentifier, }, statistic: 'Average', period, }), threshold: 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.RdsAuroraVolumeBytesLeftTotalAlarm = RdsAuroraVolumeBytesLeftTotalAlarm; _j = JSII_RTTI_SYMBOL_1; RdsAuroraVolumeBytesLeftTotalAlarm[_j] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsAuroraVolumeBytesLeftTotalAlarm", version: "0.0.13" }; /** * An alarm that monitors the error state of Aurora writer instance replication. * * This alarm is used to detect whether the writer instance is in an error state and can’t replicate the source. * * The alarm is triggered when the value is less than or equal to threshold. */ class RdsAuroraBinLogReplicationLagAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.databaseCluster.clusterIdentifier} - ${RdsRecommendedAlarmsMetrics.AURORA_BIN_LOG_REPLICATION_LAG}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(1); const evaluationPeriods = props.evaluationPeriods ?? 2; const datapointsToAlarm = props.datapointsToAlarm ?? 2; const threshold = props.threshold ?? -1; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm is used to detect whether the writer instance ' + 'is in an error state and can\'t replicate the source. This alarm is recommended only for Aurora MySQL.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/RDS', metricName: RdsRecommendedAlarmsMetrics.AURORA_BIN_LOG_REPLICATION_LAG, dimensionsMap: { DBClusterIdentifier: props.databaseCluster.clusterIdentifier, Role: 'WRITER', }, statistic: 'Average', period, }), threshold, evaluationPeriods, datapointsToAlarm, treatMissingData, comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.LESS_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.RdsAuroraBinLogReplicationLagAlarm = RdsAuroraBinLogReplicationLagAlarm; _k = JSII_RTTI_SYMBOL_1; RdsAuroraBinLogReplicationLagAlarm[_k] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsAuroraBinLogReplicationLagAlarm", version: "0.0.13" }; /** * A construct that creates recommended alarms for an RDS cluster instance. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#RDS */ class RdsInstanceRecommendedAlarms extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); if (!props.excludeAlarms?.includes(RdsRecommendedAlarmsMetrics.INSTANCE_CPU_UTILIZATION)) { this.alarmCpuUtilization = new RdsInstanceCpuUtilizationAlarm(this, 'InstanceCpuUtilizationAlarm', { instanceIdentifier: props.instanceIdentifier, databaseInstance: props.databaseInstance, treatMissingData: props.treatMissingData, ...props.configCpuUtilizationAlarm, }); if (props.defaultAlarmAction && !props.configCpuUtilizationAlarm?.alarmAction) { this.alarmCpuUtilization.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configCpuUtilizationAlarm?.okAction) { this.alarmCpuUtilization.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configCpuUtilizationAlarm?.insufficientDataAction) { this.alarmCpuUtilization.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(RdsRecommendedAlarmsMetrics.INSTANCE_DATABASE_CONNECTIONS)) { this.alarmDatabaseConnections = new RdsInstanceDatabaseConnectionsAlarm(this, 'InstanceDatabaseConnectionsAlarm', { instanceIdentifier: props.instanceIdentifier, databaseInstance: props.databaseInstance, treatMissingData: props.treatMissingData, ...props.configDatabaseConnectionsAlarm, }); if (props.defaultAlarmAction && !props.configDatabaseConnectionsAlarm.alarmAction) { this.alarmDatabaseConnections.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configDatabaseConnectionsAlarm.okAction) { this.alarmDatabaseConnections.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configDatabaseConnectionsAlarm.insufficientDataAction) { this.alarmDatabaseConnections.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(RdsRecommendedAlarmsMetrics.INSTANCE_FREEABLE_MEMORY)) { this.alarmFreeableMemory = new RdsInstanceFreeableMemoryAlarm(this, 'InstanceFreeableMemoryAlarm', { instanceIdentifier: props.instanceIdentifier, databaseInstance: props.databaseInstance, treatMissingData: props.treatMissingData, ...props.configFreeableMemoryAlarm, }); if (props.defaultAlarmAction && !props.configFreeableMemoryAlarm.alarmAction) { this.alarmFreeableMemory.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configFreeableMemoryAlarm.okAction) { this.alarmFreeableMemory.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configFreeableMemoryAlarm.insufficientDataAction) { this.alarmFreeableMemory.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(RdsRecommendedAlarmsMetrics.INSTANCE_FREE_LOCAL_STORAGE)) { this.alarmFreeLocalStorage = new RdsInstanceFreeLocalStorageAlarm(this, 'InstanceFreeLocalStorageAlarm', { instanceIdentifier: props.instanceIdentifier, databaseInstance: props.databaseInstance, treatMissingData: props.treatMissingData, ...props.configFreeLocalStorageAlarm, }); if (props.defaultAlarmAction && !props.configFreeLocalStorageAlarm.alarmAction) { this.alarmFreeLocalStorage.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configFreeLocalStorageAlarm.okAction) { this.alarmFreeLocalStorage.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configFreeLocalStorageAlarm.insufficientDataAction) { this.alarmFreeLocalStorage.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(RdsRecommendedAlarmsMetrics.INSTANCE_FREE_STORAGE_SPACE)) { this.alarmFreeStorageSpace = new RdsInstanceFreeStorageSpaceAlarm(this, 'InstanceFreeStorageSpaceAlarm', { instanceIdentifier: props.instanceIdentifier, databaseInstance: props.databaseInstance, treatMissingData: props.treatMissingData, ...props.configFreeStorageSpaceAlarm, }); if (props.defaultAlarmAction && !props.configFreeStorageSpaceAlarm.alarmAction) { this.alarmFreeStorageSpace.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configFreeStorageSpaceAlarm.okAction) { this.alarmFreeStorageSpace.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configFreeStorageSpaceAlarm.insufficientDataAction) { this.alarmFreeStorageSpace.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(RdsRecommendedAlarmsMetrics.INSTANCE_READ_LATENCY)) { this.alarmReadLatency = new RdsInstanceReadLatencyAlarm(this, 'InstanceReadLatencyAlarm', { instanceIdentifier: props.instanceIdentifier, databaseInstance: props.databaseInstance, treatMissingData: props.treatMissingData, ...props.configReadLatencyAlarm, }); if (props.defaultAlarmAction && !props.configReadLatencyAlarm.alarmAction) { this.alarmReadLatency.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configReadLatencyAlarm.okAction) { this.alarmReadLatency.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configReadLatencyAlarm.insufficientDataAction) { this.alarmReadLatency.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(RdsRecommendedAlarmsMetrics.INSTANCE_WRITE_LATENCY)) { this.alarmWriteLatency = new RdsInstanceWriteLatencyAlarm(this, 'InstanceWriteLatencyAlarm', { instanceIdentifier: props.instanceIdentifier, databaseInstance: props.databaseInstance, treatMissingData: props.treatMissingData, ...props.configWriteLatencyAlarm, }); if (props.defaultAlarmAction && !props.configWriteLatencyAlarm.alarmAction) { this.alarmWriteLatency.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configWriteLatencyAlarm.okAction) { this.alarmWriteLatency.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configWriteLatencyAlarm.insufficientDataAction) { this.alarmWriteLatency.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(RdsRecommendedAlarmsMetrics.INSTANCE_DB_LOAD)) { this.alarmDbLoad = new RdsInstanceDbLoadAlarm(this, 'InstanceDbLoadAlarm', { instanceIdentifier: props.instanceIdentifier, databaseInstance: props.databaseInstance, treatMissingData: props.treatMissingData, ...props.configDbLoadAlarm, }); if (props.defaultAlarmAction && !props.configDbLoadAlarm.alarmAction) { this.alarmDbLoad.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configDbLoadAlarm.okAction) { this.alarmDbLoad.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configDbLoadAlarm.insufficientDataAction) { this.alarmDbLoad.addInsufficientDataAction(props.defaultInsufficientDataAction); } } } } exports.RdsInstanceRecommendedAlarms = RdsInstanceRecommendedAlarms; _l = JSII_RTTI_SYMBOL_1; RdsInstanceRecommendedAlarms[_l] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsInstanceRecommendedAlarms", version: "0.0.13" }; /** * A construct that creates recommended alarms for an RDS cluster. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#RDS */ class RdsAuroraRecommendedAlarms extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); if (!props.excludeAlarms?.includes(RdsRecommendedAlarmsMetrics.AURORA_VOLUME_BYTES_LEFT_TOTAL) && props.databaseCluster.engine?.engineVersion?.fullVersion?.includes('mysql')) { this.alarmAuroraVolumeBytesLeftTotal = new RdsAuroraVolumeBytesLeftTotalAlarm(this, 'AuroraVolumeBytesLeftTotalAlarm', { databaseCluster: props.databaseCluster, treatMissingData: props.treatMissingData, ...props.configAuroraVolumeBytesLeftTotalAlarm, }); if (props.defaultAlarmAction && (!props.configAuroraVolumeBytesLeftTotalAlarm || !props.configAuroraVolumeBytesLeftTotalAlarm.alarmAction)) { this.alarmAuroraVolumeBytesLeftTotal.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && (!props.configAuroraVolumeBytesLeftTotalAlarm || !props.configAuroraVolumeBytesLeftTotalAlarm.okAction)) { this.alarmAuroraVolumeBytesLeftTotal.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && (!props.configAuroraVolumeBytesLeftTotalAlarm || !props.configAuroraVolumeBytesLeftTotalAlarm.insufficientDataAction)) { this.alarmAuroraVolumeBytesLeftTotal.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(RdsRecommendedAlarmsMetrics.AURORA_BIN_LOG_REPLICATION_LAG) && props.databaseCluster.engine?.engineVersion?.fullVersion?.includes('mysql')) { this.alarmAuroraBinLogReplicationLag = new RdsAuroraBinLogReplicationLagAlarm(this, 'AuroraBinLogReplicationLagAlarm', { databaseCluster: props.databaseCluster, treatMissingData: props.treatMissingData, ...props.configAuroraBinLogReplicationLagAlarm, }); if (props.defaultAlarmAction && (!props.configAuroraBinLogReplicationLagAlarm || !props.configAuroraBinLogReplicationLagAlarm.alarmAction)) { this.alarmAuroraBinLogReplicationLag.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && (!props.configAuroraBinLogReplicationLagAlarm || !props.configAuroraBinLogReplicationLagAlarm.okAction)) { this.alarmAuroraBinLogReplicationLag.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && (!props.configAuroraBinLogReplicationLagAlarm || !props.configAuroraBinLogReplicationLagAlarm.insufficientDataAction)) { this.alarmAuroraBinLogReplicationLag.addInsufficientDataAction(props.defaultInsufficientDataAction); } } const instanceIdentifiers = props.databaseCluster.instanceIdentifiers; instanceIdentifiers.forEach((instanceIdentifier, index) => { new RdsInstanceRecommendedAlarms(this, `RdsInstanceRecommendedAlarmsFromAspect-${index}`, { instanceIdentifier, ...props, }); }); } } exports.RdsAuroraRecommendedAlarms = RdsAuroraRecommendedAlarms; _m = JSII_RTTI_SYMBOL_1; RdsAuroraRecommendedAlarms[_m] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsAuroraRecommendedAlarms", version: "0.0.13" }; /** * An extension of the rds instance (database or cluster instance) construct * that provides methods to create recommended alarms */ class DatabaseInstance extends aws_cdk_lib_1.aws_rds.DatabaseInstance { constructor(scope, id, props) { super(scope, id, props); } /** * Creates an alarm that monitors the CpuUtilization. */ alarmCpuUtilization(props) { return new RdsInstanceCpuUtilizationAlarm(this, 'InstanceCpuUtilizationAlarm', { databaseInstance: this, ...props, }); } /** * Creates an alarm that monitors the DatabaseConnections. */ alarmDatabaseConnections(props) { return new RdsInstanceDatabaseConnectionsAlarm(this, 'InstanceDatabaseConnectionsAlarm', { databaseInstance: this, ...props, }); } /** * Creates an alarm that monitors the FreeableMemory. */ alarmFreeableMemory(props) { return new RdsInstanceFreeableMemoryAlarm(this, 'InstanceFreeableMemoryAlarm', { databaseInstance: this, ...props, }); } /** * Creates an alarm that monitors the FreeLocalStorage. */ alarmFreeLocalStorage(props) { return new RdsInstanceFreeLocalStorageAlarm(this, 'InstanceFreeLocalStorageAlarm', { databaseInstance: this, ...props, }); } /** * Creates an alarm that monitors the FreeStorageSpace. */ alarmFreeStorageSpace(props) { return new RdsInstanceFreeStorageSpaceAlarm(this, 'InstanceFreeStorageSpaceAlarm', { databaseInstance: this, ...props, }); } /** * Creates an alarm that monitors the ReadLatency. */ alarmReadLatency(props) { return new RdsInstanceReadLatencyAlarm(this, 'InstanceReadLatencyAlarm', { databaseInstance: this, ...props, }); } /** * Creates an alarm that monitors the WriteLatency. */ alarmWriteLatency(props) { return new RdsInstanceWriteLatencyAlarm(this, 'InstanceWriteLatencyAlarm', { databaseInstance: this, ...props, }); } /** * Creates an alarm that monitors the DbLoad. */ alarmDbLoad(props) { return new RdsInstanceDbLoadAlarm(this, 'InstanceDbLoadAlarm', { databaseInstance: this, ...props, }); } /** * Creates recommended alarms for the database instance. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#RDS */ applyRecommendedAlarms(props) { return new RdsInstanceRecommendedAlarms(this, 'RdsInstanceRecommendedAlarms', { databaseInstance: this, ...props, }); } } exports.DatabaseInstance = DatabaseInstance; _o = JSII_RTTI_SYMBOL_1; DatabaseInstance[_o] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DatabaseInstance", version: "0.0.13" }; /** * An extension of the database cluster construct * that provides methods to create recommended alarms */ class DatabaseCluster extends aws_cdk_lib_1.aws_rds.DatabaseCluster { constructor(scope, id, props) { super(scope, id, props); } /** * Creates an alarm that monitors the AuroraVolumeBytesLeftTotal. */ alarmAuroraVolumeBytesLeftTotal(props) { return new RdsAuroraVolumeBytesLeftTotalAlarm(this, 'AuroraVolumeBytesLeftTotalAlarm', { databaseCluster: this, ...props, }); } /** * Creates an alarm that monitors the Bin Log Replication lag. */ alarmAuroraBinLogReplicationLag(props) { return new RdsAuroraBinLogReplicationLagAlarm(this, 'AuroraBinLogReplicationLagAlarm', { databaseCluster: this, ...props, }); } /** * Creates recommended alarms for the database cluster. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#RDS */ applyRecommendedAlarms(props) { return new RdsAuroraRecommendedAlarms(this, 'RdsAuroraRecommendedAlarms', { databaseCluster: this, ...props, }); } } exports.DatabaseCluster = DatabaseCluster; _p = JSII_RTTI_SYMBOL_1; DatabaseCluster[_p] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DatabaseCluster", version: "0.0.13" }; /** * An aspect that applies recommended alarms for RDS database instances. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#RDS */ class RdsInstanceRecommendedAlarmsAspect { constructor(props) { this.props = props; } visit(node) { if (node instanceof aws_cdk_lib_1.aws_rds.DatabaseInstance) { if (this.props.excludeResources && this.props.excludeResources.includes(node.node.id)) { return; } else { const databaseInstance = node; new RdsInstanceRecommendedAlarms(node, 'RdsInstanceRecommendedAlarmsFromAspect', { databaseInstance, ...this.props, }); } } } } exports.RdsInstanceRecommendedAlarmsAspect = RdsInstanceRecommendedAlarmsAspect; _q = JSII_RTTI_SYMBOL_1; RdsInstanceRecommendedAlarmsAspect[_q] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.RdsInstanceRecommendedAlarmsAspect", version: "0.0.13" }; /** * An aspect that applies recommended alarms for RDS clusters. * * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#RDS */ class RdsAuroraRecommendedAlarmsAspect { constructor(props) { this.props = props; } visit(node) { if (node instanceof aws_cdk_lib_1.aws_rds.DatabaseCluster) { if (this.props.excludeResources && this.props.excludeResources.includes(node.node.id)) { return; } else { const databaseCluster = node; new RdsAuroraRecommendedAlarms(node, 'RdsAur