Repository: cdklabs/cdk-monitoring-constructs (language: python)

Issue:
[rds] Add ability to alarm on DB connections
### Feature scope

RDS

### Describe your suggested feature

Add ability to configure alarm on Cluster connections similar to `addCpuUsageAlarm`


Discussion / hints:
Related: #231
Happy to make a PR here but will likely need a bit of guidance
In general you can follow the same pattern as existing alarms.

1. Add a new prop: https://github.com/cdklabs/cdk-monitoring-constructs/blob/e1fbff5ba0b075d85640a3a04c9d89c41ede5fc2/lib/monitoring/aws-rds/RdsClusterMonitoring.ts#L32
2. Create an alarm based on the props using the relevant metric (which happens to already exist in this case): https://github.com/cdklabs/cdk-monitoring-constructs/blob/e1fbff5ba0b075d85640a3a04c9d89c41ede5fc2/lib/monitoring/aws-rds/RdsClusterMonitoring.ts#L88
3. Add some unit tests: https://github.com/cdklabs/cdk-monitoring-constructs/blob/e1fbff5ba0b075d85640a3a04c9d89c41ede5fc2/test/monitoring/aws-rds/RdsClusterMonitoring.test.ts
4. Document any new functionality in the table in the README

Fix patch:
diff --git a/API.md b/API.md
index 7f3081de..c2840f08 100644
--- a/API.md
+++ b/API.md
@@ -17453,6 +17453,286 @@ public readonly minHealthyTaskPercent: number;
 
 ---
 
+### HighConnectionCountThreshold <a name="HighConnectionCountThreshold" id="cdk-monitoring-constructs.HighConnectionCountThreshold"></a>
+
+#### Initializer <a name="Initializer" id="cdk-monitoring-constructs.HighConnectionCountThreshold.Initializer"></a>
+
+```typescript
+import { HighConnectionCountThreshold } from 'cdk-monitoring-constructs'
+
+const highConnectionCountThreshold: HighConnectionCountThreshold = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.actionOverride">actionOverride</a></code> | <code><a href="#cdk-monitoring-constructs.IAlarmActionStrategy">IAlarmActionStrategy</a></code> | Allows to override the default alarm action. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.actionsEnabled">actionsEnabled</a></code> | <code>boolean</code> | Enables the configured CloudWatch alarm ticketing actions. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.alarmDescriptionOverride">alarmDescriptionOverride</a></code> | <code>string</code> | A text included in the generated ticket description body, which fully replaces the generated text. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.alarmNameOverride">alarmNameOverride</a></code> | <code>string</code> | If this is defined, the alarm name is set to this exact value. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.comparisonOperatorOverride">comparisonOperatorOverride</a></code> | <code>aws-cdk-lib.aws_cloudwatch.ComparisonOperator</code> | Comparison operator used to compare actual value against the threshold. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.customParams">customParams</a></code> | <code>{[ key: string ]: any}</code> | This allows user to attach custom parameters to this alarm, which can later be accessed from the "useCreatedAlarms" method. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.customTags">customTags</a></code> | <code>string[]</code> | This allows user to attach custom values to this alarm, which can later be accessed from the "useCreatedAlarms" method. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.datapointsToAlarm">datapointsToAlarm</a></code> | <code>number</code> | Number of breaches required to transition into an ALARM state. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.dedupeStringOverride">dedupeStringOverride</a></code> | <code>string</code> | If this is defined, the alarm dedupe string is set to this exact value. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.documentationLink">documentationLink</a></code> | <code>string</code> | An optional link included in the generated ticket description body. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.evaluateLowSampleCountPercentile">evaluateLowSampleCountPercentile</a></code> | <code>boolean</code> | Used only for alarms based on percentiles. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.evaluationPeriods">evaluationPeriods</a></code> | <code>number</code> | Number of periods to consider when checking the number of breaching datapoints. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.fillAlarmRange">fillAlarmRange</a></code> | <code>boolean</code> | Indicates whether the alarming range of values should be highlighted in the widget. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.minMetricSamplesToAlarm">minMetricSamplesToAlarm</a></code> | <code>number</code> | Specifies how many samples (N) of the metric is needed to trigger the alarm. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.period">period</a></code> | <code>aws-cdk-lib.Duration</code> | Period override for the metric to alarm on. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.runbookLink">runbookLink</a></code> | <code>string</code> | An optional link included in the generated ticket description body. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.treatMissingDataOverride">treatMissingDataOverride</a></code> | <code>aws-cdk-lib.aws_cloudwatch.TreatMissingData</code> | Behaviour in case the metric data is missing. |
+| <code><a href="#cdk-monitoring-constructs.HighConnectionCountThreshold.property.maxConnectionCount">maxConnectionCount</a></code> | <code>number</code> | *No description.* |
+
+---
+
+##### `actionOverride`<sup>Optional</sup> <a name="actionOverride" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.actionOverride"></a>
+
+```typescript
+public readonly actionOverride: IAlarmActionStrategy;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.IAlarmActionStrategy">IAlarmActionStrategy</a>
+- *Default:* undefined (default action will be used, if any)
+
+Allows to override the default alarm action.
+
+---
+
+##### `actionsEnabled`<sup>Optional</sup> <a name="actionsEnabled" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.actionsEnabled"></a>
+
+```typescript
+public readonly actionsEnabled: boolean;
+```
+
+- *Type:* boolean
+- *Default:* the same as monitoring facade default
+
+Enables the configured CloudWatch alarm ticketing actions.
+
+---
+
+##### `alarmDescriptionOverride`<sup>Optional</sup> <a name="alarmDescriptionOverride" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.alarmDescriptionOverride"></a>
+
+```typescript
+public readonly alarmDescriptionOverride: string;
+```
+
+- *Type:* string
+- *Default:* default auto-generated content only
+
+A text included in the generated ticket description body, which fully replaces the generated text.
+
+---
+
+##### `alarmNameOverride`<sup>Optional</sup> <a name="alarmNameOverride" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.alarmNameOverride"></a>
+
+```typescript
+public readonly alarmNameOverride: string;
+```
+
+- *Type:* string
+
+If this is defined, the alarm name is set to this exact value.
+
+Please be aware that you need to specify prefix for different stages (Beta, Prod...) and realms (EU, NA...) manually.
+
+---
+
+##### `comparisonOperatorOverride`<sup>Optional</sup> <a name="comparisonOperatorOverride" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.comparisonOperatorOverride"></a>
+
+```typescript
+public readonly comparisonOperatorOverride: ComparisonOperator;
+```
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.ComparisonOperator
+- *Default:* alarm-specific default
+
+Comparison operator used to compare actual value against the threshold.
+
+---
+
+##### `customParams`<sup>Optional</sup> <a name="customParams" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.customParams"></a>
+
+```typescript
+public readonly customParams: {[ key: string ]: any};
+```
+
+- *Type:* {[ key: string ]: any}
+- *Default:* no parameters
+
+This allows user to attach custom parameters to this alarm, which can later be accessed from the "useCreatedAlarms" method.
+
+---
+
+##### `customTags`<sup>Optional</sup> <a name="customTags" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.customTags"></a>
+
+```typescript
+public readonly customTags: string[];
+```
+
+- *Type:* string[]
+- *Default:* no tags
+
+This allows user to attach custom values to this alarm, which can later be accessed from the "useCreatedAlarms" method.
+
+---
+
+##### `datapointsToAlarm`<sup>Optional</sup> <a name="datapointsToAlarm" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.datapointsToAlarm"></a>
+
+```typescript
+public readonly datapointsToAlarm: number;
+```
+
+- *Type:* number
+- *Default:* the same as monitoring facade default
+
+Number of breaches required to transition into an ALARM state.
+
+---
+
+##### `dedupeStringOverride`<sup>Optional</sup> <a name="dedupeStringOverride" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.dedupeStringOverride"></a>
+
+```typescript
+public readonly dedupeStringOverride: string;
+```
+
+- *Type:* string
+- *Default:* undefined (no override)
+
+If this is defined, the alarm dedupe string is set to this exact value.
+
+Please be aware that you need to handle deduping for different stages (Beta, Prod...) and realms (EU, NA...) manually.
+Dedupe strings are global and not unique per CTI.
+
+---
+
+##### `documentationLink`<sup>Optional</sup> <a name="documentationLink" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.documentationLink"></a>
+
+```typescript
+public readonly documentationLink: string;
+```
+
+- *Type:* string
+- *Default:* no additional link will be added
+
+An optional link included in the generated ticket description body.
+
+---
+
+##### `evaluateLowSampleCountPercentile`<sup>Optional</sup> <a name="evaluateLowSampleCountPercentile" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.evaluateLowSampleCountPercentile"></a>
+
+```typescript
+public readonly evaluateLowSampleCountPercentile: boolean;
+```
+
+- *Type:* boolean
+- *Default:* true
+
+Used only for alarms based on percentiles.
+
+If you specify <code>false</code>, the alarm state does not change during periods with too few data points to be statistically significant.
+If you specify <code>true</code>, the alarm is always evaluated and possibly changes state no matter how many data points are available.
+
+---
+
+##### `evaluationPeriods`<sup>Optional</sup> <a name="evaluationPeriods" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.evaluationPeriods"></a>
+
+```typescript
+public readonly evaluationPeriods: number;
+```
+
+- *Type:* number
+- *Default:* the same as monitoring facade default
+
+Number of periods to consider when checking the number of breaching datapoints.
+
+---
+
+##### `fillAlarmRange`<sup>Optional</sup> <a name="fillAlarmRange" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.fillAlarmRange"></a>
+
+```typescript
+public readonly fillAlarmRange: boolean;
+```
+
+- *Type:* boolean
+- *Default:* false
+
+Indicates whether the alarming range of values should be highlighted in the widget.
+
+---
+
+##### `minMetricSamplesToAlarm`<sup>Optional</sup> <a name="minMetricSamplesToAlarm" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.minMetricSamplesToAlarm"></a>
+
+```typescript
+public readonly minMetricSamplesToAlarm: number;
+```
+
+- *Type:* number
+- *Default:* default behaviour - no condition on sample count will be added to the alarm
+
+Specifies how many samples (N) of the metric is needed to trigger the alarm.
+
+If this property is specified, a composite alarm is created of the following:
+<ul>
+<li>The original alarm, created without this property being used; this alarm will have no actions set.</li>
+<li>A secondary alarm, which will monitor the same metric with the N (SampleCount) statistic, checking the sample count.</li>
+</ul>
+This composite alarm will be returned as a result and uses the specified alarm actions.
+
+---
+
+##### `period`<sup>Optional</sup> <a name="period" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.period"></a>
+
+```typescript
+public readonly period: Duration;
+```
+
+- *Type:* aws-cdk-lib.Duration
+- *Default:* the default specified in MetricFactory
+
+Period override for the metric to alarm on.
+
+---
+
+##### `runbookLink`<sup>Optional</sup> <a name="runbookLink" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.runbookLink"></a>
+
+```typescript
+public readonly runbookLink: string;
+```
+
+- *Type:* string
+- *Default:* no additional link will be added
+
+An optional link included in the generated ticket description body.
+
+---
+
+##### `treatMissingDataOverride`<sup>Optional</sup> <a name="treatMissingDataOverride" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.treatMissingDataOverride"></a>
+
+```typescript
+public readonly treatMissingDataOverride: TreatMissingData;
+```
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.TreatMissingData
+- *Default:* alarm-specific default
+
+Behaviour in case the metric data is missing.
+
+---
+
+##### `maxConnectionCount`<sup>Required</sup> <a name="maxConnectionCount" id="cdk-monitoring-constructs.HighConnectionCountThreshold.property.maxConnectionCount"></a>
+
+```typescript
+public readonly maxConnectionCount: number;
+```
+
+- *Type:* number
+
+---
+
 ### HighMessagesPublishedThreshold <a name="HighMessagesPublishedThreshold" id="cdk-monitoring-constructs.HighMessagesPublishedThreshold"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.HighMessagesPublishedThreshold.Initializer"></a>
