@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
JavaScript
"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.13" };
;
/**
* 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.13" };
/**
* 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.13" };
;
/**
* 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.13" };
;
/**
* 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.13" };
;
/**
* 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.13" };
/**
* 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.13" };
/**
* 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.13" };
/**
* 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.13" };
/**
* 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.13" };
/**
* 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.13" };
/**
* 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.13" };
/**
* 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.13" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Rtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQU1xQjtBQUNyQiwyQ0FBbUQ7QUFDbkQscUNBQW9FO0FBRXBFOzs7O0dBSUc7QUFDSCxJQUFZLCtCQWVYO0FBZkQsV0FBWSwrQkFBK0I7SUFDekM7O09BRUc7SUFDSCwwREFBdUIsQ0FBQTtJQUV2Qjs7T0FFRztJQUNILDhDQUFXLENBQUE7SUFFWDs7T0FFRztJQUNILDBFQUF1QyxDQUFBO0FBQ3pDLENBQUMsRUFmVywrQkFBK0IsK0NBQS9CLCtCQUErQixRQWUxQztBQUVEOztHQUVHO0FBQ0gsSUFBWSw4Q0FxQlg7QUFyQkQsV0FBWSw4Q0FBOEM7SUFDeEQ7O09BRUc7SUFDSCxvRkFBa0MsQ0FBQTtJQUNsQzs7T0FFRztJQUNILG9GQUFrQyxDQUFBO0lBQ2xDOztPQUVHO0lBQ0gseUZBQXVDLENBQUE7SUFDdkM7O09BRUc7SUFDSCwwRUFBd0IsQ0FBQTtJQUN4Qjs7T0FFRztJQUNILDBFQUF3QixDQUFBO0FBQzFCLENBQUMsRUFyQlcsOENBQThDLDhEQUE5Qyw4Q0FBOEMsUUFxQnpEO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLDBDQVNYO0FBVEQsV0FBWSwwQ0FBMEM7SUFDcEQ7O09BRUc7SUFDSCxxRkFBdUMsQ0FBQTtJQUN2Qzs7T0FFRztJQUNILHFGQUF1QyxDQUFBO0FBQ3pDLENBQUMsRUFUVywwQ0FBMEMsMERBQTFDLDBDQUEwQyxRQVNyRDtBQW9HRDs7Ozs7OztHQU9HO0FBQ0gsTUFBYSx5Q0FBMEMsU0FBUSw0QkFBVSxDQUFDLEtBQUs7SUFDN0UsWUFBWSxLQUFpQixFQUFFLEVBQVUsRUFBRSxLQUFxRDtRQUM5RixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUztZQUMvQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyw2QkFBNkIsTUFBTSw4Q0FBOEMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNu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