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.

748 lines 134 kB
"use strict"; var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; Object.defineProperty(exports, "__esModule", { value: true }); exports.DmsReplicationInstanceRecommendedAlarmsAspect = exports.ReplicationInstance = exports.DmsReplicationTaskRecommendedAlarmsAspect = exports.ReplicationTask = exports.DmsReplicationTaskRecommendedAlarms = exports.DmsReplicationInstanceRecommendedAlarms = exports.DmsReplicationTaskCdcLatencyTargetAlarm = exports.DmsReplicationTaskCdcLatencySourceAlarm = exports.DmsReplicationInstanceSwapUsageAlarm = exports.DmsReplicationInstanceWriteIopsAlarm = exports.DmsReplicationInstanceFreeStorageSpaceAlarm = exports.DmsReplicationInstanceFreeableMemoryAlarm = exports.DmsReplicationInstanceCpuUtilizationAlarm = exports.DmsReplicationTaskRecommendedAlarmsMetrics = exports.DmsReplicationInstanceRecommendedAlarmsMetrics = exports.DmsReplicationTaskMigrationType = 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"); /** * DMS Replication Task migration types. * * These are the valid migration types for AWS DMS Replication Tasks. */ var DmsReplicationTaskMigrationType; (function (DmsReplicationTaskMigrationType) { /** * Full load migration - copies all existing data from the source to the target. */ DmsReplicationTaskMigrationType["FULL_LOAD"] = "full-load"; /** * Change Data Capture (CDC) migration - captures ongoing changes from the source. */ DmsReplicationTaskMigrationType["CDC"] = "cdc"; /** * Full load and CDC migration - performs initial full load then captures ongoing changes. */ DmsReplicationTaskMigrationType["FULL_LOAD_AND_CDC"] = "full-load-and-cdc"; })(DmsReplicationTaskMigrationType || (exports.DmsReplicationTaskMigrationType = DmsReplicationTaskMigrationType = {})); /** * The recommended metrics for DMS Replication Instance alarms. */ var DmsReplicationInstanceRecommendedAlarmsMetrics; (function (DmsReplicationInstanceRecommendedAlarmsMetrics) { /** * The percentage of allocated vCPU (virtual CPU) currently in use on the instance. */ DmsReplicationInstanceRecommendedAlarmsMetrics["CPU_UTILIZATION"] = "CPUUtilization"; /** * The amount in bytes of available random access memory. */ DmsReplicationInstanceRecommendedAlarmsMetrics["FREEABLE_MEMORY"] = "FreeableMemory"; /** * The amount in bytes of available storage space. */ DmsReplicationInstanceRecommendedAlarmsMetrics["FREE_STORAGE_SPACE"] = "FreeStorageSpace"; /** * The average number of disk write I/O operations per second. */ DmsReplicationInstanceRecommendedAlarmsMetrics["WRITE_IOPS"] = "WriteIOPS"; /** * The amount in bytes of swap space used on the replication instance. */ DmsReplicationInstanceRecommendedAlarmsMetrics["SWAP_USAGE"] = "SwapUsage"; })(DmsReplicationInstanceRecommendedAlarmsMetrics || (exports.DmsReplicationInstanceRecommendedAlarmsMetrics = DmsReplicationInstanceRecommendedAlarmsMetrics = {})); /** * The recommended metrics for DMS Replication Task alarms. */ var DmsReplicationTaskRecommendedAlarmsMetrics; (function (DmsReplicationTaskRecommendedAlarmsMetrics) { /** * The gap, in seconds, between the last event captured from the source endpoint and current system time. */ DmsReplicationTaskRecommendedAlarmsMetrics["CDC_LATENCY_SOURCE"] = "CDCLatencySource"; /** * The gap, in seconds, between a change that was committed to the source and the same change committed to the target. */ DmsReplicationTaskRecommendedAlarmsMetrics["CDC_LATENCY_TARGET"] = "CDCLatencyTarget"; })(DmsReplicationTaskRecommendedAlarmsMetrics || (exports.DmsReplicationTaskRecommendedAlarmsMetrics = DmsReplicationTaskRecommendedAlarmsMetrics = {})); /** * This alarm is used to detect high CPU utilization for the DMS Replication Instance. * * Consistent high CPU utilization can indicate a resource bottleneck or application * performance problems. * * The alarm is triggered when CPU utilization exceeds % threshold. */ class DmsReplicationInstanceCpuUtilizationAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.replicationInstance.replicationInstanceIdentifier} - ${DmsReplicationInstanceRecommendedAlarmsMetrics.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 high CPU utilization for the DMS Replication Instance.' + ' Consistent high CPU utilization can indicate a resource bottleneck or application performance problems.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/DMS', metricName: DmsReplicationInstanceRecommendedAlarmsMetrics.CPU_UTILIZATION, dimensionsMap: { ReplicationInstanceIdentifier: props.replicationInstance.replicationInstanceIdentifier, }, 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.DmsReplicationInstanceCpuUtilizationAlarm = DmsReplicationInstanceCpuUtilizationAlarm; _a = JSII_RTTI_SYMBOL_1; DmsReplicationInstanceCpuUtilizationAlarm[_a] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DmsReplicationInstanceCpuUtilizationAlarm", version: "0.0.17" }; ; /** * An alarm that monitors the amount of available memory (RAM) on the replication instance. * * This alarm is used to help prevent running out of memory. * * The alarm is triggered when the percentage of available memory is less than threshold. */ class DmsReplicationInstanceFreeableMemoryAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.replicationInstance.replicationInstanceIdentifier} - ${DmsReplicationInstanceRecommendedAlarmsMetrics.FREEABLE_MEMORY}`; 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 running out of memory.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/DMS', metricName: DmsReplicationInstanceRecommendedAlarmsMetrics.FREEABLE_MEMORY, dimensionsMap: { ReplicationInstanceIdentifier: props.replicationInstance.replicationInstanceIdentifier, }, 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.DmsReplicationInstanceFreeableMemoryAlarm = DmsReplicationInstanceFreeableMemoryAlarm; _b = JSII_RTTI_SYMBOL_1; DmsReplicationInstanceFreeableMemoryAlarm[_b] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DmsReplicationInstanceFreeableMemoryAlarm", version: "0.0.17" }; /** * An alarm that monitors the amount of available storage space for a DMS Replication Instance. * * This alarm helps prevent storage full issues. This can prevent downtime that occurs when your replication * instance runs out of storage. * * The alarm is triggered when the amount of available storage space (bytes) is less than threshold. */ class DmsReplicationInstanceFreeStorageSpaceAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.replicationInstance.replicationInstanceIdentifier} - ${DmsReplicationInstanceRecommendedAlarmsMetrics.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 replication instance runs out of storage.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/DMS', metricName: DmsReplicationInstanceRecommendedAlarmsMetrics.FREE_STORAGE_SPACE, dimensionsMap: { ReplicationInstanceIdentifier: props.replicationInstance.replicationInstanceIdentifier, }, 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.DmsReplicationInstanceFreeStorageSpaceAlarm = DmsReplicationInstanceFreeStorageSpaceAlarm; _c = JSII_RTTI_SYMBOL_1; DmsReplicationInstanceFreeStorageSpaceAlarm[_c] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DmsReplicationInstanceFreeStorageSpaceAlarm", version: "0.0.17" }; ; /** * This alarm is used to detect high write IOPS for the DMS Replication Instance. * * High write IOPS can indicate heavy write activity or potential I/O bottlenecks. * This can help identify performance issues or unexpected workload patterns. * * The alarm is triggered when write IOPS exceeds the specified threshold. */ class DmsReplicationInstanceWriteIopsAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.replicationInstance.replicationInstanceIdentifier} - ${DmsReplicationInstanceRecommendedAlarmsMetrics.WRITE_IOPS}`; 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 ?? 1000; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const alarmDescription = props.alarmDescription ?? 'This alarm is used to detect high write IOPS for the DMS Replication Instance.' + ' High write IOPS can indicate heavy write activity or potential I/O bottlenecks.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/DMS', metricName: DmsReplicationInstanceRecommendedAlarmsMetrics.WRITE_IOPS, dimensionsMap: { ReplicationInstanceIdentifier: props.replicationInstance.replicationInstanceIdentifier, }, statistic: 'Average', 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.DmsReplicationInstanceWriteIopsAlarm = DmsReplicationInstanceWriteIopsAlarm; _d = JSII_RTTI_SYMBOL_1; DmsReplicationInstanceWriteIopsAlarm[_d] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DmsReplicationInstanceWriteIopsAlarm", version: "0.0.17" }; ; /** * This anomaly detection alarm is used to detect high swap usage for the DMS Replication Instance. * * High swap usage can indicate memory pressure, performance issues, or resource constraints. * This alarm uses anomaly detection to identify when swap usage exceeds normal patterns, * which can help identify performance degradation or insufficient memory allocation. * * By default, the alarm is triggered when swap usage exceeds the upper threshold * of the anomaly detection band, detecting unusually high swap usage that may * indicate memory pressure or performance issues. * * Note: Anomaly detection alarms use a fixed 5-minute period as required by AWS CloudWatch. * This period cannot be customized and is optimal for anomaly detection algorithms. */ class DmsReplicationInstanceSwapUsageAlarm extends aws_cdk_lib_1.aws_cloudwatch.AnomalyDetectionAlarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.replicationInstance.replicationInstanceIdentifier} - ${DmsReplicationInstanceRecommendedAlarmsMetrics.SWAP_USAGE}`; // Anomaly detection alarms require a fixed 5-minute period as mandated by AWS CloudWatch. const period = aws_cdk_lib_1.Duration.minutes(5); const evaluationPeriods = props.evaluationPeriods ?? 3; const datapointsToAlarm = props.datapointsToAlarm ?? 2; const stdDevs = props.stdDevs ?? 8; const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const comparisonOperator = props.comparisonOperator ?? aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_UPPER_THRESHOLD; const alarmDescription = props.alarmDescription ?? 'This alarm is used to detect high swap usage for the DMS Replication Instance.' + ' High swap usage can indicate memory pressure, performance issues, or resource constraints.' + ' This alarm triggers when swap usage exceeds the upper threshold of the anomaly detection band.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/DMS', metricName: DmsReplicationInstanceRecommendedAlarmsMetrics.SWAP_USAGE, dimensionsMap: { ReplicationInstanceIdentifier: props.replicationInstance.replicationInstanceIdentifier, }, statistic: 'Average', period, }), stdDevs, evaluationPeriods, datapointsToAlarm, treatMissingData, comparisonOperator, alarmDescription, }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.DmsReplicationInstanceSwapUsageAlarm = DmsReplicationInstanceSwapUsageAlarm; _e = JSII_RTTI_SYMBOL_1; DmsReplicationInstanceSwapUsageAlarm[_e] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DmsReplicationInstanceSwapUsageAlarm", version: "0.0.17" }; ; /** * An alarm that monitors the CDC latency (in seconds) from the source database. * * This alarm monitors the gap between the last event captured from the source endpoint * and current system time. It can help detect: * - Replication lag indicating source database performance issues * - Network connectivity problems affecting CDC capture * - Source database load affecting change capture performance * - Data freshness issues that could impact real-time applications * * The alarm is typically configured to trigger on high latency values. */ class DmsReplicationTaskCdcLatencySourceAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.replicationTask.replicationTaskIdentifier} - ${DmsReplicationTaskRecommendedAlarmsMetrics.CDC_LATENCY_SOURCE}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(5); // Longer period for latency metrics const evaluationPeriods = props.evaluationPeriods ?? 3; const datapointsToAlarm = props.datapointsToAlarm ?? 2; const threshold = props.threshold ?? 300; // Default threshold for detecting high latency (5 minutes) const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const comparisonOperator = props.comparisonOperator ?? aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD; const alarmDescription = props.alarmDescription ?? 'This alarm monitors CDC latency from the source database. ' + 'High values may indicate replication lag or source database performance issues. ' + 'This can affect data freshness in real-time applications.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/DMS', metricName: DmsReplicationTaskRecommendedAlarmsMetrics.CDC_LATENCY_SOURCE, dimensionsMap: { ReplicationTaskIdentifier: aws_cdk_lib_1.Fn.select(6, aws_cdk_lib_1.Fn.split(':', props.replicationTask.ref)), ReplicationInstanceIdentifier: props.replicationTask.replicationInstanceIdentifier, }, statistic: 'Average', period, }), threshold, evaluationPeriods, datapointsToAlarm, treatMissingData, comparisonOperator, alarmDescription, }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.DmsReplicationTaskCdcLatencySourceAlarm = DmsReplicationTaskCdcLatencySourceAlarm; _f = JSII_RTTI_SYMBOL_1; DmsReplicationTaskCdcLatencySourceAlarm[_f] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DmsReplicationTaskCdcLatencySourceAlarm", version: "0.0.17" }; /** * An alarm that monitors the CDC latency (in seconds) to the target database. * * This alarm monitors the gap between a change that was committed to the source * and the same change committed to the target. It can help detect: * - End-to-end replication latency affecting data consistency * - Target database performance issues affecting write operations * - Network connectivity problems between replication instance and target * - Data consistency issues that could impact downstream applications * * The alarm is typically configured to trigger on high latency values. */ class DmsReplicationTaskCdcLatencyTargetAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm { constructor(scope, id, props) { const alarmName = props.alarmName ?? `${props.replicationTask.replicationTaskIdentifier} - ${DmsReplicationTaskRecommendedAlarmsMetrics.CDC_LATENCY_TARGET}`; const period = props.period ?? aws_cdk_lib_1.Duration.minutes(5); // Longer period for latency metrics const evaluationPeriods = props.evaluationPeriods ?? 3; const datapointsToAlarm = props.datapointsToAlarm ?? 2; const threshold = props.threshold ?? 300; // Default threshold for detecting high latency (5 minutes) const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING; const comparisonOperator = props.comparisonOperator ?? aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD; const alarmDescription = props.alarmDescription ?? 'This alarm monitors CDC latency to the target database. ' + 'High values may indicate replication lag or target database performance issues. ' + 'This can affect data consistency in downstream applications.'; (0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName); super(scope, id, { alarmName, metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({ namespace: 'AWS/DMS', metricName: DmsReplicationTaskRecommendedAlarmsMetrics.CDC_LATENCY_TARGET, dimensionsMap: { ReplicationTaskIdentifier: aws_cdk_lib_1.Fn.select(6, aws_cdk_lib_1.Fn.split(':', props.replicationTask.ref)), ReplicationInstanceIdentifier: props.replicationTask.replicationInstanceIdentifier, }, statistic: 'Average', period, }), threshold, evaluationPeriods, datapointsToAlarm, treatMissingData, comparisonOperator, alarmDescription, }); if (props.alarmAction) this.addAlarmAction(props.alarmAction); if (props.okAction) this.addOkAction(props.okAction); if (props.insufficientDataAction) this.addInsufficientDataAction(props.insufficientDataAction); } } exports.DmsReplicationTaskCdcLatencyTargetAlarm = DmsReplicationTaskCdcLatencyTargetAlarm; _g = JSII_RTTI_SYMBOL_1; DmsReplicationTaskCdcLatencyTargetAlarm[_g] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DmsReplicationTaskCdcLatencyTargetAlarm", version: "0.0.17" }; /** * A construct that creates the recommended alarms for a DMS Replication Instance. */ class DmsReplicationInstanceRecommendedAlarms extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); if (!props.excludeAlarms?.includes(DmsReplicationInstanceRecommendedAlarmsMetrics.CPU_UTILIZATION)) { this.alarmCpuUtilization = new DmsReplicationInstanceCpuUtilizationAlarm(this, `${props.replicationInstance.replicationInstanceIdentifier}_CpuUtilization`, { replicationInstance: props.replicationInstance, 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(DmsReplicationInstanceRecommendedAlarmsMetrics.FREEABLE_MEMORY)) { this.alarmFreeableMemory = new DmsReplicationInstanceFreeableMemoryAlarm(this, `${props.replicationInstance.replicationInstanceIdentifier}_FreeableMemory`, { replicationInstance: props.replicationInstance, 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(DmsReplicationInstanceRecommendedAlarmsMetrics.FREE_STORAGE_SPACE)) { this.alarmFreeStorageSpace = new DmsReplicationInstanceFreeStorageSpaceAlarm(this, `${props.replicationInstance.replicationInstanceIdentifier}_FreeStorageSpace`, { replicationInstance: props.replicationInstance, 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(DmsReplicationInstanceRecommendedAlarmsMetrics.WRITE_IOPS)) { this.alarmWriteIops = new DmsReplicationInstanceWriteIopsAlarm(this, `${props.replicationInstance.replicationInstanceIdentifier}_WriteIops`, { replicationInstance: props.replicationInstance, treatMissingData: props.treatMissingData, ...props.configWriteIopsAlarm, }); if (props.defaultAlarmAction && !props.configWriteIopsAlarm?.alarmAction) { this.alarmWriteIops.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configWriteIopsAlarm?.okAction) { this.alarmWriteIops.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configWriteIopsAlarm?.insufficientDataAction) { this.alarmWriteIops.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (!props.excludeAlarms?.includes(DmsReplicationInstanceRecommendedAlarmsMetrics.SWAP_USAGE)) { this.alarmSwapUsage = new DmsReplicationInstanceSwapUsageAlarm(this, `${props.replicationInstance.replicationInstanceIdentifier}_SwapUsage`, { replicationInstance: props.replicationInstance, treatMissingData: props.treatMissingData, ...props.configSwapUsageAlarm, }); if (props.defaultAlarmAction && !props.configSwapUsageAlarm?.alarmAction) { this.alarmSwapUsage.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configSwapUsageAlarm?.okAction) { this.alarmSwapUsage.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configSwapUsageAlarm?.insufficientDataAction) { this.alarmSwapUsage.addInsufficientDataAction(props.defaultInsufficientDataAction); } } } } exports.DmsReplicationInstanceRecommendedAlarms = DmsReplicationInstanceRecommendedAlarms; _h = JSII_RTTI_SYMBOL_1; DmsReplicationInstanceRecommendedAlarms[_h] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DmsReplicationInstanceRecommendedAlarms", version: "0.0.17" }; /** * A construct that creates the recommended alarms for a DMS Replication Task. */ class DmsReplicationTaskRecommendedAlarms extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); // Check if migration type supports CDC alarms const supportsCdc = props.replicationTask.migrationType === DmsReplicationTaskMigrationType.CDC || props.replicationTask.migrationType === DmsReplicationTaskMigrationType.FULL_LOAD_AND_CDC; if (supportsCdc && !props.excludeAlarms?.includes(DmsReplicationTaskRecommendedAlarmsMetrics.CDC_LATENCY_SOURCE)) { this.alarmCdcLatencySource = new DmsReplicationTaskCdcLatencySourceAlarm(this, `${props.replicationTask.replicationTaskIdentifier}_CdcLatencySource`, { replicationTask: props.replicationTask, treatMissingData: props.treatMissingData, ...props.configCdcLatencySourceAlarm, }); if (props.defaultAlarmAction && !props.configCdcLatencySourceAlarm?.alarmAction) { this.alarmCdcLatencySource.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configCdcLatencySourceAlarm?.okAction) { this.alarmCdcLatencySource.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configCdcLatencySourceAlarm?.insufficientDataAction) { this.alarmCdcLatencySource.addInsufficientDataAction(props.defaultInsufficientDataAction); } } if (supportsCdc && !props.excludeAlarms?.includes(DmsReplicationTaskRecommendedAlarmsMetrics.CDC_LATENCY_TARGET)) { this.alarmCdcLatencyTarget = new DmsReplicationTaskCdcLatencyTargetAlarm(this, `${props.replicationTask.replicationTaskIdentifier}_CdcLatencyTarget`, { replicationTask: props.replicationTask, treatMissingData: props.treatMissingData, ...props.configCdcLatencyTargetAlarm, }); if (props.defaultAlarmAction && !props.configCdcLatencyTargetAlarm?.alarmAction) { this.alarmCdcLatencyTarget.addAlarmAction(props.defaultAlarmAction); } if (props.defaultOkAction && !props.configCdcLatencyTargetAlarm?.okAction) { this.alarmCdcLatencyTarget.addOkAction(props.defaultOkAction); } if (props.defaultInsufficientDataAction && !props.configCdcLatencyTargetAlarm?.insufficientDataAction) { this.alarmCdcLatencyTarget.addInsufficientDataAction(props.defaultInsufficientDataAction); } } } } exports.DmsReplicationTaskRecommendedAlarms = DmsReplicationTaskRecommendedAlarms; _j = JSII_RTTI_SYMBOL_1; DmsReplicationTaskRecommendedAlarms[_j] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DmsReplicationTaskRecommendedAlarms", version: "0.0.17" }; /** * An extension for the CfnReplicationTask construct that provides methods * to create recommended alarms. */ class ReplicationTask extends aws_cdk_lib_1.aws_dms.CfnReplicationTask { constructor(scope, id, props) { super(scope, id, props); this.replicationInstanceIdentifier = props.replicationInstanceIdentifier; } /** * Creates an alarm that monitors the CDC latency from the source for the Replication Task. */ alarmCdcLatencySource(props) { if (this.migrationType !== DmsReplicationTaskMigrationType.CDC && this.migrationType !== DmsReplicationTaskMigrationType.FULL_LOAD_AND_CDC) { throw new Error(`CDC latency alarms can only be created for replication tasks with migration type '${DmsReplicationTaskMigrationType.CDC}' or ` + `'${DmsReplicationTaskMigrationType.FULL_LOAD_AND_CDC}'. Current migration type: ${this.migrationType}`); } return new DmsReplicationTaskCdcLatencySourceAlarm(this, 'CdcLatencySourceAlarm', { replicationTask: this, ...props, }); } /** * Creates an alarm that monitors the CDC latency to the target for the Replication Task. */ alarmCdcLatencyTarget(props) { if (this.migrationType !== DmsReplicationTaskMigrationType.CDC && this.migrationType !== DmsReplicationTaskMigrationType.FULL_LOAD_AND_CDC) { throw new Error(`CDC latency alarms can only be created for replication tasks with migration type '${DmsReplicationTaskMigrationType.CDC}' or ` + `'${DmsReplicationTaskMigrationType.FULL_LOAD_AND_CDC}'. Current migration type: ${this.migrationType}`); } return new DmsReplicationTaskCdcLatencyTargetAlarm(this, 'CdcLatencyTargetAlarm', { replicationTask: this, ...props, }); } /** * Creates the recommended alarms for the DMS Replication Task. * * @see https://aws.amazon.com/blogs/database/setting-up-amazon-cloudwatch-alarms-for-aws-dms-resources-using-the-aws-cli/ */ applyRecommendedAlarms(props) { return new DmsReplicationTaskRecommendedAlarms(this, 'DmsReplicationTaskRecommendedAlarms', { replicationTask: this, ...props, }); } } exports.ReplicationTask = ReplicationTask; _k = JSII_RTTI_SYMBOL_1; ReplicationTask[_k] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ReplicationTask", version: "0.0.17" }; /** * Configures the recommended alarms for a DMS Replication Task. * * @see https://aws.amazon.com/blogs/database/setting-up-amazon-cloudwatch-alarms-for-aws-dms-resources-using-the-aws-cli/ */ class DmsReplicationTaskRecommendedAlarmsAspect { constructor(props) { this.props = props; } visit(node) { if (node instanceof ReplicationTask) { if (this.props?.excludeResources && this.props.excludeResources.includes(node.node.id)) { return; } else { const replicationTask = node; new DmsReplicationTaskRecommendedAlarms(replicationTask, 'DmsReplicationTaskRecommendedAlarmsFromAspect', { replicationTask, ...this.props, }); } } } } exports.DmsReplicationTaskRecommendedAlarmsAspect = DmsReplicationTaskRecommendedAlarmsAspect; _l = JSII_RTTI_SYMBOL_1; DmsReplicationTaskRecommendedAlarmsAspect[_l] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DmsReplicationTaskRecommendedAlarmsAspect", version: "0.0.17" }; /** * An extension for the CfnReplicationInstance construct that provides methods * to create recommended alarms. */ class ReplicationInstance extends aws_cdk_lib_1.aws_dms.CfnReplicationInstance { constructor(scope, id, props) { super(scope, id, props); } /** * Creates an alarm that monitors the CPU utilization for the Replication Instance. */ alarmCpuUtilization(props) { return new DmsReplicationInstanceCpuUtilizationAlarm(this, 'CpuUtilizationAlarm', { replicationInstance: this, ...props, }); } /** * Creates an alarm that monitors the FreeableMemory for the Replication Instance. */ alarmFreeableMemory(props) { return new DmsReplicationInstanceFreeableMemoryAlarm(this, 'FreeableMemoryAlarm', { replicationInstance: this, ...props, }); } /** * Creates an alarm that monitors the Free Storage Space for the Replication Instance. */ alarmFreeStorageSpace(props) { return new DmsReplicationInstanceFreeStorageSpaceAlarm(this, 'FreeStorageSpaceAlarm', { replicationInstance: this, ...props, }); } /** * Creates an alarm that monitors the Write IOPS for the Replication Instance. */ alarmWriteIops(props) { return new DmsReplicationInstanceWriteIopsAlarm(this, 'WriteIopsAlarm', { replicationInstance: this, ...props, }); } /** * Creates an alarm that monitors the Swap Usage for the Replication Instance. */ alarmSwapUsage(props) { return new DmsReplicationInstanceSwapUsageAlarm(this, 'SwapUsageAlarm', { replicationInstance: this, ...props, }); } /** * Creates the recommended alarms for the DMS Replication Instance. * * @see https://aws.amazon.com/blogs/database/setting-up-amazon-cloudwatch-alarms-for-aws-dms-resources-using-the-aws-cli/ */ applyRecommendedAlarms(props) { return new DmsReplicationInstanceRecommendedAlarms(this, 'DmsReplicationInstanceRecommendedAlarms', { replicationInstance: this, ...props, }); } } exports.ReplicationInstance = ReplicationInstance; _m = JSII_RTTI_SYMBOL_1; ReplicationInstance[_m] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ReplicationInstance", version: "0.0.17" }; /** * Configures the recommended alarms for a DMS Replication Instance. * * @see https://aws.amazon.com/blogs/database/setting-up-amazon-cloudwatch-alarms-for-aws-dms-resources-using-the-aws-cli/ */ class DmsReplicationInstanceRecommendedAlarmsAspect { constructor(props) { this.props = props; } visit(node) { if (node instanceof aws_cdk_lib_1.aws_dms.CfnReplicationInstance) { if (this.props.excludeResources && this.props.excludeResources.includes(node.node.id)) { return; } else { const replicationInstance = node; new DmsReplicationInstanceRecommendedAlarms(replicationInstance, 'DmsReplicationInstanceRecommendedAlarmsFromAspect', { replicationInstance, ...this.props, }); } } } } exports.DmsReplicationInstanceRecommendedAlarmsAspect = DmsReplicationInstanceRecommendedAlarmsAspect; _o = JSII_RTTI_SYMBOL_1; DmsReplicationInstanceRecommendedAlarmsAspect[_o] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.DmsReplicationInstanceRecommendedAlarmsAspect", version: "0.0.17" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Rtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQU1xQjtBQUNyQiwyQ0FBbUQ7QUFDbkQscUNBQW9FO0FBRXBFOzs7O0dBSUc7QUFDSCxJQUFZLCtCQWVYO0FBZkQsV0FBWSwrQkFBK0I7SUFDekM7O09BRUc7SUFDSCwwREFBdUIsQ0FBQTtJQUV2Qjs7T0FFRztJQUNILDhDQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILDBFQUF1QyxDQUFBO0FBQ3pDLENBQUMsRUFmVywrQkFBK0IsK0NBQS9CLCtCQUErQixRQWUxQztBQUVEOztHQUVHO0FBQ0gsSUFBWSw4Q0FxQlg7QUFyQkQsV0FBWSw4Q0FBOEM7SUFDeEQ7O09BRUc7SUFDSCxvRkFBa0MsQ0FBQTtJQUNsQzs7T0FFRztJQUNILG9GQUFrQyxDQUFBO0lBQ2xDOztPQUVHO0lBQ0gseUZBQXVDLENBQUE7SUFDdkM7O09BRUc7SUFDSCwwRUFBd0IsQ0FBQTtJQUN4Qjs7T0FFRztJQUNILDBFQUF3QixDQUFBO0FBQzFCLENBQUMsRUFyQlcsOENBQThDLDhEQUE5Qyw4Q0FBOEMsUUFxQnpEO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLDBDQVNYO0FBVEQsV0FBWSwwQ0FBMEM7SUFDcEQ7O09BRUc7SUFDSCxxRkFBdUMsQ0FBQTtJQUN2Qzs7T0FFRztJQUNILHFGQUF1QyxDQUFBO0FBQ3pDLENBQUMsRUFUVywwQ0FBMEMsMERBQTFDLDBDQUEwQyxRQVNyRDtBQW9HRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSx5Q0FBMEMsU0FBUSw0QkFBVSxDQUFDLEtBQUs7SUFDN0UsWUFBWSxLQUFpQixFQUFFLEVBQVUsRUFBRSxLQUFxRDtRQUM5RixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUztZQUMvQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyw2QkFBNkIsTUFBTSw4Q0FBOEMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNu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