@@ -20581,6 +20861,286 @@ widget title.
 
 ---
 
+### LowConnectionCountThreshold <a name="LowConnectionCountThreshold" id="cdk-monitoring-constructs.LowConnectionCountThreshold"></a>
+
+#### Initializer <a name="Initializer" id="cdk-monitoring-constructs.LowConnectionCountThreshold.Initializer"></a>
+
+```typescript
+import { LowConnectionCountThreshold } from 'cdk-monitoring-constructs'
+
+const lowConnectionCountThreshold: LowConnectionCountThreshold = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.actionOverride">actionOverride</a></code> | <code><a href="#cdk-monitoring-constructs.IAlarmActionStrategy">IAlarmActionStrategy</a></code> | Allows to override the default alarm action. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.actionsEnabled">actionsEnabled</a></code> | <code>boolean</code> | Enables the configured CloudWatch alarm ticketing actions. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.alarmDescriptionOverride">alarmDescriptionOverride</a></code> | <code>string</code> | A text included in the generated ticket description body, which fully replaces the generated text. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.alarmNameOverride">alarmNameOverride</a></code> | <code>string</code> | If this is defined, the alarm name is set to this exact value. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.comparisonOperatorOverride">comparisonOperatorOverride</a></code> | <code>aws-cdk-lib.aws_cloudwatch.ComparisonOperator</code> | Comparison operator used to compare actual value against the threshold. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.customParams">customParams</a></code> | <code>{[ key: string ]: any}</code> | This allows user to attach custom parameters to this alarm, which can later be accessed from the "useCreatedAlarms" method. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.customTags">customTags</a></code> | <code>string[]</code> | This allows user to attach custom values to this alarm, which can later be accessed from the "useCreatedAlarms" method. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.datapointsToAlarm">datapointsToAlarm</a></code> | <code>number</code> | Number of breaches required to transition into an ALARM state. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.dedupeStringOverride">dedupeStringOverride</a></code> | <code>string</code> | If this is defined, the alarm dedupe string is set to this exact value. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.documentationLink">documentationLink</a></code> | <code>string</code> | An optional link included in the generated ticket description body. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.evaluateLowSampleCountPercentile">evaluateLowSampleCountPercentile</a></code> | <code>boolean</code> | Used only for alarms based on percentiles. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.evaluationPeriods">evaluationPeriods</a></code> | <code>number</code> | Number of periods to consider when checking the number of breaching datapoints. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.fillAlarmRange">fillAlarmRange</a></code> | <code>boolean</code> | Indicates whether the alarming range of values should be highlighted in the widget. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.minMetricSamplesToAlarm">minMetricSamplesToAlarm</a></code> | <code>number</code> | Specifies how many samples (N) of the metric is needed to trigger the alarm. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.period">period</a></code> | <code>aws-cdk-lib.Duration</code> | Period override for the metric to alarm on. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.runbookLink">runbookLink</a></code> | <code>string</code> | An optional link included in the generated ticket description body. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.treatMissingDataOverride">treatMissingDataOverride</a></code> | <code>aws-cdk-lib.aws_cloudwatch.TreatMissingData</code> | Behaviour in case the metric data is missing. |
+| <code><a href="#cdk-monitoring-constructs.LowConnectionCountThreshold.property.minConnectionCount">minConnectionCount</a></code> | <code>number</code> | *No description.* |
+
+---
+
+##### `actionOverride`<sup>Optional</sup> <a name="actionOverride" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.actionOverride"></a>
+
+```typescript
+public readonly actionOverride: IAlarmActionStrategy;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.IAlarmActionStrategy">IAlarmActionStrategy</a>
+- *Default:* undefined (default action will be used, if any)
+
+Allows to override the default alarm action.
+
+---
+
+##### `actionsEnabled`<sup>Optional</sup> <a name="actionsEnabled" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.actionsEnabled"></a>
+
+```typescript
+public readonly actionsEnabled: boolean;
+```
+
+- *Type:* boolean
+- *Default:* the same as monitoring facade default
+
+Enables the configured CloudWatch alarm ticketing actions.
+
+---
+
+##### `alarmDescriptionOverride`<sup>Optional</sup> <a name="alarmDescriptionOverride" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.alarmDescriptionOverride"></a>
+
+```typescript
+public readonly alarmDescriptionOverride: string;
+```
+
+- *Type:* string
+- *Default:* default auto-generated content only
+
+A text included in the generated ticket description body, which fully replaces the generated text.
+
+---
+
+##### `alarmNameOverride`<sup>Optional</sup> <a name="alarmNameOverride" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.alarmNameOverride"></a>
+
+```typescript
+public readonly alarmNameOverride: string;
+```
+
+- *Type:* string
+
+If this is defined, the alarm name is set to this exact value.
+
+Please be aware that you need to specify prefix for different stages (Beta, Prod...) and realms (EU, NA...) manually.
+
+---
+
+##### `comparisonOperatorOverride`<sup>Optional</sup> <a name="comparisonOperatorOverride" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.comparisonOperatorOverride"></a>
+
+```typescript
+public readonly comparisonOperatorOverride: ComparisonOperator;
+```
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.ComparisonOperator
+- *Default:* alarm-specific default
+
+Comparison operator used to compare actual value against the threshold.
+
+---
+
+##### `customParams`<sup>Optional</sup> <a name="customParams" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.customParams"></a>
+
+```typescript
+public readonly customParams: {[ key: string ]: any};
+```
+
+- *Type:* {[ key: string ]: any}
+- *Default:* no parameters
+
+This allows user to attach custom parameters to this alarm, which can later be accessed from the "useCreatedAlarms" method.
+
+---
+
+##### `customTags`<sup>Optional</sup> <a name="customTags" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.customTags"></a>
+
+```typescript
+public readonly customTags: string[];
+```
+
+- *Type:* string[]
+- *Default:* no tags
+
+This allows user to attach custom values to this alarm, which can later be accessed from the "useCreatedAlarms" method.
+
+---
+
+##### `datapointsToAlarm`<sup>Optional</sup> <a name="datapointsToAlarm" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.datapointsToAlarm"></a>
+
+```typescript
+public readonly datapointsToAlarm: number;
+```
+
+- *Type:* number
+- *Default:* the same as monitoring facade default
+
+Number of breaches required to transition into an ALARM state.
+
+---
+
+##### `dedupeStringOverride`<sup>Optional</sup> <a name="dedupeStringOverride" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.dedupeStringOverride"></a>
+
+```typescript
+public readonly dedupeStringOverride: string;
+```
+
+- *Type:* string
+- *Default:* undefined (no override)
+
+If this is defined, the alarm dedupe string is set to this exact value.
+
+Please be aware that you need to handle deduping for different stages (Beta, Prod...) and realms (EU, NA...) manually.
+Dedupe strings are global and not unique per CTI.
+
+---
+
+##### `documentationLink`<sup>Optional</sup> <a name="documentationLink" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.documentationLink"></a>
+
+```typescript
+public readonly documentationLink: string;
+```
+
+- *Type:* string
+- *Default:* no additional link will be added
+
+An optional link included in the generated ticket description body.
+
+---
+
+##### `evaluateLowSampleCountPercentile`<sup>Optional</sup> <a name="evaluateLowSampleCountPercentile" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.evaluateLowSampleCountPercentile"></a>
+
+```typescript
+public readonly evaluateLowSampleCountPercentile: boolean;
+```
+
+- *Type:* boolean
+- *Default:* true
+
+Used only for alarms based on percentiles.
+
+If you specify <code>false</code>, the alarm state does not change during periods with too few data points to be statistically significant.
+If you specify <code>true</code>, the alarm is always evaluated and possibly changes state no matter how many data points are available.
+
+---
+
+##### `evaluationPeriods`<sup>Optional</sup> <a name="evaluationPeriods" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.evaluationPeriods"></a>
+
+```typescript
+public readonly evaluationPeriods: number;
+```
+
+- *Type:* number
+- *Default:* the same as monitoring facade default
+
+Number of periods to consider when checking the number of breaching datapoints.
+
+---
+
+##### `fillAlarmRange`<sup>Optional</sup> <a name="fillAlarmRange" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.fillAlarmRange"></a>
+
+```typescript
+public readonly fillAlarmRange: boolean;
+```
+
+- *Type:* boolean
+- *Default:* false
+
+Indicates whether the alarming range of values should be highlighted in the widget.
+
+---
+
+##### `minMetricSamplesToAlarm`<sup>Optional</sup> <a name="minMetricSamplesToAlarm" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.minMetricSamplesToAlarm"></a>
+
+```typescript
+public readonly minMetricSamplesToAlarm: number;
+```
+
+- *Type:* number
+- *Default:* default behaviour - no condition on sample count will be added to the alarm
+
+Specifies how many samples (N) of the metric is needed to trigger the alarm.
+
+If this property is specified, a composite alarm is created of the following:
+<ul>
+<li>The original alarm, created without this property being used; this alarm will have no actions set.</li>
+<li>A secondary alarm, which will monitor the same metric with the N (SampleCount) statistic, checking the sample count.</li>
+</ul>
+This composite alarm will be returned as a result and uses the specified alarm actions.
+
+---
+
+##### `period`<sup>Optional</sup> <a name="period" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.period"></a>
+
+```typescript
+public readonly period: Duration;
+```
+
+- *Type:* aws-cdk-lib.Duration
+- *Default:* the default specified in MetricFactory
+
+Period override for the metric to alarm on.
+
+---
+
+##### `runbookLink`<sup>Optional</sup> <a name="runbookLink" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.runbookLink"></a>
+
+```typescript
+public readonly runbookLink: string;
+```
+
+- *Type:* string
+- *Default:* no additional link will be added
+
+An optional link included in the generated ticket description body.
+
+---
+
+##### `treatMissingDataOverride`<sup>Optional</sup> <a name="treatMissingDataOverride" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.treatMissingDataOverride"></a>
+
+```typescript
+public readonly treatMissingDataOverride: TreatMissingData;
+```
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.TreatMissingData
+- *Default:* alarm-specific default
+
+Behaviour in case the metric data is missing.
+
+---
+
+##### `minConnectionCount`<sup>Required</sup> <a name="minConnectionCount" id="cdk-monitoring-constructs.LowConnectionCountThreshold.property.minConnectionCount"></a>
+
+```typescript
+public readonly minConnectionCount: number;
+```
+
+- *Type:* number
+
+---
+
 ### LowMessagesPublishedThreshold <a name="LowMessagesPublishedThreshold" id="cdk-monitoring-constructs.LowMessagesPublishedThreshold"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.LowMessagesPublishedThreshold.Initializer"></a>
