@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.
623 lines • 114 kB
JavaScript
"use strict";
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ElastiCacheReplicationGroupRecommendedAlarmsAspect = exports.ElastiCacheClusterRecommendedAlarmsAspect = exports.CfnReplicationGroup = exports.CfnCacheCluster = exports.ElastiCacheReplicationGroupRecommendedAlarms = exports.ElastiCacheClusterRecommendedAlarms = exports.ElastiCacheReplicationGroupReplicationLagAlarm = exports.ElastiCacheClusterReplicationLagAlarm = exports.ElastiCacheReplicationGroupEngineCpuUtilizationAlarm = exports.ElastiCacheClusterEngineCpuUtilizationAlarm = exports.ElastiCacheReplicationGroupDatabaseMemoryUsagePercentageAlarm = exports.ElastiCacheClusterDatabaseMemoryUsagePercentageAlarm = exports.ElastiCacheRecommendedAlarmsMetrics = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs_1 = require("constructs");
const common_1 = require("./common");
/**
* The recommended metrics for ElastiCache alarms.
*/
var ElastiCacheRecommendedAlarmsMetrics;
(function (ElastiCacheRecommendedAlarmsMetrics) {
/**
* Percentage of the memory for the cluster that is in use.
*/
ElastiCacheRecommendedAlarmsMetrics["DATABASE_MEMORY_USAGE_PERCENTAGE"] = "DatabaseMemoryUsagePercentage";
/**
* Provides CPU utilization of the Valkey or Redis OSS engine thread. Because Valkey and Redis OSS are single-threaded,
* you can use this metric to analyze the load of the process itself. The `EngineCPUUtilization` metric provides a more
* precise visibility of the process. You can use it in conjunction with the `CPUUtilization` metric. `CPUUtilization`
* exposes CPU utilization for the server instance as a whole, including other operating system and management processes.
* For larger node types with four vCPUs or more, use the EngineCPUUtilization metric to monitor and set thresholds for scaling.
*/
ElastiCacheRecommendedAlarmsMetrics["ENGINE_CPU_UTILIZATION"] = "EngineCPUUtilization";
/**
* It represents how far behind, in seconds, the replica is in applying changes from the primary node. For Valkey 7.2 and onwards,
* and Redis OSS engine version 5.0.6 onwards, the lag can be measured in milliseconds.
*/
ElastiCacheRecommendedAlarmsMetrics["REPLICATION_LAG"] = "ReplicationLag";
})(ElastiCacheRecommendedAlarmsMetrics || (exports.ElastiCacheRecommendedAlarmsMetrics = ElastiCacheRecommendedAlarmsMetrics = {}));
/**
* This alarm helps you monitor the memory utilization of your cluster.
*
* When your DatabaseMemoryUsagePercentage reaches 100%, the Redis OSS maxmemory policy is triggered and evictions might occur
* based on the policy selected. If no object in the cache matches the eviction policy, write operations fail. Some workloads
* expect or rely on evictions, but if not, you will need to increase the memory capacity of your cluster. You can scale your
* cluster out by adding more primary nodes, or scale it up by using a larger node type.
* Refer to {@link https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Scaling.html|Scaling ElastiCache for Redis OSS clusters} for details.
*
* The alarm is triggered when the percentage exceeds % threshold.
*/
class ElastiCacheClusterDatabaseMemoryUsagePercentageAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.cacheCluster.clusterName || props.cacheCluster.logicalId} - ${ElastiCacheRecommendedAlarmsMetrics.DATABASE_MEMORY_USAGE_PERCENTAGE}`;
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 high memory utilization of your cluster so that you'
+ ' can avoid failures when writing to your cluster. It is useful to know when you will need to scale up your cluster if your application'
+ ' does not expect to experience evictions.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({
namespace: 'AWS/ElastiCache',
metricName: ElastiCacheRecommendedAlarmsMetrics.DATABASE_MEMORY_USAGE_PERCENTAGE,
dimensionsMap: {
CacheClusterId: props.cacheCluster.clusterName || props.cacheCluster.logicalId,
},
period,
statistic: 'Average',
}),
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.ElastiCacheClusterDatabaseMemoryUsagePercentageAlarm = ElastiCacheClusterDatabaseMemoryUsagePercentageAlarm;
_a = JSII_RTTI_SYMBOL_1;
ElastiCacheClusterDatabaseMemoryUsagePercentageAlarm[_a] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ElastiCacheClusterDatabaseMemoryUsagePercentageAlarm", version: "0.0.17" };
;
/**
* This alarm helps you monitor the memory utilization of your cluster.
*
* When your DatabaseMemoryUsagePercentage reaches 100%, the Redis OSS maxmemory policy is triggered and evictions might occur
* based on the policy selected. If no object in the cache matches the eviction policy, write operations fail. Some workloads
* expect or rely on evictions, but if not, you will need to increase the memory capacity of your cluster. You can scale your
* cluster out by adding more primary nodes, or scale it up by using a larger node type.
* Refer to {@link https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Scaling.html|Scaling ElastiCache for Redis OSS clusters} for details.
*
* The alarm is triggered when the percentage exceeds % threshold.
*/
class ElastiCacheReplicationGroupDatabaseMemoryUsagePercentageAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.cacheReplicationGroup.replicationGroupId || props.cacheReplicationGroup.logicalId} - ${ElastiCacheRecommendedAlarmsMetrics.DATABASE_MEMORY_USAGE_PERCENTAGE}`;
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 high memory utilization of your cluster so that you'
+ ' can avoid failures when writing to your cluster. It is useful to know when you will need to scale up your cluster if your application'
+ ' does not expect to experience evictions.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({
namespace: 'AWS/ElastiCache',
metricName: ElastiCacheRecommendedAlarmsMetrics.DATABASE_MEMORY_USAGE_PERCENTAGE,
dimensionsMap: {
CacheClusterId: props.cacheReplicationGroup.replicationGroupId || props.cacheReplicationGroup.logicalId,
},
period,
statistic: 'Average',
}),
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.ElastiCacheReplicationGroupDatabaseMemoryUsagePercentageAlarm = ElastiCacheReplicationGroupDatabaseMemoryUsagePercentageAlarm;
_b = JSII_RTTI_SYMBOL_1;
ElastiCacheReplicationGroupDatabaseMemoryUsagePercentageAlarm[_b] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ElastiCacheReplicationGroupDatabaseMemoryUsagePercentageAlarm", version: "0.0.17" };
;
/**
* This alarm helps to monitor the CPU utilization of a Redis OSS engine thread within the ElastiCache instance.
*
* Common reasons for high engine CPU are long-running commands that consume high CPU, a high number of requests, an increase of new
* client connection requests in a short time period, and high evictions when the cache doesn't have enough memory to hold new data.
* You should consider {@link https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Scaling.html|Scaling ElastiCache for Redis OSS clusters}
* by adding more nodes or scaling up your instance type.
*
* The alarm is triggered when the percentage exceeds the threshold.
*/
class ElastiCacheClusterEngineCpuUtilizationAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.cacheCluster.clusterName || props.cacheCluster.logicalId} - ${ElastiCacheRecommendedAlarmsMetrics.ENGINE_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 of the Redis OSS engine thread.'
+ ' It is useful if you want to monitor the CPU usage of the database engine itself.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({
namespace: 'AWS/ElastiCache',
metricName: ElastiCacheRecommendedAlarmsMetrics.ENGINE_CPU_UTILIZATION,
dimensionsMap: {
CacheClusterId: props.cacheCluster.clusterName || props.cacheCluster.logicalId,
},
period,
statistic: 'Average',
}),
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.ElastiCacheClusterEngineCpuUtilizationAlarm = ElastiCacheClusterEngineCpuUtilizationAlarm;
_c = JSII_RTTI_SYMBOL_1;
ElastiCacheClusterEngineCpuUtilizationAlarm[_c] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ElastiCacheClusterEngineCpuUtilizationAlarm", version: "0.0.17" };
;
/**
* This alarm helps to monitor the CPU utilization of a Redis OSS engine thread within the ElastiCache instance.
*
* Common reasons for high engine CPU are long-running commands that consume high CPU, a high number of requests, an increase of new
* client connection requests in a short time period, and high evictions when the cache doesn't have enough memory to hold new data.
* You should consider {@link https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Scaling.html|Scaling ElastiCache for Redis OSS clusters}
* by adding more nodes or scaling up your instance type.
*
* The alarm is triggered when the percentage exceeds the threshold.
*/
class ElastiCacheReplicationGroupEngineCpuUtilizationAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.cacheReplicationGroup.replicationGroupId || props.cacheReplicationGroup.logicalId} - ${ElastiCacheRecommendedAlarmsMetrics.ENGINE_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 of the Redis OSS engine thread.'
+ ' It is useful if you want to monitor the CPU usage of the database engine itself.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({
namespace: 'AWS/ElastiCache',
metricName: ElastiCacheRecommendedAlarmsMetrics.ENGINE_CPU_UTILIZATION,
dimensionsMap: {
CacheClusterId: props.cacheReplicationGroup.replicationGroupId || props.cacheReplicationGroup.logicalId,
},
period,
statistic: 'Average',
}),
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.ElastiCacheReplicationGroupEngineCpuUtilizationAlarm = ElastiCacheReplicationGroupEngineCpuUtilizationAlarm;
_d = JSII_RTTI_SYMBOL_1;
ElastiCacheReplicationGroupEngineCpuUtilizationAlarm[_d] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ElastiCacheReplicationGroupEngineCpuUtilizationAlarm", version: "0.0.17" };
;
/**
* This alarm helps to monitor the replication health of your ElastiCache cluster.
*
* A high replication lag means that the primary node or the replica can't keep up the pace of the replication. If your write
* activity is too high, consider scaling your cluster out by adding more primary nodes, or scaling it up by using a larger node type.
* Refer to {@link https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Scaling.html|Scaling ElastiCache for Redis OSS clusters} for
* details. If your read replicas are overloaded by the amount of read requests,
* consider adding more read replicas.
*
* The alarm is triggered when the number of milliseconds exceeds the threshold.
*/
class ElastiCacheClusterReplicationLagAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.cacheCluster.clusterName || props.cacheCluster.logicalId} - ${ElastiCacheRecommendedAlarmsMetrics.REPLICATION_LAG}`;
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 delay between data updates on the primary node'
+ ' and their synchronization to replica node. It helps to ensure data consistency of a read replica cluster node.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({
namespace: 'AWS/ElastiCache',
metricName: ElastiCacheRecommendedAlarmsMetrics.REPLICATION_LAG,
dimensionsMap: {
CacheClusterId: props.cacheCluster.clusterName || props.cacheCluster.logicalId,
},
period,
statistic: 'Average',
}),
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.ElastiCacheClusterReplicationLagAlarm = ElastiCacheClusterReplicationLagAlarm;
_e = JSII_RTTI_SYMBOL_1;
ElastiCacheClusterReplicationLagAlarm[_e] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ElastiCacheClusterReplicationLagAlarm", version: "0.0.17" };
;
/**
* This alarm helps to monitor the replication health of your ElastiCache cluster.
*
* A high replication lag means that the primary node or the replica can't keep up the pace of the replication. If your write
* activity is too high, consider scaling your cluster out by adding more primary nodes, or scaling it up by using a larger node type.
* Refer to {@link https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Scaling.html|Scaling ElastiCache for Redis OSS clusters} for
* details. If your read replicas are overloaded by the amount of read requests,
* consider adding more read replicas.
*
* The alarm is triggered when the number of milliseconds exceeds the threshold.
*/
class ElastiCacheReplicationGroupReplicationLagAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.cacheReplicationGroup.replicationGroupId || props.cacheReplicationGroup.logicalId} - ${ElastiCacheRecommendedAlarmsMetrics.REPLICATION_LAG}`;
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 delay between data updates on the primary node'
+ ' and their synchronization to replica node. It helps to ensure data consistency of a read replica cluster node.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({
namespace: 'AWS/ElastiCache',
metricName: ElastiCacheRecommendedAlarmsMetrics.REPLICATION_LAG,
dimensionsMap: {
CacheClusterId: props.cacheReplicationGroup.replicationGroupId || props.cacheReplicationGroup.logicalId,
},
period,
statistic: 'Average',
}),
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.ElastiCacheReplicationGroupReplicationLagAlarm = ElastiCacheReplicationGroupReplicationLagAlarm;
_f = JSII_RTTI_SYMBOL_1;
ElastiCacheReplicationGroupReplicationLagAlarm[_f] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ElastiCacheReplicationGroupReplicationLagAlarm", version: "0.0.17" };
;
/**
* A construct that creates the recommended alarms for an ElastiCache CfnCacheCluster.
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#ElastiCache
*/
class ElastiCacheClusterRecommendedAlarms extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
if (!props.excludeAlarms?.includes(ElastiCacheRecommendedAlarmsMetrics.DATABASE_MEMORY_USAGE_PERCENTAGE)) {
this.alarmDatabaseMemoryUsagePercentage = new ElastiCacheClusterDatabaseMemoryUsagePercentageAlarm(this, `${props.cacheCluster.node.id}_DatabaseMemoryUsagePercentage`, {
cacheCluster: props.cacheCluster,
treatMissingData: props.treatMissingData,
...props.configDatabaseMemoryUsagePercentageAlarm,
});
if (props.defaultAlarmAction && !props.configDatabaseMemoryUsagePercentageAlarm.alarmAction) {
this.alarmDatabaseMemoryUsagePercentage.addAlarmAction(props.defaultAlarmAction);
}
if (props.defaultOkAction && !props.configDatabaseMemoryUsagePercentageAlarm.okAction) {
this.alarmDatabaseMemoryUsagePercentage.addOkAction(props.defaultOkAction);
}
if (props.defaultInsufficientDataAction && !props.configDatabaseMemoryUsagePercentageAlarm.insufficientDataAction) {
this.alarmDatabaseMemoryUsagePercentage.addInsufficientDataAction(props.defaultInsufficientDataAction);
}
}
if (!props.excludeAlarms?.includes(ElastiCacheRecommendedAlarmsMetrics.ENGINE_CPU_UTILIZATION)) {
this.alarmEngineCpuUtilization = new ElastiCacheClusterEngineCpuUtilizationAlarm(this, `${props.cacheCluster.node.id}_EngineCPUUtilization`, {
cacheCluster: props.cacheCluster,
treatMissingData: props.treatMissingData,
...props.configEngineCpuUtilizationAlarm,
});
if (props.defaultAlarmAction && (!props.configEngineCpuUtilizationAlarm || !props.configEngineCpuUtilizationAlarm.alarmAction)) {
this.alarmEngineCpuUtilization.addAlarmAction(props.defaultAlarmAction);
}
if (props.defaultOkAction && (!props.configEngineCpuUtilizationAlarm || !props.configEngineCpuUtilizationAlarm.okAction)) {
this.alarmEngineCpuUtilization.addOkAction(props.defaultOkAction);
}
if (props.defaultInsufficientDataAction &&
(!props.configEngineCpuUtilizationAlarm || !props.configEngineCpuUtilizationAlarm.insufficientDataAction)) {
this.alarmEngineCpuUtilization.addInsufficientDataAction(props.defaultInsufficientDataAction);
}
}
if (!props.excludeAlarms?.includes(ElastiCacheRecommendedAlarmsMetrics.REPLICATION_LAG)) {
this.alarmReplicationLag = new ElastiCacheClusterReplicationLagAlarm(this, `${props.cacheCluster.node.id}_ReplicationLag`, {
cacheCluster: props.cacheCluster,
treatMissingData: props.treatMissingData,
...props.configReplicationLagAlarm,
});
if (props.defaultAlarmAction && !props.configReplicationLagAlarm.alarmAction) {
this.alarmReplicationLag.addAlarmAction(props.defaultAlarmAction);
}
if (props.defaultOkAction && !props.configReplicationLagAlarm.okAction) {
this.alarmReplicationLag.addOkAction(props.defaultOkAction);
}
if (props.defaultInsufficientDataAction && !props.configReplicationLagAlarm.insufficientDataAction) {
this.alarmReplicationLag.addInsufficientDataAction(props.defaultInsufficientDataAction);
}
}
}
}
exports.ElastiCacheClusterRecommendedAlarms = ElastiCacheClusterRecommendedAlarms;
_g = JSII_RTTI_SYMBOL_1;
ElastiCacheClusterRecommendedAlarms[_g] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ElastiCacheClusterRecommendedAlarms", version: "0.0.17" };
/**
* A construct that creates the recommended alarms for an ElastiCache CfnReplicationGroup.
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#ElastiCache
*/
class ElastiCacheReplicationGroupRecommendedAlarms extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
if (!props.excludeAlarms?.includes(ElastiCacheRecommendedAlarmsMetrics.DATABASE_MEMORY_USAGE_PERCENTAGE)) {
this.alarmDatabaseMemoryUsagePercentage = new ElastiCacheReplicationGroupDatabaseMemoryUsagePercentageAlarm(this, `${props.cacheReplicationGroup.node.id}_DatabaseMemoryUsagePercentage`, {
cacheReplicationGroup: props.cacheReplicationGroup,
treatMissingData: props.treatMissingData,
...props.configDatabaseMemoryUsagePercentageAlarm,
});
if (props.defaultAlarmAction && !props.configDatabaseMemoryUsagePercentageAlarm.alarmAction) {
this.alarmDatabaseMemoryUsagePercentage.addAlarmAction(props.defaultAlarmAction);
}
if (props.defaultOkAction && !props.configDatabaseMemoryUsagePercentageAlarm.okAction) {
this.alarmDatabaseMemoryUsagePercentage.addOkAction(props.defaultOkAction);
}
if (props.defaultInsufficientDataAction && !props.configDatabaseMemoryUsagePercentageAlarm.insufficientDataAction) {
this.alarmDatabaseMemoryUsagePercentage.addInsufficientDataAction(props.defaultInsufficientDataAction);
}
}
if (!props.excludeAlarms?.includes(ElastiCacheRecommendedAlarmsMetrics.ENGINE_CPU_UTILIZATION)) {
this.alarmEngineCpuUtilization = new ElastiCacheReplicationGroupEngineCpuUtilizationAlarm(this, `${props.cacheReplicationGroup.node.id}_EngineCPUUtilization`, {
cacheReplicationGroup: props.cacheReplicationGroup,
treatMissingData: props.treatMissingData,
...props.configEngineCpuUtilizationAlarm,
});
if (props.defaultAlarmAction && (!props.configEngineCpuUtilizationAlarm || !props.configEngineCpuUtilizationAlarm.alarmAction)) {
this.alarmEngineCpuUtilization.addAlarmAction(props.defaultAlarmAction);
}
if (props.defaultOkAction && (!props.configEngineCpuUtilizationAlarm || !props.configEngineCpuUtilizationAlarm.okAction)) {
this.alarmEngineCpuUtilization.addOkAction(props.defaultOkAction);
}
if (props.defaultInsufficientDataAction &&
(!props.configEngineCpuUtilizationAlarm || !props.configEngineCpuUtilizationAlarm.insufficientDataAction)) {
this.alarmEngineCpuUtilization.addInsufficientDataAction(props.defaultInsufficientDataAction);
}
}
if (!props.excludeAlarms?.includes(ElastiCacheRecommendedAlarmsMetrics.REPLICATION_LAG)) {
this.alarmReplicationLag = new ElastiCacheReplicationGroupReplicationLagAlarm(this, `${props.cacheReplicationGroup.node.id}_ReplicationLag`, {
cacheReplicationGroup: props.cacheReplicationGroup,
treatMissingData: props.treatMissingData,
...props.configReplicationLagAlarm,
});
if (props.defaultAlarmAction && !props.configReplicationLagAlarm.alarmAction) {
this.alarmReplicationLag.addAlarmAction(props.defaultAlarmAction);
}
if (props.defaultOkAction && !props.configReplicationLagAlarm.okAction) {
this.alarmReplicationLag.addOkAction(props.defaultOkAction);
}
if (props.defaultInsufficientDataAction && !props.configReplicationLagAlarm.insufficientDataAction) {
this.alarmReplicationLag.addInsufficientDataAction(props.defaultInsufficientDataAction);
}
}
}
}
exports.ElastiCacheReplicationGroupRecommendedAlarms = ElastiCacheReplicationGroupRecommendedAlarms;
_h = JSII_RTTI_SYMBOL_1;
ElastiCacheReplicationGroupRecommendedAlarms[_h] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ElastiCacheReplicationGroupRecommendedAlarms", version: "0.0.17" };
// ----
/**
* An extension for the CfnCacheCluster construct that provides methods
* to create recommended alarms.
*/
class CfnCacheCluster extends aws_cdk_lib_1.aws_elasticache.CfnCacheCluster {
constructor(scope, id, props) {
super(scope, id, props);
}
/**
* Creates an alarm that monitors the DatabaseMemoryUsagePercentage for the ElastiCache cacheCluster.
*/
alarmDatabaseMemoryUsagePercentage(props) {
return new ElastiCacheClusterDatabaseMemoryUsagePercentageAlarm(this, 'DatabaseMemoryUsagePercentageAlarm', {
cacheCluster: this,
...props,
});
}
/**
* Creates an alarm that monitors the EngineCpuUtilization for the ElastiCache cacheCluster.
*/
alarmEngineCpuUtilization(props) {
return new ElastiCacheClusterEngineCpuUtilizationAlarm(this, 'EngineCpuUtilizationAlarm', {
cacheCluster: this,
...props,
});
}
/**
* Creates an alarm that monitors the ReplicationLag for the ElastiCache cacheCluster.
*/
alarmReplicationLag(props) {
return new ElastiCacheClusterReplicationLagAlarm(this, 'ReplicationLagAlarm', {
cacheCluster: this,
...props,
});
}
/**
* Creates the recommended alarms for the ElastiCache CfnCacheCluster.
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#ElastiCache
*/
applyRecommendedAlarms(props) {
return new ElastiCacheClusterRecommendedAlarms(this, 'ElastiCacheClusterRecommendedAlarms', {
cacheCluster: this,
...props,
});
}
}
exports.CfnCacheCluster = CfnCacheCluster;
_j = JSII_RTTI_SYMBOL_1;
CfnCacheCluster[_j] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.CfnCacheCluster", version: "0.0.17" };
/**
* An extension for the CfnReplicationGroup construct that provides methods
* to create recommended alarms.
*/
class CfnReplicationGroup extends aws_cdk_lib_1.aws_elasticache.CfnReplicationGroup {
constructor(scope, id, props) {
super(scope, id, props);
}
/**
* Creates an alarm that monitors the DatabaseMemoryUsagePercentage for the ElastiCache cacheReplicationGroup.
*/
alarmDatabaseMemoryUsagePercentage(props) {
return new ElastiCacheReplicationGroupDatabaseMemoryUsagePercentageAlarm(this, 'DatabaseMemoryUsagePercentageAlarm', {
cacheReplicationGroup: this,
...props,
});
}
/**
* Creates an alarm that monitors the EngineCpuUtilization for the ElastiCache cacheReplicationGroup.
*/
alarmEngineCpuUtilization(props) {
return new ElastiCacheReplicationGroupEngineCpuUtilizationAlarm(this, 'EngineCpuUtilizationAlarm', {
cacheReplicationGroup: this,
...props,
});
}
/**
* Creates an alarm that monitors the ReplicationLag for the ElastiCache cacheReplicationGroup.
*/
alarmReplicationLag(props) {
return new ElastiCacheReplicationGroupReplicationLagAlarm(this, 'ReplicationLagAlarm', {
cacheReplicationGroup: this,
...props,
});
}
/**
* Creates the recommended alarms for the ElastiCache CfnReplicationGroup.
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#ElastiCache
*/
applyRecommendedAlarms(props) {
return new ElastiCacheReplicationGroupRecommendedAlarms(this, 'ElastiCacheReplicationGroupRecommendedAlarms', {
cacheReplicationGroup: this,
...props,
});
}
}
exports.CfnReplicationGroup = CfnReplicationGroup;
_k = JSII_RTTI_SYMBOL_1;
CfnReplicationGroup[_k] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.CfnReplicationGroup", version: "0.0.17" };
/**
* Configures the recommended alarms for an ElastiCache CfnCacheCluster
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#ElastiCache
*/
class ElastiCacheClusterRecommendedAlarmsAspect {
constructor(props) {
this.props = props;
}
visit(node) {
if (node instanceof aws_cdk_lib_1.aws_elasticache.CfnCacheCluster) {
if (this.props.excludeResources && this.props.excludeResources.includes(node.node.id)) {
return;
}
else {
const cacheCluster = node;
new ElastiCacheClusterRecommendedAlarms(cacheCluster, 'ElastiCacheClusterRecommendedAlarmsFromAspect', {
cacheCluster,
...this.props,
});
}
}
}
}
exports.ElastiCacheClusterRecommendedAlarmsAspect = ElastiCacheClusterRecommendedAlarmsAspect;
_l = JSII_RTTI_SYMBOL_1;
ElastiCacheClusterRecommendedAlarmsAspect[_l] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ElastiCacheClusterRecommendedAlarmsAspect", version: "0.0.17" };
/**
* Configures the recommended alarms for an ElastiCache CfnReplicationGroup
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#ElastiCache
*/
class ElastiCacheReplicationGroupRecommendedAlarmsAspect {
constructor(props) {
this.props = props;
}
visit(node) {
if (node instanceof aws_cdk_lib_1.aws_elasticache.CfnReplicationGroup) {
if (this.props.excludeResources && this.props.excludeResources.includes(node.node.id)) {
return;
}
else {
const cacheReplicationGroup = node;
new ElastiCacheReplicationGroupRecommendedAlarms(cacheReplicationGroup, 'ElastiCacheReplicationGroupRecommendedAlarmsFromAspect', {
cacheReplicationGroup,
...this.props,
});
}
}
}
}
exports.ElastiCacheReplicationGroupRecommendedAlarmsAspect = ElastiCacheReplicationGroupRecommendedAlarmsAspect;
_m = JSII_RTTI_SYMBOL_1;
ElastiCacheReplicationGroupRecommendedAlarmsAspect[_m] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.ElastiCacheReplicationGroupRecommendedAlarmsAspect", version: "0.0.17" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZWxhc3RpY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FLcUI7QUFDckIsMkNBQW1EO0FBQ25ELHFDQUFvRTtBQUVwRTs7R0FFRztBQUNILElBQVksbUNBa0JYO0FBbEJELFdBQVksbUNBQW1DO0lBQzdDOztPQUVHO0lBQ0gseUdBQWtFLENBQUE7SUFDbEU7Ozs7OztPQU1HO0lBQ0gsc0ZBQStDLENBQUE7SUFDL0M7OztPQUdHO0lBQ0gseUVBQWtDLENBQUE7QUFDcEMsQ0FBQyxFQWxCVyxtQ0FBbUMsbURBQW5DLG1DQUFtQyxRQWtCOUM7QUErRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsb0RBQXFELFNBQVEsNEJBQVUsQ0FBQyxLQUFLO0lBQ3hGLFlBQVksS0FBaUIsRUFBRSxFQUFVLEVBQUUsS0FBZ0U7UUFDekcsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxNQUFNLG1DQUFtQyxDQUFDLGdDQUFnQyxFQUFFLENBQUM7UUFDbkwsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUksNEJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDdkYsTUFBTSxnQkFBZ0IsR0FBRyxL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