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.

623 lines 114 kB
"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.13" }; ; /** * 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.13" }; ; /** * 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.13" }; ; /** * 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.13" }; ; /** * 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.13" }; ; /** * 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.13" }; ; /** * 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.13" }; /** * 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.13" }; // ---- /** * 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.13" }; /** * 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.13" }; /** * 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.13" }; /** * 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.13" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZWxhc3RpY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FLcUI7QUFDckIsMkNBQW1EO0FBQ25ELHFDQUFvRTtBQUVwRTs7R0FFRztBQUNILElBQVksbUNBa0JYO0FBbEJELFdBQVksbUNBQW1DO0lBQzdDOztPQUVHO0lBQ0gseUdBQWtFLENBQUE7SUFDbEU7Ozs7OztPQU1HO0lBQ0gsc0ZBQStDLENBQUE7SUFDL0M7OztPQUdHO0lBQ0gseUVBQWtDLENBQUE7QUFDcEMsQ0FBQyxFQWxCVyxtQ0FBbUMsbURBQW5DLG1DQUFtQyxRQWtCOUM7QUErRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsb0RBQXFELFNBQVEsNEJBQVUsQ0FBQyxLQUFLO0lBQ3hGLFlBQVksS0FBaUIsRUFBRSxFQUFVLEVBQUUsS0FBZ0U7UUFDekcsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxNQUFNLG1DQUFtQyxDQUFDLGdDQUFnQyxFQUFFLENBQUM7UUFDbkwsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUksNEJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDdkYsTUFBTSxnQkFBZ0IsR0FBRyxL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