@@ -29214,6 +29774,8 @@ const rdsClusterMonitoringOptions: RdsClusterMonitoringOptions = { ... }
 | <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoringOptions.property.useCreatedAlarms">useCreatedAlarms</a></code> | <code><a href="#cdk-monitoring-constructs.IAlarmConsumer">IAlarmConsumer</a></code> | Calls provided function to process all alarms created. |
 | <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoringOptions.property.addCpuUsageAlarm">addCpuUsageAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.UsageThreshold">UsageThreshold</a>}</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoringOptions.property.addDiskSpaceUsageAlarm">addDiskSpaceUsageAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.UsageThreshold">UsageThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoringOptions.property.addMaxConnectionCountAlarm">addMaxConnectionCountAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.HighConnectionCountThreshold">HighConnectionCountThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoringOptions.property.addMinConnectionCountAlarm">addMinConnectionCountAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.LowConnectionCountThreshold">LowConnectionCountThreshold</a>}</code> | *No description.* |
 
 ---
 
@@ -29335,6 +29897,26 @@ public readonly addDiskSpaceUsageAlarm: {[ key: string ]: UsageThreshold};
 
 ---
 
+##### `addMaxConnectionCountAlarm`<sup>Optional</sup> <a name="addMaxConnectionCountAlarm" id="cdk-monitoring-constructs.RdsClusterMonitoringOptions.property.addMaxConnectionCountAlarm"></a>
+
+```typescript
+public readonly addMaxConnectionCountAlarm: {[ key: string ]: HighConnectionCountThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.HighConnectionCountThreshold">HighConnectionCountThreshold</a>}
+
+---
+
+##### `addMinConnectionCountAlarm`<sup>Optional</sup> <a name="addMinConnectionCountAlarm" id="cdk-monitoring-constructs.RdsClusterMonitoringOptions.property.addMinConnectionCountAlarm"></a>
+
+```typescript
+public readonly addMinConnectionCountAlarm: {[ key: string ]: LowConnectionCountThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.LowConnectionCountThreshold">LowConnectionCountThreshold</a>}
+
+---
+
 ### RdsClusterMonitoringProps <a name="RdsClusterMonitoringProps" id="cdk-monitoring-constructs.RdsClusterMonitoringProps"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.RdsClusterMonitoringProps.Initializer"></a>
@@ -29360,6 +29942,8 @@ const rdsClusterMonitoringProps: RdsClusterMonitoringProps = { ... }
 | <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoringProps.property.useCreatedAlarms">useCreatedAlarms</a></code> | <code><a href="#cdk-monitoring-constructs.IAlarmConsumer">IAlarmConsumer</a></code> | Calls provided function to process all alarms created. |
 | <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoringProps.property.addCpuUsageAlarm">addCpuUsageAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.UsageThreshold">UsageThreshold</a>}</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoringProps.property.addDiskSpaceUsageAlarm">addDiskSpaceUsageAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.UsageThreshold">UsageThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoringProps.property.addMaxConnectionCountAlarm">addMaxConnectionCountAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.HighConnectionCountThreshold">HighConnectionCountThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoringProps.property.addMinConnectionCountAlarm">addMinConnectionCountAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.LowConnectionCountThreshold">LowConnectionCountThreshold</a>}</code> | *No description.* |
 
 ---
 
@@ -29507,6 +30091,26 @@ public readonly addDiskSpaceUsageAlarm: {[ key: string ]: UsageThreshold};
 
 ---
 
+##### `addMaxConnectionCountAlarm`<sup>Optional</sup> <a name="addMaxConnectionCountAlarm" id="cdk-monitoring-constructs.RdsClusterMonitoringProps.property.addMaxConnectionCountAlarm"></a>
+
+```typescript
+public readonly addMaxConnectionCountAlarm: {[ key: string ]: HighConnectionCountThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.HighConnectionCountThreshold">HighConnectionCountThreshold</a>}
+
+---
+
+##### `addMinConnectionCountAlarm`<sup>Optional</sup> <a name="addMinConnectionCountAlarm" id="cdk-monitoring-constructs.RdsClusterMonitoringProps.property.addMinConnectionCountAlarm"></a>
+
+```typescript
+public readonly addMinConnectionCountAlarm: {[ key: string ]: LowConnectionCountThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.LowConnectionCountThreshold">LowConnectionCountThreshold</a>}
+
+---
+
 ### RecordsFailedThreshold <a name="RecordsFailedThreshold" id="cdk-monitoring-constructs.RecordsFailedThreshold"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.RecordsFailedThreshold.Initializer"></a>
@@ -30118,6 +30722,9 @@ const redshiftClusterMonitoringOptions: RedshiftClusterMonitoringOptions = { ...
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringOptions.property.useCreatedAlarms">useCreatedAlarms</a></code> | <code><a href="#cdk-monitoring-constructs.IAlarmConsumer">IAlarmConsumer</a></code> | Calls provided function to process all alarms created. |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringOptions.property.addCpuUsageAlarm">addCpuUsageAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.UsageThreshold">UsageThreshold</a>}</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringOptions.property.addDiskSpaceUsageAlarm">addDiskSpaceUsageAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.UsageThreshold">UsageThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringOptions.property.addMaxConnectionCountAlarm">addMaxConnectionCountAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.HighConnectionCountThreshold">HighConnectionCountThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringOptions.property.addMaxLongQueryDurationAlarm">addMaxLongQueryDurationAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.DurationThreshold">DurationThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringOptions.property.addMinConnectionCountAlarm">addMinConnectionCountAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.LowConnectionCountThreshold">LowConnectionCountThreshold</a>}</code> | *No description.* |
 
 ---
 
@@ -30239,6 +30846,36 @@ public readonly addDiskSpaceUsageAlarm: {[ key: string ]: UsageThreshold};
 
 ---
 
+##### `addMaxConnectionCountAlarm`<sup>Optional</sup> <a name="addMaxConnectionCountAlarm" id="cdk-monitoring-constructs.RedshiftClusterMonitoringOptions.property.addMaxConnectionCountAlarm"></a>
+
+```typescript
+public readonly addMaxConnectionCountAlarm: {[ key: string ]: HighConnectionCountThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.HighConnectionCountThreshold">HighConnectionCountThreshold</a>}
+
+---
+
+##### `addMaxLongQueryDurationAlarm`<sup>Optional</sup> <a name="addMaxLongQueryDurationAlarm" id="cdk-monitoring-constructs.RedshiftClusterMonitoringOptions.property.addMaxLongQueryDurationAlarm"></a>
+
+```typescript
+public readonly addMaxLongQueryDurationAlarm: {[ key: string ]: DurationThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.DurationThreshold">DurationThreshold</a>}
+
+---
+
+##### `addMinConnectionCountAlarm`<sup>Optional</sup> <a name="addMinConnectionCountAlarm" id="cdk-monitoring-constructs.RedshiftClusterMonitoringOptions.property.addMinConnectionCountAlarm"></a>
+
+```typescript
+public readonly addMinConnectionCountAlarm: {[ key: string ]: LowConnectionCountThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.LowConnectionCountThreshold">LowConnectionCountThreshold</a>}
+
+---
+
 ### RedshiftClusterMonitoringProps <a name="RedshiftClusterMonitoringProps" id="cdk-monitoring-constructs.RedshiftClusterMonitoringProps"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.RedshiftClusterMonitoringProps.Initializer"></a>
@@ -30263,6 +30900,9 @@ const redshiftClusterMonitoringProps: RedshiftClusterMonitoringProps = { ... }
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringProps.property.useCreatedAlarms">useCreatedAlarms</a></code> | <code><a href="#cdk-monitoring-constructs.IAlarmConsumer">IAlarmConsumer</a></code> | Calls provided function to process all alarms created. |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringProps.property.addCpuUsageAlarm">addCpuUsageAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.UsageThreshold">UsageThreshold</a>}</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringProps.property.addDiskSpaceUsageAlarm">addDiskSpaceUsageAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.UsageThreshold">UsageThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringProps.property.addMaxConnectionCountAlarm">addMaxConnectionCountAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.HighConnectionCountThreshold">HighConnectionCountThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringProps.property.addMaxLongQueryDurationAlarm">addMaxLongQueryDurationAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.DurationThreshold">DurationThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoringProps.property.addMinConnectionCountAlarm">addMinConnectionCountAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.LowConnectionCountThreshold">LowConnectionCountThreshold</a>}</code> | *No description.* |
 
 ---
 
@@ -30394,6 +31034,36 @@ public readonly addDiskSpaceUsageAlarm: {[ key: string ]: UsageThreshold};
 
 ---
 
+##### `addMaxConnectionCountAlarm`<sup>Optional</sup> <a name="addMaxConnectionCountAlarm" id="cdk-monitoring-constructs.RedshiftClusterMonitoringProps.property.addMaxConnectionCountAlarm"></a>
+
+```typescript
+public readonly addMaxConnectionCountAlarm: {[ key: string ]: HighConnectionCountThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.HighConnectionCountThreshold">HighConnectionCountThreshold</a>}
+
+---
+
+##### `addMaxLongQueryDurationAlarm`<sup>Optional</sup> <a name="addMaxLongQueryDurationAlarm" id="cdk-monitoring-constructs.RedshiftClusterMonitoringProps.property.addMaxLongQueryDurationAlarm"></a>
+
+```typescript
+public readonly addMaxLongQueryDurationAlarm: {[ key: string ]: DurationThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.DurationThreshold">DurationThreshold</a>}
+
+---
+
+##### `addMinConnectionCountAlarm`<sup>Optional</sup> <a name="addMinConnectionCountAlarm" id="cdk-monitoring-constructs.RedshiftClusterMonitoringProps.property.addMinConnectionCountAlarm"></a>
+
+```typescript
+public readonly addMinConnectionCountAlarm: {[ key: string ]: LowConnectionCountThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.LowConnectionCountThreshold">LowConnectionCountThreshold</a>}
+
+---
+
 ### RunningTaskCountThreshold <a name="RunningTaskCountThreshold" id="cdk-monitoring-constructs.RunningTaskCountThreshold"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.RunningTaskCountThreshold.Initializer"></a>
@@ -41166,6 +41836,88 @@ public readonly projectUrl: string;
 ---
 
 
+### ConnectionAlarmFactory <a name="ConnectionAlarmFactory" id="cdk-monitoring-constructs.ConnectionAlarmFactory"></a>
+
+#### Initializers <a name="Initializers" id="cdk-monitoring-constructs.ConnectionAlarmFactory.Initializer"></a>
+
+```typescript
+import { ConnectionAlarmFactory } from 'cdk-monitoring-constructs'
+
+new ConnectionAlarmFactory(alarmFactory: AlarmFactory)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#cdk-monitoring-constructs.ConnectionAlarmFactory.Initializer.parameter.alarmFactory">alarmFactory</a></code> | <code><a href="#cdk-monitoring-constructs.AlarmFactory">AlarmFactory</a></code> | *No description.* |
+
+---
+
+##### `alarmFactory`<sup>Required</sup> <a name="alarmFactory" id="cdk-monitoring-constructs.ConnectionAlarmFactory.Initializer.parameter.alarmFactory"></a>
+
+- *Type:* <a href="#cdk-monitoring-constructs.AlarmFactory">AlarmFactory</a>
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#cdk-monitoring-constructs.ConnectionAlarmFactory.addMaxConnectionCountAlarm">addMaxConnectionCountAlarm</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.ConnectionAlarmFactory.addMinConnectionCountAlarm">addMinConnectionCountAlarm</a></code> | *No description.* |
+
+---
+
+##### `addMaxConnectionCountAlarm` <a name="addMaxConnectionCountAlarm" id="cdk-monitoring-constructs.ConnectionAlarmFactory.addMaxConnectionCountAlarm"></a>
+
+```typescript
+public addMaxConnectionCountAlarm(metric: Metric | MathExpression, props: HighConnectionCountThreshold, disambiguator?: string): AlarmWithAnnotation
+```
+
+###### `metric`<sup>Required</sup> <a name="metric" id="cdk-monitoring-constructs.ConnectionAlarmFactory.addMaxConnectionCountAlarm.parameter.metric"></a>
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.Metric | aws-cdk-lib.aws_cloudwatch.MathExpression
+
+---
+
+###### `props`<sup>Required</sup> <a name="props" id="cdk-monitoring-constructs.ConnectionAlarmFactory.addMaxConnectionCountAlarm.parameter.props"></a>
+
+- *Type:* <a href="#cdk-monitoring-constructs.HighConnectionCountThreshold">HighConnectionCountThreshold</a>
+
+---
+
+###### `disambiguator`<sup>Optional</sup> <a name="disambiguator" id="cdk-monitoring-constructs.ConnectionAlarmFactory.addMaxConnectionCountAlarm.parameter.disambiguator"></a>
+
+- *Type:* string
+
+---
+
+##### `addMinConnectionCountAlarm` <a name="addMinConnectionCountAlarm" id="cdk-monitoring-constructs.ConnectionAlarmFactory.addMinConnectionCountAlarm"></a>
+
+```typescript
+public addMinConnectionCountAlarm(metric: Metric | MathExpression, props: LowConnectionCountThreshold, disambiguator?: string): AlarmWithAnnotation
+```
+
+###### `metric`<sup>Required</sup> <a name="metric" id="cdk-monitoring-constructs.ConnectionAlarmFactory.addMinConnectionCountAlarm.parameter.metric"></a>
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.Metric | aws-cdk-lib.aws_cloudwatch.MathExpression
+
+---
+
+###### `props`<sup>Required</sup> <a name="props" id="cdk-monitoring-constructs.ConnectionAlarmFactory.addMinConnectionCountAlarm.parameter.props"></a>
+
+- *Type:* <a href="#cdk-monitoring-constructs.LowConnectionCountThreshold">LowConnectionCountThreshold</a>
+
+---
+
+###### `disambiguator`<sup>Optional</sup> <a name="disambiguator" id="cdk-monitoring-constructs.ConnectionAlarmFactory.addMinConnectionCountAlarm.parameter.disambiguator"></a>
+
+- *Type:* string
+
+---
+
+
+
+
 ### CustomAlarmFactory <a name="CustomAlarmFactory" id="cdk-monitoring-constructs.CustomAlarmFactory"></a>
 
 #### Initializers <a name="Initializers" id="cdk-monitoring-constructs.CustomAlarmFactory.Initializer"></a>
@@ -52595,6 +53347,8 @@ public createTitleWidget(): MonitoringHeaderWidget
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
 | <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoring.property.commitLatencyMetric">commitLatencyMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoring.property.connectionAlarmFactory">connectionAlarmFactory</a></code> | <code><a href="#cdk-monitoring-constructs.ConnectionAlarmFactory">ConnectionAlarmFactory</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoring.property.connectionAnnotations">connectionAnnotations</a></code> | <code>aws-cdk-lib.aws_cloudwatch.HorizontalAnnotation[]</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoring.property.connectionsMetric">connectionsMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoring.property.cpuUsageMetric">cpuUsageMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RdsClusterMonitoring.property.deleteLatencyMetric">deleteLatencyMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
@@ -52619,6 +53373,26 @@ public readonly commitLatencyMetric: Metric | MathExpression;
 
 ---
 
+##### `connectionAlarmFactory`<sup>Required</sup> <a name="connectionAlarmFactory" id="cdk-monitoring-constructs.RdsClusterMonitoring.property.connectionAlarmFactory"></a>
+
+```typescript
+public readonly connectionAlarmFactory: ConnectionAlarmFactory;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.ConnectionAlarmFactory">ConnectionAlarmFactory</a>
+
+---
+
+##### `connectionAnnotations`<sup>Required</sup> <a name="connectionAnnotations" id="cdk-monitoring-constructs.RdsClusterMonitoring.property.connectionAnnotations"></a>
+
+```typescript
+public readonly connectionAnnotations: HorizontalAnnotation[];
+```
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.HorizontalAnnotation[]
+
+---
+
 ##### `connectionsMetric`<sup>Required</sup> <a name="connectionsMetric" id="cdk-monitoring-constructs.RdsClusterMonitoring.property.connectionsMetric"></a>
 
 ```typescript
@@ -53067,12 +53841,16 @@ public createTitleWidget(): MonitoringHeaderWidget
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
+| <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.connectionAlarmFactory">connectionAlarmFactory</a></code> | <code><a href="#cdk-monitoring-constructs.ConnectionAlarmFactory">ConnectionAlarmFactory</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.connectionAnnotations">connectionAnnotations</a></code> | <code>aws-cdk-lib.aws_cloudwatch.HorizontalAnnotation[]</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.connectionsMetric">connectionsMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.cpuUsageMetric">cpuUsageMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.diskSpaceUsageMetric">diskSpaceUsageMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.latencyAlarmFactory">latencyAlarmFactory</a></code> | <code><a href="#cdk-monitoring-constructs.LatencyAlarmFactory">LatencyAlarmFactory</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.longQueryDurationMetric">longQueryDurationMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.maintenanceModeMetric">maintenanceModeMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.mediumQueryDurationMetric">mediumQueryDurationMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.queryDurationAnnotations">queryDurationAnnotations</a></code> | <code>aws-cdk-lib.aws_cloudwatch.HorizontalAnnotation[]</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.readLatencyMetric">readLatencyMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.shortQueryDurationMetric">shortQueryDurationMetric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Metric \| aws-cdk-lib.aws_cloudwatch.MathExpression</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.RedshiftClusterMonitoring.property.title">title</a></code> | <code>string</code> | *No description.* |
@@ -53083,6 +53861,26 @@ public createTitleWidget(): MonitoringHeaderWidget
 
 ---
 
+##### `connectionAlarmFactory`<sup>Required</sup> <a name="connectionAlarmFactory" id="cdk-monitoring-constructs.RedshiftClusterMonitoring.property.connectionAlarmFactory"></a>
+
+```typescript
+public readonly connectionAlarmFactory: ConnectionAlarmFactory;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.ConnectionAlarmFactory">ConnectionAlarmFactory</a>
+
+---
+
+##### `connectionAnnotations`<sup>Required</sup> <a name="connectionAnnotations" id="cdk-monitoring-constructs.RedshiftClusterMonitoring.property.connectionAnnotations"></a>
+
+```typescript
+public readonly connectionAnnotations: HorizontalAnnotation[];
+```
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.HorizontalAnnotation[]
+
+---
+
 ##### `connectionsMetric`<sup>Required</sup> <a name="connectionsMetric" id="cdk-monitoring-constructs.RedshiftClusterMonitoring.property.connectionsMetric"></a>
 
 ```typescript
@@ -53113,6 +53911,16 @@ public readonly diskSpaceUsageMetric: Metric | MathExpression;
 
 ---
 
+##### `latencyAlarmFactory`<sup>Required</sup> <a name="latencyAlarmFactory" id="cdk-monitoring-constructs.RedshiftClusterMonitoring.property.latencyAlarmFactory"></a>
+
+```typescript
+public readonly latencyAlarmFactory: LatencyAlarmFactory;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.LatencyAlarmFactory">LatencyAlarmFactory</a>
+
+---
+
 ##### `longQueryDurationMetric`<sup>Required</sup> <a name="longQueryDurationMetric" id="cdk-monitoring-constructs.RedshiftClusterMonitoring.property.longQueryDurationMetric"></a>
 
 ```typescript
@@ -53143,6 +53951,16 @@ public readonly mediumQueryDurationMetric: Metric | MathExpression;
 
 ---
 
+##### `queryDurationAnnotations`<sup>Required</sup> <a name="queryDurationAnnotations" id="cdk-monitoring-constructs.RedshiftClusterMonitoring.property.queryDurationAnnotations"></a>
+
+```typescript
+public readonly queryDurationAnnotations: HorizontalAnnotation[];
+```
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.HorizontalAnnotation[]
+
+---
+
 ##### `readLatencyMetric`<sup>Required</sup> <a name="readLatencyMetric" id="cdk-monitoring-constructs.RedshiftClusterMonitoring.property.readLatencyMetric"></a>
 
 ```typescript
diff --git a/README.md b/README.md
index c796e10d..8da2911a 100644
--- a/README.md
+++ b/README.md
@@ -92,8 +92,8 @@ You can browse the documentation at https://constructs.dev/packages/cdk-monitori
 | AWS Lambda (`.monitorLambdaFunction()`) | Latency, errors, iterator max age | Latency, errors, throttles, iterator max age | Optional Lambda Insights metrics (opt-in) support |
 | AWS Load Balancing (`.monitorNetworkLoadBalancer()`, `.monitorFargateApplicationLoadBalancer()`, `.monitorFargateNetworkLoadBalancer()`, `.monitorEc2ApplicationLoadBalancer()`, `.monitorEc2NetworkLoadBalancer()`) | System resources and task health | Unhealthy task count, running tasks count, (for Fargate/Ec2 apps) CPU/memory usage | Use for FargateService or Ec2Service backed by a NetworkLoadBalancer or ApplicationLoadBalancer |
 | AWS OpenSearch/Elasticsearch (`.monitorOpenSearchCluster()`, `.monitorElasticsearchCluster()`) | Indexing and search latency, disk/memory/CPU usage | Indexing and search latency, disk/memory/CPU usage, cluster status, KMS keys | |
-| AWS RDS (`.monitorRdsCluster()`) | Query duration, connections, latency, disk/CPU usage | Disk and CPU usage | |
-| AWS Redshift (`.monitorRedshiftCluster()`) | Query duration, connections, latency, disk/CPU usage | Disk and CPU usage | |
+| AWS RDS (`.monitorRdsCluster()`) | Query duration, connections, latency, disk/CPU usage | Connections, disk and CPU usage | |
+| AWS Redshift (`.monitorRedshiftCluster()`) | Query duration, connections, latency, disk/CPU usage | Query duration, connections, disk and CPU usage | |
 | AWS S3 Bucket (`.monitorS3Bucket()`) | Bucket size and number of objects | | |
 | AWS SecretsManager (`.monitorSecretsManagerSecret()`) | Days since last rotation | Days since last change or rotation | |
 | AWS SNS Topic (`.monitorSnsTopic()`) | Message count, size, failed notifications | Failed notifications, min/max published messages | |
diff --git a/lib/common/monitoring/alarms/ConnectionAlarmFactory.ts b/lib/common/monitoring/alarms/ConnectionAlarmFactory.ts
new file mode 100644
index 00000000..c1f8f7d4
--- /dev/null
+++ b/lib/common/monitoring/alarms/ConnectionAlarmFactory.ts
@@ -0,0 +1,61 @@
+import {
+  ComparisonOperator,
+  TreatMissingData,
+} from "aws-cdk-lib/aws-cloudwatch";
+
+import { AlarmFactory, CustomAlarmThreshold } from "../../alarm";
+import { MetricWithAlarmSupport } from "../../metric";
+
+export interface LowConnectionCountThreshold extends CustomAlarmThreshold {
+  readonly minConnectionCount: number;
+}
+
+export interface HighConnectionCountThreshold extends CustomAlarmThreshold {
+  readonly maxConnectionCount: number;
+}
+
+export class ConnectionAlarmFactory {
+  protected readonly alarmFactory: AlarmFactory;
+
+  constructor(alarmFactory: AlarmFactory) {
+    this.alarmFactory = alarmFactory;
+  }
+
+  addMinConnectionCountAlarm(
+    metric: MetricWithAlarmSupport,
+    props: LowConnectionCountThreshold,
+    disambiguator?: string
+  ) {
+    return this.alarmFactory.addAlarm(metric, {
+      treatMissingData:
+        props.treatMissingDataOverride ?? TreatMissingData.MISSING,
+      comparisonOperator:
+        props.comparisonOperatorOverride ??
+        ComparisonOperator.LESS_THAN_THRESHOLD,
+      ...props,
+      disambiguator,
+      threshold: props.minConnectionCount,
+      alarmNameSuffix: "Connection-Count-Low",
+      alarmDescription: `Number of connections is too low.`,
+    });
+  }
+
+  addMaxConnectionCountAlarm(
+    metric: MetricWithAlarmSupport,
+    props: HighConnectionCountThreshold,
+    disambiguator?: string
+  ) {
+    return this.alarmFactory.addAlarm(metric, {
+      treatMissingData:
+        props.treatMissingDataOverride ?? TreatMissingData.MISSING,
+      comparisonOperator:
+        props.comparisonOperatorOverride ??
+        ComparisonOperator.GREATER_THAN_THRESHOLD,
+      ...props,
+      disambiguator,
+      threshold: props.maxConnectionCount,
+      alarmNameSuffix: "Connection-Count-High",
+      alarmDescription: `Number of connections is too high.`,
+    });
+  }
+}
diff --git a/lib/common/monitoring/alarms/index.ts b/lib/common/monitoring/alarms/index.ts
index 0e11aba9..2759785f 100644
--- a/lib/common/monitoring/alarms/index.ts
+++ b/lib/common/monitoring/alarms/index.ts
@@ -1,6 +1,7 @@
 export * from "./AgeAlarmFactory";
 export * from "./AnomalyDetectingAlarmFactory";
 export * from "./CustomAlarmFactory";
+export * from "./ConnectionAlarmFactory";
 export * from "./DynamoAlarmFactory";
 export * from "./ElastiCacheAlarmFactory";
 export * from "./ErrorAlarmFactory";
diff --git a/lib/monitoring/aws-rds/RdsClusterMonitoring.ts b/lib/monitoring/aws-rds/RdsClusterMonitoring.ts
index 33d2d287..8a4809a1 100644
--- a/lib/monitoring/aws-rds/RdsClusterMonitoring.ts
+++ b/lib/monitoring/aws-rds/RdsClusterMonitoring.ts
@@ -6,10 +6,13 @@ import {
 
 import {
   BaseMonitoringProps,
+  ConnectionAlarmFactory,
   CountAxisFromZero,
   DefaultGraphWidgetHeight,
   DefaultSummaryWidgetHeight,
   HalfWidth,
+  HighConnectionCountThreshold,
+  LowConnectionCountThreshold,
   MetricWithAlarmSupport,
   Monitoring,
   MonitoringScope,
@@ -32,6 +35,14 @@ import {
 export interface RdsClusterMonitoringOptions extends BaseMonitoringProps {
   readonly addDiskSpaceUsageAlarm?: Record<string, UsageThreshold>;
   readonly addCpuUsageAlarm?: Record<string, UsageThreshold>;
+  readonly addMinConnectionCountAlarm?: Record<
+    string,
+    LowConnectionCountThreshold
+  >;
+  readonly addMaxConnectionCountAlarm?: Record<
+    string,
+    HighConnectionCountThreshold
+  >;
 }
 
 export interface RdsClusterMonitoringProps
@@ -43,7 +54,9 @@ export class RdsClusterMonitoring extends Monitoring {
   readonly url?: string;
 
   readonly usageAlarmFactory: UsageAlarmFactory;
+  readonly connectionAlarmFactory: ConnectionAlarmFactory;
   readonly usageAnnotations: HorizontalAnnotation[];
+  readonly connectionAnnotations: HorizontalAnnotation[];
 
   readonly connectionsMetric: MetricWithAlarmSupport;
   readonly diskSpaceUsageMetric: MetricWithAlarmSupport;
@@ -83,7 +96,10 @@ export class RdsClusterMonitoring extends Monitoring {
       namingStrategy.resolveAlarmFriendlyName()
     );
     this.usageAlarmFactory = new UsageAlarmFactory(alarmFactory);
+    this.connectionAlarmFactory = new ConnectionAlarmFactory(alarmFactory);
+
     this.usageAnnotations = [];
+    this.connectionAnnotations = [];
 
     for (const disambiguator in props.addDiskSpaceUsageAlarm) {
       const alarmProps = props.addDiskSpaceUsageAlarm[disambiguator];
@@ -107,6 +123,30 @@ export class RdsClusterMonitoring extends Monitoring {
       this.addAlarm(createdAlarm);
     }
 
+    for (const disambiguator in props.addMinConnectionCountAlarm) {
+      const alarmProps = props.addMinConnectionCountAlarm[disambiguator];
+      const createdAlarm =
+        this.connectionAlarmFactory.addMinConnectionCountAlarm(
+          this.connectionsMetric,
+          alarmProps,
+          disambiguator
+        );
+      this.connectionAnnotations.push(createdAlarm.annotation);
+      this.addAlarm(createdAlarm);
+    }
+
+    for (const disambiguator in props.addMaxConnectionCountAlarm) {
+      const alarmProps = props.addMaxConnectionCountAlarm[disambiguator];
+      const createdAlarm =
+        this.connectionAlarmFactory.addMaxConnectionCountAlarm(
+          this.connectionsMetric,
+          alarmProps,
+          disambiguator
+        );
+      this.connectionAnnotations.push(createdAlarm.annotation);
+      this.addAlarm(createdAlarm);
+    }
+
     props.useCreatedAlarms?.consume(this.createdAlarms());
   }
 
@@ -154,6 +194,7 @@ export class RdsClusterMonitoring extends Monitoring {
       title: "Connections",
       left: [this.connectionsMetric],
       leftYAxis: CountAxisFromZero,
+      leftAnnotations: this.connectionAnnotations,
     });
   }
 
diff --git a/lib/monitoring/aws-redshift/RedshiftClusterMonitoring.ts b/lib/monitoring/aws-redshift/RedshiftClusterMonitoring.ts
index 0f909650..5b478ce7 100644
--- a/lib/monitoring/aws-redshift/RedshiftClusterMonitoring.ts
+++ b/lib/monitoring/aws-redshift/RedshiftClusterMonitoring.ts
@@ -8,9 +8,15 @@ import {
   BaseMonitoringProps,
   BooleanAxisFromZeroToOne,
   CountAxisFromZero,
+  ConnectionAlarmFactory,
   DefaultGraphWidgetHeight,
   DefaultSummaryWidgetHeight,
+  DurationThreshold,
   HalfQuarterWidth,
+  HighConnectionCountThreshold,
+  LatencyAlarmFactory,
+  LatencyType,
+  LowConnectionCountThreshold,
   MetricWithAlarmSupport,
   Monitoring,
   MonitoringScope,
@@ -33,6 +39,15 @@ import {
 export interface RedshiftClusterMonitoringOptions extends BaseMonitoringProps {
   readonly addDiskSpaceUsageAlarm?: Record<string, UsageThreshold>;
   readonly addCpuUsageAlarm?: Record<string, UsageThreshold>;
+  readonly addMaxLongQueryDurationAlarm?: Record<string, DurationThreshold>;
+  readonly addMinConnectionCountAlarm?: Record<
+    string,
+    LowConnectionCountThreshold
+  >;
+  readonly addMaxConnectionCountAlarm?: Record<
+    string,
+    HighConnectionCountThreshold
+  >;
 }
 
 export interface RedshiftClusterMonitoringProps
@@ -44,6 +59,10 @@ export class RedshiftClusterMonitoring extends Monitoring {
   readonly url?: string;
 
   readonly usageAlarmFactory: UsageAlarmFactory;
+  readonly latencyAlarmFactory: LatencyAlarmFactory;
+  readonly connectionAlarmFactory: ConnectionAlarmFactory;
+  readonly queryDurationAnnotations: HorizontalAnnotation[];
+  readonly connectionAnnotations: HorizontalAnnotation[];
   readonly usageAnnotations: HorizontalAnnotation[];
 
   readonly connectionsMetric: MetricWithAlarmSupport;
@@ -72,6 +91,10 @@ export class RedshiftClusterMonitoring extends Monitoring {
       namingStrategy.resolveAlarmFriendlyName()
     );
     this.usageAlarmFactory = new UsageAlarmFactory(alarmFactory);
+    this.latencyAlarmFactory = new LatencyAlarmFactory(alarmFactory);
+    this.connectionAlarmFactory = new ConnectionAlarmFactory(alarmFactory);
+    this.queryDurationAnnotations = [];
+    this.connectionAnnotations = [];
     this.usageAnnotations = [];
 
     const metricFactory = new RedshiftClusterMetricFactory(
@@ -114,6 +137,42 @@ export class RedshiftClusterMonitoring extends Monitoring {
       this.addAlarm(createdAlarm);
     }
 
+    for (const disambiguator in props.addMaxLongQueryDurationAlarm) {
+      const alarmProps = props.addMaxLongQueryDurationAlarm[disambiguator];
+      const createdAlarm = this.latencyAlarmFactory.addDurationAlarm(
+        this.longQueryDurationMetric,
+        LatencyType.P90,
+        alarmProps,
+        disambiguator
+      );
+      this.queryDurationAnnotations.push(createdAlarm.annotation);
+      this.addAlarm(createdAlarm);
+    }
+
+    for (const disambiguator in props.addMinConnectionCountAlarm) {
+      const alarmProps = props.addMinConnectionCountAlarm[disambiguator];
+      const createdAlarm =
+        this.connectionAlarmFactory.addMinConnectionCountAlarm(
+          this.connectionsMetric,
+          alarmProps,
+          disambiguator
+        );
+      this.connectionAnnotations.push(createdAlarm.annotation);
+      this.addAlarm(createdAlarm);
+    }
+
+    for (const disambiguator in props.addMaxConnectionCountAlarm) {
+      const alarmProps = props.addMaxConnectionCountAlarm[disambiguator];
+      const createdAlarm =
+        this.connectionAlarmFactory.addMaxConnectionCountAlarm(
+          this.connectionsMetric,
+          alarmProps,
+          disambiguator
+        );
+      this.connectionAnnotations.push(createdAlarm.annotation);
+      this.addAlarm(createdAlarm);
+    }
+
     props.useCreatedAlarms?.consume(this.createdAlarms());
   }
 
@@ -163,6 +222,7 @@ export class RedshiftClusterMonitoring extends Monitoring {
       title: "Connections",
       left: [this.connectionsMetric],
       leftYAxis: CountAxisFromZero,
+      leftAnnotations: this.connectionAnnotations,
     });
   }
 
@@ -177,6 +237,7 @@ export class RedshiftClusterMonitoring extends Monitoring {
         this.longQueryDurationMetric,
       ],
       leftYAxis: TimeAxisMillisFromZero,
+      leftAnnotations: this.queryDurationAnnotations,
     });
   }
 


Test patch:
diff --git a/test/monitoring/aws-rds/RdsClusterMonitoring.test.ts b/test/monitoring/aws-rds/RdsClusterMonitoring.test.ts
index 3b8497f9..0a3afeb5 100644
--- a/test/monitoring/aws-rds/RdsClusterMonitoring.test.ts
+++ b/test/monitoring/aws-rds/RdsClusterMonitoring.test.ts
@@ -38,6 +38,16 @@ test("snapshot test: all alarms", () => {
         maxUsagePercent: 70,
       },
     },
+    addMinConnectionCountAlarm: {
+      Warning: {
+        minConnectionCount: 1,
+      },
+    },
+    addMaxConnectionCountAlarm: {
+      Warning: {
+        maxConnectionCount: 100,
+      },
+    },
     useCreatedAlarms: {
       consume(alarms) {
         numAlarmsCreated = alarms.length;
@@ -46,6 +56,6 @@ test("snapshot test: all alarms", () => {
   });
 
   addMonitoringDashboardsToStack(stack, monitoring);
-  expect(numAlarmsCreated).toStrictEqual(2);
+  expect(numAlarmsCreated).toStrictEqual(4);
   expect(Template.fromStack(stack)).toMatchSnapshot();
 });
diff --git a/test/monitoring/aws-rds/__snapshots__/RdsClusterMonitoring.test.ts.snap b/test/monitoring/aws-rds/__snapshots__/RdsClusterMonitoring.test.ts.snap
index 4e7a43f8..557bc1fd 100644
--- a/test/monitoring/aws-rds/__snapshots__/RdsClusterMonitoring.test.ts.snap
+++ b/test/monitoring/aws-rds/__snapshots__/RdsClusterMonitoring.test.ts.snap
@@ -38,6 +38,28 @@ Object {
                   "Arn",
                 ],
               },
+              "\\"]},\\"yAxis\\":{}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":4,\\"x\\":12,\\"y\\":0,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"annotations\\":{\\"alarms\\":[\\"",
+              Object {
+                "Fn::GetAtt": Array [
+                  "ScopeTestmyrdsclusterConnectionCountLowWarning67EFAE4C",
+                  "Arn",
+                ],
+              },
+              "\\"]},\\"yAxis\\":{}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":4,\\"x\\":18,\\"y\\":0,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"annotations\\":{\\"alarms\\":[\\"",
+              Object {
+                "Fn::GetAtt": Array [
+                  "ScopeTestmyrdsclusterConnectionCountHighWarning007697BF",
+                  "Arn",
+                ],
+              },
               "\\"]},\\"yAxis\\":{}}}]}",
             ],
           ],
@@ -59,7 +81,7 @@ Object {
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"DatabaseConnections\\",\\"DBClusterIdentifier\\",\\"my-rds-cluster\\",{\\"label\\":\\"Connections\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":12,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"DatabaseConnections\\",\\"DBClusterIdentifier\\",\\"my-rds-cluster\\",{\\"label\\":\\"Connections\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Connections < 1 for 3 datapoints within 15 minutes\\",\\"value\\":1,\\"yAxis\\":\\"left\\"},{\\"label\\":\\"Connections > 100 for 3 datapoints within 15 minutes\\",\\"value\\":100,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":12,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -104,6 +126,74 @@ Object {
       },
       "Type": "AWS::CloudWatch::Alarm",
     },
+    "ScopeTestmyrdsclusterConnectionCountHighWarning007697BF": Object {
+      "Properties": Object {
+        "ActionsEnabled": true,
+        "AlarmDescription": "Number of connections is too high.",
+        "AlarmName": "Test-my-rds-cluster-Connection-Count-High-Warning",
+        "ComparisonOperator": "GreaterThanThreshold",
+        "DatapointsToAlarm": 3,
+        "EvaluationPeriods": 3,
+        "Metrics": Array [
+          Object {
+            "Id": "m1",
+            "Label": "Connections",
+            "MetricStat": Object {
+              "Metric": Object {
+                "Dimensions": Array [
+                  Object {
+                    "Name": "DBClusterIdentifier",
+                    "Value": "my-rds-cluster",
+                  },
+                ],
+                "MetricName": "DatabaseConnections",
+                "Namespace": "AWS/RDS",
+              },
+              "Period": 300,
+              "Stat": "Average",
+            },
+            "ReturnData": true,
+          },
+        ],
+        "Threshold": 100,
+        "TreatMissingData": "missing",
+      },
+      "Type": "AWS::CloudWatch::Alarm",
+    },
+    "ScopeTestmyrdsclusterConnectionCountLowWarning67EFAE4C": Object {
+      "Properties": Object {
+        "ActionsEnabled": true,
+        "AlarmDescription": "Number of connections is too low.",
+        "AlarmName": "Test-my-rds-cluster-Connection-Count-Low-Warning",
+        "ComparisonOperator": "LessThanThreshold",
+        "DatapointsToAlarm": 3,
+        "EvaluationPeriods": 3,
+        "Metrics": Array [
+          Object {
+            "Id": "m1",
+            "Label": "Connections",
+            "MetricStat": Object {
+              "Metric": Object {
+                "Dimensions": Array [
+                  Object {
+                    "Name": "DBClusterIdentifier",
+                    "Value": "my-rds-cluster",
+                  },
+                ],
+                "MetricName": "DatabaseConnections",
+                "Namespace": "AWS/RDS",
+              },
+              "Period": 300,
+              "Stat": "Average",
+            },
+            "ReturnData": true,
+          },
+        ],
+        "Threshold": 1,
+        "TreatMissingData": "missing",
+      },
+      "Type": "AWS::CloudWatch::Alarm",
+    },
     "ScopeTestmyrdsclusterDiskUsageWarning8EF6083D": Object {
       "Properties": Object {
         "ActionsEnabled": true,
@@ -176,7 +266,7 @@ Object {
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"DatabaseConnections\\",\\"DBClusterIdentifier\\",\\"my-rds-cluster\\",{\\"label\\":\\"Connections\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":16,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"DatabaseConnections\\",\\"DBClusterIdentifier\\",\\"my-rds-cluster\\",{\\"label\\":\\"Connections\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Connections < 1 for 3 datapoints within 15 minutes\\",\\"value\\":1,\\"yAxis\\":\\"left\\"},{\\"label\\":\\"Connections > 100 for 3 datapoints within 15 minutes\\",\\"value\\":100,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":16,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
diff --git a/test/monitoring/aws-redshift/RedshiftClusterMonitoring.test.ts b/test/monitoring/aws-redshift/RedshiftClusterMonitoring.test.ts
index 309eaaaa..b96fe94e 100644
--- a/test/monitoring/aws-redshift/RedshiftClusterMonitoring.test.ts
+++ b/test/monitoring/aws-redshift/RedshiftClusterMonitoring.test.ts
@@ -1,7 +1,7 @@
-import { Stack } from "aws-cdk-lib";
+import { Duration, Stack } from "aws-cdk-lib";
 import { Template } from "aws-cdk-lib/assertions";
 
-import { RdsClusterMonitoring } from "../../../lib";
+import { RedshiftClusterMonitoring } from "../../../lib";
 import { addMonitoringDashboardsToStack } from "../../utils/SnapshotUtil";
 import { TestMonitoringScope } from "../TestMonitoringScope";
 
@@ -10,7 +10,7 @@ test("snapshot test: no alarms", () => {
 
   const scope = new TestMonitoringScope(stack, "Scope");
 
-  const monitoring = new RdsClusterMonitoring(scope, {
+  const monitoring = new RedshiftClusterMonitoring(scope, {
     alarmFriendlyName: "DummyRedshiftCluster",
     clusterIdentifier: "my-redshift-cluster",
   });
@@ -26,7 +26,7 @@ test("snapshot test: all alarms", () => {
 
   let numAlarmsCreated = 0;
 
-  const monitoring = new RdsClusterMonitoring(scope, {
+  const monitoring = new RedshiftClusterMonitoring(scope, {
     clusterIdentifier: "my-redshift-cluster",
     addDiskSpaceUsageAlarm: {
       Warning: {
@@ -38,6 +38,21 @@ test("snapshot test: all alarms", () => {
         maxUsagePercent: 70,
       },
     },
+    addMinConnectionCountAlarm: {
+      Warning: {
+        minConnectionCount: 1,
+      },
+    },
+    addMaxConnectionCountAlarm: {
+      Warning: {
+        maxConnectionCount: 100,
+      },
+    },
+    addMaxLongQueryDurationAlarm: {
+      Warning: {
+        maxDuration: Duration.seconds(5),
+      },
+    },
     useCreatedAlarms: {
       consume(alarms) {
         numAlarmsCreated = alarms.length;
@@ -46,6 +61,6 @@ test("snapshot test: all alarms", () => {
   });
 
   addMonitoringDashboardsToStack(stack, monitoring);
-  expect(numAlarmsCreated).toStrictEqual(2);
+  expect(numAlarmsCreated).toStrictEqual(5);
   expect(Template.fromStack(stack)).toMatchSnapshot();
 });
diff --git a/test/monitoring/aws-redshift/__snapshots__/RedshiftClusterMonitoring.test.ts.snap b/test/monitoring/aws-redshift/__snapshots__/RedshiftClusterMonitoring.test.ts.snap
index 0ff623ad..f56a54ee 100644
--- a/test/monitoring/aws-redshift/__snapshots__/RedshiftClusterMonitoring.test.ts.snap
+++ b/test/monitoring/aws-redshift/__snapshots__/RedshiftClusterMonitoring.test.ts.snap
@@ -38,6 +38,39 @@ Object {
                   "Arn",
                 ],
               },
+              "\\"]},\\"yAxis\\":{}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":4,\\"x\\":12,\\"y\\":0,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"annotations\\":{\\"alarms\\":[\\"",
+              Object {
+                "Fn::GetAtt": Array [
+                  "ScopeTestmyredshiftclusterDurationP90WarningC09D9BD2",
+                  "Arn",
+                ],
+              },
+              "\\"]},\\"yAxis\\":{}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":4,\\"x\\":18,\\"y\\":0,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"annotations\\":{\\"alarms\\":[\\"",
+              Object {
+                "Fn::GetAtt": Array [
+                  "ScopeTestmyredshiftclusterConnectionCountLowWarning1DEF6EDD",
+                  "Arn",
+                ],
+              },
+              "\\"]},\\"yAxis\\":{}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":4,\\"x\\":0,\\"y\\":4,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"annotations\\":{\\"alarms\\":[\\"",
+              Object {
+                "Fn::GetAtt": Array [
+                  "ScopeTestmyredshiftclusterConnectionCountHighWarning7C79A1CE",
+                  "Arn",
+                ],
+              },
               "\\"]},\\"yAxis\\":{}}}]}",
             ],
           ],
@@ -51,19 +84,27 @@ Object {
           "Fn::Join": Array [
             "",
             Array [
-              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### RDS Cluster **[my-redshift-cluster](https://eu-west-1.console.aws.amazon.com/rds/home?region=eu-west-1#database:id=my-redshift-cluster;is-cluster=true;tab=monitoring)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU/Disk Usage\\",\\"region\\":\\"",
+              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### Redshift Cluster **[my-redshift-cluster](https://eu-west-1.console.aws.amazon.com/redshiftv2/home?region=eu-west-1#cluster-details?cluster=my-redshift-cluster)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU/Disk Usage\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"CPUUtilization\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"CPU Usage\\"}],[{\\"label\\":\\"Disk Usage\\",\\"expression\\":\\"100 * (used/(used+free))\\"}],[\\"AWS/RDS\\",\\"VolumeBytesUsed\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Used\\",\\"stat\\":\\"Maximum\\",\\"visible\\":false,\\"id\\":\\"used\\"}],[\\"AWS/RDS\\",\\"FreeLocalStorage\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Free\\",\\"stat\\":\\"Minimum\\",\\"visible\\":false,\\"id\\":\\"free\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Disk Usage > 80 for 3 datapoints within 15 minutes\\",\\"value\\":80,\\"yAxis\\":\\"left\\"},{\\"label\\":\\"CPU Usage > 70 for 3 datapoints within 15 minutes\\",\\"value\\":70,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Connections\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/Redshift\\",\\"CPUUtilization\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"CPU Usage\\"}],[\\"AWS/Redshift\\",\\"PercentageDiskSpaceUsed\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Disk Usage\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Disk Usage > 80 for 3 datapoints within 15 minutes\\",\\"value\\":80,\\"yAxis\\":\\"left\\"},{\\"label\\":\\"CPU Usage > 70 for 3 datapoints within 15 minutes\\",\\"value\\":70,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Connections\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"DatabaseConnections\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Connections\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":12,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/Redshift\\",\\"DatabaseConnections\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Connections\\",\\"stat\\":\\"Sum\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Connections < 1 for 3 datapoints within 15 minutes\\",\\"value\\":1,\\"yAxis\\":\\"left\\"},{\\"label\\":\\"Connections > 100 for 3 datapoints within 15 minutes\\",\\"value\\":100,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"SelectLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Select\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"InsertLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Insert\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"UpdateLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Update\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"DeleteLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Delete\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"CommitLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Commit\\",\\"stat\\":\\"p90\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}}]}",
+              "\\",\\"metrics\\":[[{\\"label\\":\\"Short P90\\",\\"expression\\":\\"sQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"short\\",{\\"label\\":\\"short\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"sQueryLatency90\\"}],[{\\"label\\":\\"Medium P90\\",\\"expression\\":\\"mQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"medium\\",{\\"label\\":\\"medium\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"mQueryLatency90\\"}],[{\\"label\\":\\"Long P90\\",\\"expression\\":\\"lQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"long\\",{\\"label\\":\\"long\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"lQueryLatency90\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Long P90 > 5000 for 3 datapoints within 15 minutes\\",\\"value\\":5000,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":3,\\"height\\":5,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[{\\"label\\":\\"Read P90\\",\\"expression\\":\\"readLatency * 1000\\"}],[\\"AWS/Redshift\\",\\"ReadLatency\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Read P90\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"readLatency\\"}],[{\\"label\\":\\"Write P90\\",\\"expression\\":\\"writeLatency * 1000\\"}],[\\"AWS/Redshift\\",\\"WriteLatency\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Write P90\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"writeLatency\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":3,\\"height\\":5,\\"x\\":21,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Maintenance\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Redshift\\",\\"MaintenanceMode\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Maintenance\\",\\"stat\\":\\"Maximum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":1,\\"label\\":\\"1 = True\\",\\"showUnits\\":false}}}}]}",
             ],
           ],
         },
@@ -86,12 +127,12 @@ Object {
               "Metric": Object {
                 "Dimensions": Array [
                   Object {
-                    "Name": "DBClusterIdentifier",
+                    "Name": "ClusterIdentifier",
                     "Value": "my-redshift-cluster",
                   },
                 ],
                 "MetricName": "CPUUtilization",
-                "Namespace": "AWS/RDS",
+                "Namespace": "AWS/Redshift",
               },
               "Period": 300,
               "Stat": "Average",
@@ -104,6 +145,74 @@ Object {
       },
       "Type": "AWS::CloudWatch::Alarm",
     },
+    "ScopeTestmyredshiftclusterConnectionCountHighWarning7C79A1CE": Object {
+      "Properties": Object {
+        "ActionsEnabled": true,
+        "AlarmDescription": "Number of connections is too high.",
+        "AlarmName": "Test-my-redshift-cluster-Connection-Count-High-Warning",
+        "ComparisonOperator": "GreaterThanThreshold",
+        "DatapointsToAlarm": 3,
+        "EvaluationPeriods": 3,
+        "Metrics": Array [
+          Object {
+            "Id": "m1",
+            "Label": "Connections",
+            "MetricStat": Object {
+              "Metric": Object {
+                "Dimensions": Array [
+                  Object {
+                    "Name": "ClusterIdentifier",
+                    "Value": "my-redshift-cluster",
+                  },
+                ],
+                "MetricName": "DatabaseConnections",
+                "Namespace": "AWS/Redshift",
+              },
+              "Period": 300,
+              "Stat": "Sum",
+            },
+            "ReturnData": true,
+          },
+        ],
+        "Threshold": 100,
+        "TreatMissingData": "missing",
+      },
+      "Type": "AWS::CloudWatch::Alarm",
+    },
+    "ScopeTestmyredshiftclusterConnectionCountLowWarning1DEF6EDD": Object {
+      "Properties": Object {
+        "ActionsEnabled": true,
+        "AlarmDescription": "Number of connections is too low.",
+        "AlarmName": "Test-my-redshift-cluster-Connection-Count-Low-Warning",
+        "ComparisonOperator": "LessThanThreshold",
+        "DatapointsToAlarm": 3,
+        "EvaluationPeriods": 3,
+        "Metrics": Array [
+          Object {
+            "Id": "m1",
+            "Label": "Connections",
+            "MetricStat": Object {
+              "Metric": Object {
+                "Dimensions": Array [
+                  Object {
+                    "Name": "ClusterIdentifier",
+                    "Value": "my-redshift-cluster",
+                  },
+                ],
+                "MetricName": "DatabaseConnections",
+                "Namespace": "AWS/Redshift",
+              },
+              "Period": 300,
+              "Stat": "Sum",
+            },
+            "ReturnData": true,
+          },
+        ],
+        "Threshold": 1,
+        "TreatMissingData": "missing",
+      },
+      "Type": "AWS::CloudWatch::Alarm",
+    },
     "ScopeTestmyredshiftclusterDiskUsageWarning77DA71A5": Object {
       "Properties": Object {
         "ActionsEnabled": true,
@@ -114,51 +223,70 @@ Object {
         "EvaluationPeriods": 3,
         "Metrics": Array [
           Object {
-            "Expression": "100 * (used/(used+free))",
-            "Id": "expr_1",
+            "Id": "m1",
             "Label": "Disk Usage",
-          },
-          Object {
-            "Id": "used",
-            "Label": "Used",
             "MetricStat": Object {
               "Metric": Object {
                 "Dimensions": Array [
                   Object {
-                    "Name": "DBClusterIdentifier",
+                    "Name": "ClusterIdentifier",
                     "Value": "my-redshift-cluster",
                   },
                 ],
-                "MetricName": "VolumeBytesUsed",
-                "Namespace": "AWS/RDS",
+                "MetricName": "PercentageDiskSpaceUsed",
+                "Namespace": "AWS/Redshift",
               },
               "Period": 300,
-              "Stat": "Maximum",
+              "Stat": "Average",
             },
-            "ReturnData": false,
+            "ReturnData": true,
+          },
+        ],
+        "Threshold": 80,
+        "TreatMissingData": "missing",
+      },
+      "Type": "AWS::CloudWatch::Alarm",
+    },
+    "ScopeTestmyredshiftclusterDurationP90WarningC09D9BD2": Object {
+      "Properties": Object {
+        "ActionsEnabled": true,
+        "AlarmDescription": "P90 duration is too long.",
+        "AlarmName": "Test-my-redshift-cluster-Duration-P90-Warning",
+        "ComparisonOperator": "GreaterThanThreshold",
+        "DatapointsToAlarm": 3,
+        "EvaluationPeriods": 3,
+        "Metrics": Array [
+          Object {
+            "Expression": "lQueryLatency90 / 1000",
+            "Id": "expr_1",
+            "Label": "Long P90",
           },
           Object {
-            "Id": "free",
-            "Label": "Free",
+            "Id": "lQueryLatency90",
+            "Label": "long",
             "MetricStat": Object {
               "Metric": Object {
                 "Dimensions": Array [
                   Object {
-                    "Name": "DBClusterIdentifier",
+                    "Name": "ClusterIdentifier",
                     "Value": "my-redshift-cluster",
                   },
+                  Object {
+                    "Name": "latency",
+                    "Value": "long",
+                  },
                 ],
-                "MetricName": "FreeLocalStorage",
-                "Namespace": "AWS/RDS",
+                "MetricName": "QueryDuration",
+                "Namespace": "AWS/Redshift",
               },
               "Period": 300,
-              "Stat": "Minimum",
+              "Stat": "p90",
             },
             "ReturnData": false,
           },
         ],
-        "Threshold": 80,
-        "TreatMissingData": "missing",
+        "Threshold": 5000,
+        "TreatMissingData": "notBreaching",
       },
       "Type": "AWS::CloudWatch::Alarm",
     },
@@ -168,19 +296,19 @@ Object {
           "Fn::Join": Array [
             "",
             Array [
-              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### RDS Cluster **[my-redshift-cluster](https://eu-west-1.console.aws.amazon.com/rds/home?region=eu-west-1#database:id=my-redshift-cluster;is-cluster=true;tab=monitoring)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU/Disk Usage\\",\\"region\\":\\"",
+              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### Redshift Cluster **[my-redshift-cluster](https://eu-west-1.console.aws.amazon.com/redshiftv2/home?region=eu-west-1#cluster-details?cluster=my-redshift-cluster)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU/Disk Usage\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"CPUUtilization\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"CPU Usage\\"}],[{\\"label\\":\\"Disk Usage\\",\\"expression\\":\\"100 * (used/(used+free))\\"}],[\\"AWS/RDS\\",\\"VolumeBytesUsed\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Used\\",\\"stat\\":\\"Maximum\\",\\"visible\\":false,\\"id\\":\\"used\\"}],[\\"AWS/RDS\\",\\"FreeLocalStorage\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Free\\",\\"stat\\":\\"Minimum\\",\\"visible\\":false,\\"id\\":\\"free\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Disk Usage > 80 for 3 datapoints within 15 minutes\\",\\"value\\":80,\\"yAxis\\":\\"left\\"},{\\"label\\":\\"CPU Usage > 70 for 3 datapoints within 15 minutes\\",\\"value\\":70,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Connections\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/Redshift\\",\\"CPUUtilization\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"CPU Usage\\"}],[\\"AWS/Redshift\\",\\"PercentageDiskSpaceUsed\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Disk Usage\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Disk Usage > 80 for 3 datapoints within 15 minutes\\",\\"value\\":80,\\"yAxis\\":\\"left\\"},{\\"label\\":\\"CPU Usage > 70 for 3 datapoints within 15 minutes\\",\\"value\\":70,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Connections\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"DatabaseConnections\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Connections\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":16,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/Redshift\\",\\"DatabaseConnections\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Connections\\",\\"stat\\":\\"Sum\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Connections < 1 for 3 datapoints within 15 minutes\\",\\"value\\":1,\\"yAxis\\":\\"left\\"},{\\"label\\":\\"Connections > 100 for 3 datapoints within 15 minutes\\",\\"value\\":100,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":16,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"SelectLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Select\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"InsertLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Insert\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"UpdateLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Update\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"DeleteLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Delete\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"CommitLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Commit\\",\\"stat\\":\\"p90\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}}]}",
+              "\\",\\"metrics\\":[[{\\"label\\":\\"Short P90\\",\\"expression\\":\\"sQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"short\\",{\\"label\\":\\"short\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"sQueryLatency90\\"}],[{\\"label\\":\\"Medium P90\\",\\"expression\\":\\"mQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"medium\\",{\\"label\\":\\"medium\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"mQueryLatency90\\"}],[{\\"label\\":\\"Long P90\\",\\"expression\\":\\"lQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"long\\",{\\"label\\":\\"long\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"lQueryLatency90\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Long P90 > 5000 for 3 datapoints within 15 minutes\\",\\"value\\":5000,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}}]}",
             ],
           ],
         },
@@ -240,19 +368,27 @@ Object {
           "Fn::Join": Array [
             "",
             Array [
-              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### RDS Cluster **[my-redshift-cluster](https://eu-west-1.console.aws.amazon.com/rds/home?region=eu-west-1#database:id=my-redshift-cluster;is-cluster=true;tab=monitoring)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU/Disk Usage\\",\\"region\\":\\"",
+              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### Redshift Cluster **[my-redshift-cluster](https://eu-west-1.console.aws.amazon.com/redshiftv2/home?region=eu-west-1#cluster-details?cluster=my-redshift-cluster)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU/Disk Usage\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Redshift\\",\\"CPUUtilization\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"CPU Usage\\"}],[\\"AWS/Redshift\\",\\"PercentageDiskSpaceUsed\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Disk Usage\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Connections\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Redshift\\",\\"DatabaseConnections\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Connections\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"CPUUtilization\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"CPU Usage\\"}],[{\\"label\\":\\"Disk Usage\\",\\"expression\\":\\"100 * (used/(used+free))\\"}],[\\"AWS/RDS\\",\\"VolumeBytesUsed\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Used\\",\\"stat\\":\\"Maximum\\",\\"visible\\":false,\\"id\\":\\"used\\"}],[\\"AWS/RDS\\",\\"FreeLocalStorage\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Free\\",\\"stat\\":\\"Minimum\\",\\"visible\\":false,\\"id\\":\\"free\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Connections\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[{\\"label\\":\\"Short P90\\",\\"expression\\":\\"sQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"short\\",{\\"label\\":\\"short\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"sQueryLatency90\\"}],[{\\"label\\":\\"Medium P90\\",\\"expression\\":\\"mQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"medium\\",{\\"label\\":\\"medium\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"mQueryLatency90\\"}],[{\\"label\\":\\"Long P90\\",\\"expression\\":\\"lQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"long\\",{\\"label\\":\\"long\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"lQueryLatency90\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":3,\\"height\\":5,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"DatabaseConnections\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Connections\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":12,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[{\\"label\\":\\"Read P90\\",\\"expression\\":\\"readLatency * 1000\\"}],[\\"AWS/Redshift\\",\\"ReadLatency\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Read P90\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"readLatency\\"}],[{\\"label\\":\\"Write P90\\",\\"expression\\":\\"writeLatency * 1000\\"}],[\\"AWS/Redshift\\",\\"WriteLatency\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Write P90\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"writeLatency\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":3,\\"height\\":5,\\"x\\":21,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Maintenance\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"SelectLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Select\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"InsertLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Insert\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"UpdateLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Update\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"DeleteLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Delete\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"CommitLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Commit\\",\\"stat\\":\\"p90\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}}]}",
+              "\\",\\"metrics\\":[[\\"AWS/Redshift\\",\\"MaintenanceMode\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Maintenance\\",\\"stat\\":\\"Maximum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":1,\\"label\\":\\"1 = True\\",\\"showUnits\\":false}}}}]}",
             ],
           ],
         },
@@ -265,19 +401,19 @@ Object {
           "Fn::Join": Array [
             "",
             Array [
-              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### RDS Cluster **[my-redshift-cluster](https://eu-west-1.console.aws.amazon.com/rds/home?region=eu-west-1#database:id=my-redshift-cluster;is-cluster=true;tab=monitoring)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU/Disk Usage\\",\\"region\\":\\"",
+              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### Redshift Cluster **[my-redshift-cluster](https://eu-west-1.console.aws.amazon.com/redshiftv2/home?region=eu-west-1#cluster-details?cluster=my-redshift-cluster)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU/Disk Usage\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"CPUUtilization\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"CPU Usage\\"}],[{\\"label\\":\\"Disk Usage\\",\\"expression\\":\\"100 * (used/(used+free))\\"}],[\\"AWS/RDS\\",\\"VolumeBytesUsed\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Used\\",\\"stat\\":\\"Maximum\\",\\"visible\\":false,\\"id\\":\\"used\\"}],[\\"AWS/RDS\\",\\"FreeLocalStorage\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Free\\",\\"stat\\":\\"Minimum\\",\\"visible\\":false,\\"id\\":\\"free\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Connections\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/Redshift\\",\\"CPUUtilization\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"CPU Usage\\"}],[\\"AWS/Redshift\\",\\"PercentageDiskSpaceUsed\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Disk Usage\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Connections\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"DatabaseConnections\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Connections\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":16,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/Redshift\\",\\"DatabaseConnections\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Connections\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":16,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Query Duration\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/RDS\\",\\"SelectLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Select\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"InsertLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Insert\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"UpdateLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Update\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"DeleteLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Delete\\",\\"stat\\":\\"p90\\"}],[\\"AWS/RDS\\",\\"CommitLatency\\",\\"DBClusterIdentifier\\",\\"my-redshift-cluster\\",{\\"label\\":\\"Commit\\",\\"stat\\":\\"p90\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}}]}",
+              "\\",\\"metrics\\":[[{\\"label\\":\\"Short P90\\",\\"expression\\":\\"sQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"short\\",{\\"label\\":\\"short\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"sQueryLatency90\\"}],[{\\"label\\":\\"Medium P90\\",\\"expression\\":\\"mQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"medium\\",{\\"label\\":\\"medium\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"mQueryLatency90\\"}],[{\\"label\\":\\"Long P90\\",\\"expression\\":\\"lQueryLatency90 / 1000\\"}],[\\"AWS/Redshift\\",\\"QueryDuration\\",\\"ClusterIdentifier\\",\\"my-redshift-cluster\\",\\"latency\\",\\"long\\",{\\"label\\":\\"long\\",\\"stat\\":\\"p90\\",\\"visible\\":false,\\"id\\":\\"lQueryLatency90\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}}]}",
             ],
           ],
         },