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

Issue:
[kinesis] Add alarm on Kinesis read/write throttling
Create alarm on throttling events (N) reported by Kinesis.


Discussion / hints:
There is `addPutRecordsThrottledAlarm` for Kinesis. We do not have anything for Firehose.

Fix patch:
diff --git a/API.md b/API.md
index a1cad8cb..c3d10045 100644
--- a/API.md
+++ b/API.md
@@ -17244,6 +17244,9 @@ const kinesisDataStreamMonitoringOptions: KinesisDataStreamMonitoringOptions = {
 | <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringOptions.property.addIteratorMaxAgeAlarm">addIteratorMaxAgeAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.MaxIteratorAgeThreshold">MaxIteratorAgeThreshold</a>}</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringOptions.property.addPutRecordsFailedAlarm">addPutRecordsFailedAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsFailedThreshold">RecordsFailedThreshold</a>}</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringOptions.property.addPutRecordsThrottledAlarm">addPutRecordsThrottledAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringOptions.property.addReadProvisionedThroughputExceededAlarm">addReadProvisionedThroughputExceededAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringOptions.property.addThrottledRecordsAlarm">addThrottledRecordsAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringOptions.property.addWriteProvisionedThroughputExceededAlarm">addWriteProvisionedThroughputExceededAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}</code> | *No description.* |
 
 ---
 
@@ -17375,6 +17378,36 @@ public readonly addPutRecordsThrottledAlarm: {[ key: string ]: RecordsThrottledT
 
 ---
 
+##### `addReadProvisionedThroughputExceededAlarm`<sup>Optional</sup> <a name="addReadProvisionedThroughputExceededAlarm" id="cdk-monitoring-constructs.KinesisDataStreamMonitoringOptions.property.addReadProvisionedThroughputExceededAlarm"></a>
+
+```typescript
+public readonly addReadProvisionedThroughputExceededAlarm: {[ key: string ]: RecordsThrottledThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}
+
+---
+
+##### `addThrottledRecordsAlarm`<sup>Optional</sup> <a name="addThrottledRecordsAlarm" id="cdk-monitoring-constructs.KinesisDataStreamMonitoringOptions.property.addThrottledRecordsAlarm"></a>
+
+```typescript
+public readonly addThrottledRecordsAlarm: {[ key: string ]: RecordsThrottledThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}
+
+---
+
+##### `addWriteProvisionedThroughputExceededAlarm`<sup>Optional</sup> <a name="addWriteProvisionedThroughputExceededAlarm" id="cdk-monitoring-constructs.KinesisDataStreamMonitoringOptions.property.addWriteProvisionedThroughputExceededAlarm"></a>
+
+```typescript
+public readonly addWriteProvisionedThroughputExceededAlarm: {[ key: string ]: RecordsThrottledThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}
+
+---
+
 ### KinesisDataStreamMonitoringProps <a name="KinesisDataStreamMonitoringProps" id="cdk-monitoring-constructs.KinesisDataStreamMonitoringProps"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.KinesisDataStreamMonitoringProps.Initializer"></a>
@@ -17400,6 +17433,9 @@ const kinesisDataStreamMonitoringProps: KinesisDataStreamMonitoringProps = { ...
 | <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringProps.property.addIteratorMaxAgeAlarm">addIteratorMaxAgeAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.MaxIteratorAgeThreshold">MaxIteratorAgeThreshold</a>}</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringProps.property.addPutRecordsFailedAlarm">addPutRecordsFailedAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsFailedThreshold">RecordsFailedThreshold</a>}</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringProps.property.addPutRecordsThrottledAlarm">addPutRecordsThrottledAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringProps.property.addReadProvisionedThroughputExceededAlarm">addReadProvisionedThroughputExceededAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringProps.property.addThrottledRecordsAlarm">addThrottledRecordsAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisDataStreamMonitoringProps.property.addWriteProvisionedThroughputExceededAlarm">addWriteProvisionedThroughputExceededAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}</code> | *No description.* |
 
 ---
 
@@ -17541,6 +17577,36 @@ public readonly addPutRecordsThrottledAlarm: {[ key: string ]: RecordsThrottledT
 
 ---
 
+##### `addReadProvisionedThroughputExceededAlarm`<sup>Optional</sup> <a name="addReadProvisionedThroughputExceededAlarm" id="cdk-monitoring-constructs.KinesisDataStreamMonitoringProps.property.addReadProvisionedThroughputExceededAlarm"></a>
+
+```typescript
+public readonly addReadProvisionedThroughputExceededAlarm: {[ key: string ]: RecordsThrottledThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}
+
+---
+
+##### `addThrottledRecordsAlarm`<sup>Optional</sup> <a name="addThrottledRecordsAlarm" id="cdk-monitoring-constructs.KinesisDataStreamMonitoringProps.property.addThrottledRecordsAlarm"></a>
+
+```typescript
+public readonly addThrottledRecordsAlarm: {[ key: string ]: RecordsThrottledThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}
+
+---
+
+##### `addWriteProvisionedThroughputExceededAlarm`<sup>Optional</sup> <a name="addWriteProvisionedThroughputExceededAlarm" id="cdk-monitoring-constructs.KinesisDataStreamMonitoringProps.property.addWriteProvisionedThroughputExceededAlarm"></a>
+
+```typescript
+public readonly addWriteProvisionedThroughputExceededAlarm: {[ key: string ]: RecordsThrottledThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}
+
+---
+
 ### KinesisFirehoseMetricFactoryProps <a name="KinesisFirehoseMetricFactoryProps" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactoryProps"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactoryProps.Initializer"></a>
@@ -17590,6 +17656,7 @@ const kinesisFirehoseMonitoringOptions: KinesisFirehoseMonitoringOptions = { ...
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMonitoringOptions.property.addToDetailDashboard">addToDetailDashboard</a></code> | <code>boolean</code> | Flag indicating if the widgets should be added to detailed dashboard. |
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMonitoringOptions.property.addToSummaryDashboard">addToSummaryDashboard</a></code> | <code>boolean</code> | Flag indicating if the widgets should be added to summary dashboard. |
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMonitoringOptions.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.KinesisFirehoseMonitoringOptions.property.addRecordsThrottledAlarm">addRecordsThrottledAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}</code> | *No description.* |
 
 ---
 
@@ -17691,6 +17758,16 @@ Calls provided function to process all alarms created.
 
 ---
 
+##### `addRecordsThrottledAlarm`<sup>Optional</sup> <a name="addRecordsThrottledAlarm" id="cdk-monitoring-constructs.KinesisFirehoseMonitoringOptions.property.addRecordsThrottledAlarm"></a>
+
+```typescript
+public readonly addRecordsThrottledAlarm: {[ key: string ]: RecordsThrottledThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}
+
+---
+
 ### KinesisFirehoseMonitoringProps <a name="KinesisFirehoseMonitoringProps" id="cdk-monitoring-constructs.KinesisFirehoseMonitoringProps"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.KinesisFirehoseMonitoringProps.Initializer"></a>
@@ -17713,6 +17790,7 @@ const kinesisFirehoseMonitoringProps: KinesisFirehoseMonitoringProps = { ... }
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMonitoringProps.property.addToDetailDashboard">addToDetailDashboard</a></code> | <code>boolean</code> | Flag indicating if the widgets should be added to detailed dashboard. |
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMonitoringProps.property.addToSummaryDashboard">addToSummaryDashboard</a></code> | <code>boolean</code> | Flag indicating if the widgets should be added to summary dashboard. |
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMonitoringProps.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.KinesisFirehoseMonitoringProps.property.addRecordsThrottledAlarm">addRecordsThrottledAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}</code> | *No description.* |
 
 ---
 
@@ -17824,6 +17902,16 @@ Calls provided function to process all alarms created.
 
 ---
 
+##### `addRecordsThrottledAlarm`<sup>Optional</sup> <a name="addRecordsThrottledAlarm" id="cdk-monitoring-constructs.KinesisFirehoseMonitoringProps.property.addRecordsThrottledAlarm"></a>
+
+```typescript
+public readonly addRecordsThrottledAlarm: {[ key: string ]: RecordsThrottledThreshold};
+```
+
+- *Type:* {[ key: string ]: <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>}
+
+---
+
 ### LambdaFunctionMetricFactoryProps <a name="LambdaFunctionMetricFactoryProps" id="cdk-monitoring-constructs.LambdaFunctionMetricFactoryProps"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.LambdaFunctionMetricFactoryProps.Initializer"></a>
@@ -40010,6 +40098,8 @@ new KinesisAlarmFactory(alarmFactory: AlarmFactory)
 | **Name** | **Description** |
 | --- | --- |
 | <code><a href="#cdk-monitoring-constructs.KinesisAlarmFactory.addIteratorMaxAgeAlarm">addIteratorMaxAgeAlarm</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisAlarmFactory.addProvisionedReadThroughputExceededAlarm">addProvisionedReadThroughputExceededAlarm</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisAlarmFactory.addProvisionedWriteThroughputExceededAlarm">addProvisionedWriteThroughputExceededAlarm</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisAlarmFactory.addPutRecordsFailedAlarm">addPutRecordsFailedAlarm</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisAlarmFactory.addPutRecordsThrottledAlarm">addPutRecordsThrottledAlarm</a></code> | *No description.* |
 
@@ -40039,6 +40129,54 @@ public addIteratorMaxAgeAlarm(metric: Metric | MathExpression, props: MaxIterato
 
 ---
 
+##### `addProvisionedReadThroughputExceededAlarm` <a name="addProvisionedReadThroughputExceededAlarm" id="cdk-monitoring-constructs.KinesisAlarmFactory.addProvisionedReadThroughputExceededAlarm"></a>
+
+```typescript
+public addProvisionedReadThroughputExceededAlarm(metric: Metric | MathExpression, props: RecordsThrottledThreshold, disambiguator: string): AlarmWithAnnotation
+```
+
+###### `metric`<sup>Required</sup> <a name="metric" id="cdk-monitoring-constructs.KinesisAlarmFactory.addProvisionedReadThroughputExceededAlarm.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.KinesisAlarmFactory.addProvisionedReadThroughputExceededAlarm.parameter.props"></a>
+
+- *Type:* <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>
+
+---
+
+###### `disambiguator`<sup>Required</sup> <a name="disambiguator" id="cdk-monitoring-constructs.KinesisAlarmFactory.addProvisionedReadThroughputExceededAlarm.parameter.disambiguator"></a>
+
+- *Type:* string
+
+---
+
+##### `addProvisionedWriteThroughputExceededAlarm` <a name="addProvisionedWriteThroughputExceededAlarm" id="cdk-monitoring-constructs.KinesisAlarmFactory.addProvisionedWriteThroughputExceededAlarm"></a>
+
+```typescript
+public addProvisionedWriteThroughputExceededAlarm(metric: Metric | MathExpression, props: RecordsThrottledThreshold, disambiguator: string): AlarmWithAnnotation
+```
+
+###### `metric`<sup>Required</sup> <a name="metric" id="cdk-monitoring-constructs.KinesisAlarmFactory.addProvisionedWriteThroughputExceededAlarm.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.KinesisAlarmFactory.addProvisionedWriteThroughputExceededAlarm.parameter.props"></a>
+
+- *Type:* <a href="#cdk-monitoring-constructs.RecordsThrottledThreshold">RecordsThrottledThreshold</a>
+
+---
+
+###### `disambiguator`<sup>Required</sup> <a name="disambiguator" id="cdk-monitoring-constructs.KinesisAlarmFactory.addProvisionedWriteThroughputExceededAlarm.parameter.disambiguator"></a>
+
+- *Type:* string
+
+---
+
 ##### `addPutRecordsFailedAlarm` <a name="addPutRecordsFailedAlarm" id="cdk-monitoring-constructs.KinesisAlarmFactory.addPutRecordsFailedAlarm"></a>
 
 ```typescript
@@ -40761,16 +40899,29 @@ new KinesisFirehoseMetricFactory(metricFactory: MetricFactory, props: KinesisFir
 
 | **Name** | **Description** |
 | --- | --- |
+| <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricBytesPerSecondLimit">metricBytesPerSecondLimit</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricFailedConversionCount">metricFailedConversionCount</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricIncomingBytes">metricIncomingBytes</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricIncomingBytesToLimitRate">metricIncomingBytesToLimitRate</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricIncomingPutRequests">metricIncomingPutRequests</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricIncomingPutRequestsToLimitRate">metricIncomingPutRequestsToLimitRate</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricIncomingRecordCount">metricIncomingRecordCount</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricIncomingRecordsToLimitRate">metricIncomingRecordsToLimitRate</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricPutRecordBatchLatencyP90InMillis">metricPutRecordBatchLatencyP90InMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricPutRecordLatencyP90InMillis">metricPutRecordLatencyP90InMillis</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricPutRequestsPerSecondLimit">metricPutRequestsPerSecondLimit</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricRecordsPerSecondLimit">metricRecordsPerSecondLimit</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricSuccessfulConversionCount">metricSuccessfulConversionCount</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricThrottledRecordCount">metricThrottledRecordCount</a></code> | *No description.* |
 
 ---
 
+##### `metricBytesPerSecondLimit` <a name="metricBytesPerSecondLimit" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricBytesPerSecondLimit"></a>
+
+```typescript
+public metricBytesPerSecondLimit(): Metric | MathExpression
+```
+
 ##### `metricFailedConversionCount` <a name="metricFailedConversionCount" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricFailedConversionCount"></a>
 
 ```typescript
@@ -40783,12 +40934,36 @@ public metricFailedConversionCount(): Metric | MathExpression
 public metricIncomingBytes(): Metric | MathExpression
 ```
 
+##### `metricIncomingBytesToLimitRate` <a name="metricIncomingBytesToLimitRate" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricIncomingBytesToLimitRate"></a>
+
+```typescript
+public metricIncomingBytesToLimitRate(): Metric | MathExpression
+```
+
+##### `metricIncomingPutRequests` <a name="metricIncomingPutRequests" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricIncomingPutRequests"></a>
+
+```typescript
+public metricIncomingPutRequests(): Metric | MathExpression
+```
+
+##### `metricIncomingPutRequestsToLimitRate` <a name="metricIncomingPutRequestsToLimitRate" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricIncomingPutRequestsToLimitRate"></a>
+
+```typescript
+public metricIncomingPutRequestsToLimitRate(): Metric | MathExpression
+```
+
 ##### `metricIncomingRecordCount` <a name="metricIncomingRecordCount" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricIncomingRecordCount"></a>
 
 ```typescript
 public metricIncomingRecordCount(): Metric | MathExpression
 ```
 
+##### `metricIncomingRecordsToLimitRate` <a name="metricIncomingRecordsToLimitRate" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricIncomingRecordsToLimitRate"></a>
+
+```typescript
+public metricIncomingRecordsToLimitRate(): Metric | MathExpression
+```
+
 ##### `metricPutRecordBatchLatencyP90InMillis` <a name="metricPutRecordBatchLatencyP90InMillis" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricPutRecordBatchLatencyP90InMillis"></a>
 
 ```typescript
@@ -40801,6 +40976,18 @@ public metricPutRecordBatchLatencyP90InMillis(): Metric | MathExpression
 public metricPutRecordLatencyP90InMillis(): Metric | MathExpression
 ```
 
+##### `metricPutRequestsPerSecondLimit` <a name="metricPutRequestsPerSecondLimit" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricPutRequestsPerSecondLimit"></a>
+
+```typescript
+public metricPutRequestsPerSecondLimit(): Metric | MathExpression
+```
+
+##### `metricRecordsPerSecondLimit` <a name="metricRecordsPerSecondLimit" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricRecordsPerSecondLimit"></a>
+
+```typescript
+public metricRecordsPerSecondLimit(): Metric | MathExpression
+```
+
 ##### `metricSuccessfulConversionCount` <a name="metricSuccessfulConversionCount" id="cdk-monitoring-constructs.KinesisFirehoseMetricFactory.metricSuccessfulConversionCount"></a>
 
 ```typescript
diff --git a/README.md b/README.md
index cfac50e4..2ca5033a 100644
--- a/README.md
+++ b/README.md
@@ -82,8 +82,8 @@ You can also browse the documentation at https://constructs.dev/packages/cdk-mon
 | AWS ElastiCache (`.monitorElastiCacheCluster()`) | CPU/memory usage, evictions and connections | | |
 | AWS Glue (`.monitorGlueJob()`) | Traffic, job status, memory/CPU usage | | |
 | AWS Kinesis Data Analytics (`.monitorKinesisDataAnalytics`) | Up/Downtime, CPU/memory usage, KPU usage, checkpoint metrics, and garbage collection metrics | Downtime | |
-| AWS Kinesis Data Stream (`.monitorKinesisDataStream()`) | Put/Get/Incoming Record/s and Throttling | Iterator max age | |
-| AWS Kinesis Firehose (`.monitorKinesisFirehose()`) | Number of records, requests, latency | | |
+| AWS Kinesis Data Stream (`.monitorKinesisDataStream()`) | Put/Get/Incoming Record/s and Throttling | Throttling, iterator max age | |
+| AWS Kinesis Firehose (`.monitorKinesisFirehose()`) | Number of records, requests, latency, throttling | | |
 | 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 | |
diff --git a/lib/common/monitoring/alarms/KinesisAlarmFactory.ts b/lib/common/monitoring/alarms/KinesisAlarmFactory.ts
index 01d56348..e5a37309 100644
--- a/lib/common/monitoring/alarms/KinesisAlarmFactory.ts
+++ b/lib/common/monitoring/alarms/KinesisAlarmFactory.ts
@@ -82,11 +82,51 @@ export class KinesisAlarmFactory {
         ComparisonOperator.GREATER_THAN_THRESHOLD,
       ...props,
       disambiguator,
-      threshold: threshold,
+      threshold,
       alarmNameSuffix: "PutRecordsFailed",
       alarmDescription: `Number of failed PutRecords exceeded threshold of ${threshold}`,
       // we will dedupe any kind of message count issue to the same ticket
       alarmDedupeStringSuffix: "PutRecordsFailed",
     });
   }
+
+  addProvisionedReadThroughputExceededAlarm(
+    metric: MetricWithAlarmSupport,
+    props: RecordsThrottledThreshold,
+    disambiguator: string
+  ) {
+    const threshold = props.maxRecordsThrottledThreshold;
+    return this.alarmFactory.addAlarm(metric, {
+      treatMissingData:
+        props.treatMissingDataOverride ?? TreatMissingData.NOT_BREACHING,
+      comparisonOperator:
+        props.comparisonOperatorOverride ??
+        ComparisonOperator.GREATER_THAN_THRESHOLD,
+      ...props,
+      disambiguator,
+      threshold,
+      alarmNameSuffix: "ReadThroughputExceeded",
+      alarmDescription: `Number of records resulting in read throughput capacity throttling reached the threshold of ${threshold}.`,
+    });
+  }
+
+  addProvisionedWriteThroughputExceededAlarm(
+    metric: MetricWithAlarmSupport,
+    props: RecordsThrottledThreshold,
+    disambiguator: string
+  ) {
+    const threshold = props.maxRecordsThrottledThreshold;
+    return this.alarmFactory.addAlarm(metric, {
+      treatMissingData:
+        props.treatMissingDataOverride ?? TreatMissingData.NOT_BREACHING,
+      comparisonOperator:
+        props.comparisonOperatorOverride ??
+        ComparisonOperator.GREATER_THAN_THRESHOLD,
+      ...props,
+      disambiguator,
+      threshold,
+      alarmNameSuffix: "WriteThroughputExceeded",
+      alarmDescription: `Number of records resulting in write throughput capacity throttling reached the threshold of ${threshold}.`,
+    });
+  }
 }
diff --git a/lib/monitoring/aws-kinesis/KinesisDataStreamMonitoring.ts b/lib/monitoring/aws-kinesis/KinesisDataStreamMonitoring.ts
index 34111345..b357caf7 100644
--- a/lib/monitoring/aws-kinesis/KinesisDataStreamMonitoring.ts
+++ b/lib/monitoring/aws-kinesis/KinesisDataStreamMonitoring.ts
@@ -40,6 +40,15 @@ export interface KinesisDataStreamMonitoringOptions
     RecordsThrottledThreshold
   >;
   readonly addPutRecordsFailedAlarm?: Record<string, RecordsFailedThreshold>;
+  readonly addThrottledRecordsAlarm?: Record<string, RecordsThrottledThreshold>;
+  readonly addReadProvisionedThroughputExceededAlarm?: Record<
+    string,
+    RecordsThrottledThreshold
+  >;
+  readonly addWriteProvisionedThroughputExceededAlarm?: Record<
+    string,
+    RecordsThrottledThreshold
+  >;
 }
 
 export interface KinesisDataStreamMonitoringProps
@@ -52,6 +61,7 @@ export class KinesisDataStreamMonitoring extends Monitoring {
 
   protected readonly kinesisAlarmFactory: KinesisAlarmFactory;
   protected readonly ageAnnotations: HorizontalAnnotation[];
+  protected readonly provisionedCapacityAnnotations: HorizontalAnnotation[];
   protected readonly recordCountAnnotations: HorizontalAnnotation[];
 
   protected readonly metricGetRecordSumBytes: MetricWithAlarmSupport;
@@ -90,6 +100,7 @@ export class KinesisDataStreamMonitoring extends Monitoring {
       namingStrategy.resolveAlarmFriendlyName()
     );
     this.kinesisAlarmFactory = new KinesisAlarmFactory(alarmFactory);
+    this.provisionedCapacityAnnotations = [];
     this.ageAnnotations = [];
     this.recordCountAnnotations = [];
 
@@ -162,6 +173,30 @@ export class KinesisDataStreamMonitoring extends Monitoring {
       this.recordCountAnnotations.push(createdAlarm.annotation);
       this.addAlarm(createdAlarm);
     }
+    for (const disambiguator in props.addReadProvisionedThroughputExceededAlarm) {
+      const alarmProps =
+        props.addReadProvisionedThroughputExceededAlarm[disambiguator];
+      const createdAlarm =
+        this.kinesisAlarmFactory.addProvisionedReadThroughputExceededAlarm(
+          this.readProvisionedThroughputExceededMetric,
+          alarmProps,
+          disambiguator
+        );
+      this.provisionedCapacityAnnotations.push(createdAlarm.annotation);
+      this.addAlarm(createdAlarm);
+    }
+    for (const disambiguator in props.addWriteProvisionedThroughputExceededAlarm) {
+      const alarmProps =
+        props.addWriteProvisionedThroughputExceededAlarm[disambiguator];
+      const createdAlarm =
+        this.kinesisAlarmFactory.addProvisionedWriteThroughputExceededAlarm(
+          this.writeProvisionedThroughputExceededMetric,
+          alarmProps,
+          disambiguator
+        );
+      this.provisionedCapacityAnnotations.push(createdAlarm.annotation);
+      this.addAlarm(createdAlarm);
+    }
 
     props.useCreatedAlarms?.consume(this.createdAlarms());
   }
@@ -173,7 +208,7 @@ export class KinesisDataStreamMonitoring extends Monitoring {
         this.createIncomingDataWidget(QuarterWidth, DefaultSummaryWidgetHeight),
         this.createIteratorAgeWidget(QuarterWidth, DefaultSummaryWidgetHeight),
         this.createLatencyWidget(QuarterWidth, DefaultSummaryWidgetHeight),
-        this.createThrottleWidget(QuarterWidth, DefaultSummaryWidgetHeight)
+        this.createCapacityWidget(QuarterWidth, DefaultSummaryWidgetHeight)
       ),
     ];
   }
@@ -185,7 +220,7 @@ export class KinesisDataStreamMonitoring extends Monitoring {
         this.createIncomingDataWidget(QuarterWidth, DefaultGraphWidgetHeight),
         this.createIteratorAgeWidget(QuarterWidth, DefaultGraphWidgetHeight),
         this.createLatencyWidget(QuarterWidth, DefaultGraphWidgetHeight),
-        this.createThrottleWidget(QuarterWidth, DefaultGraphWidgetHeight)
+        this.createCapacityWidget(QuarterWidth, DefaultGraphWidgetHeight)
       ),
       this.createFirstAdditionalRow(),
       this.createSecondAdditionalRow(),
@@ -248,16 +283,17 @@ export class KinesisDataStreamMonitoring extends Monitoring {
     });
   }
 
-  protected createThrottleWidget(width: number, height: number) {
+  protected createCapacityWidget(width: number, height: number) {
     return new GraphWidget({
       width,
       height,
-      title: "Throttles",
+      title: "Provisioned Capacity Exceeded",
       left: [
         this.readProvisionedThroughputExceededMetric,
         this.writeProvisionedThroughputExceededMetric,
       ],
       leftYAxis: TimeAxisMillisFromZero,
+      leftAnnotations: this.provisionedCapacityAnnotations,
     });
   }
 
diff --git a/lib/monitoring/aws-kinesis/KinesisFirehoseMetricFactory.ts b/lib/monitoring/aws-kinesis/KinesisFirehoseMetricFactory.ts
index 0750bb4a..3fc1d80b 100644
--- a/lib/monitoring/aws-kinesis/KinesisFirehoseMetricFactory.ts
+++ b/lib/monitoring/aws-kinesis/KinesisFirehoseMetricFactory.ts
@@ -58,6 +58,17 @@ export class KinesisFirehoseMetricFactory {
     );
   }
 
+  metricIncomingPutRequests() {
+    return this.metricFactory.createMetric(
+      "IncomingPutRequests",
+      MetricStatistic.SUM,
+      "Incoming (PutRequest)",
+      this.dimensionsMap,
+      undefined,
+      FirehoseNamespace
+    );
+  }
+
   metricIncomingRecordCount() {
     return this.metricFactory.createMetric(
       "IncomingRecords",
@@ -101,4 +112,70 @@ export class KinesisFirehoseMetricFactory {
       FirehoseNamespace
     );
   }
+
+  metricIncomingBytesToLimitRate() {
+    return this.metricFactory.createMetricMath(
+      "(bytes_in / PERIOD(bytes_in)) / bytes_max",
+      {
+        bytes_in: this.metricIncomingBytes(),
+        bytes_max: this.metricBytesPerSecondLimit(),
+      },
+      "Incoming Bytes / Limit"
+    );
+  }
+
+  metricIncomingRecordsToLimitRate() {
+    return this.metricFactory.createMetricMath(
+      "(records_in / PERIOD(records_in)) / records_max",
+      {
+        records_in: this.metricIncomingRecordCount(),
+        records_max: this.metricRecordsPerSecondLimit(),
+      },
+      "Incoming Records / Limit"
+    );
+  }
+
+  metricIncomingPutRequestsToLimitRate() {
+    return this.metricFactory.createMetricMath(
+      "(requests_in / PERIOD(requests_in)) / requests_max",
+      {
+        requests_in: this.metricIncomingPutRequests(),
+        requests_max: this.metricPutRequestsPerSecondLimit(),
+      },
+      "Incoming PutRequests / Limit"
+    );
+  }
+
+  metricBytesPerSecondLimit() {
+    return this.metricFactory.createMetric(
+      "BytesPerSecondLimit",
+      MetricStatistic.AVERAGE,
+      "Incoming Bytes/s Limit",
+      undefined,
+      undefined,
+      FirehoseNamespace
+    );
+  }
+
+  metricRecordsPerSecondLimit() {
+    return this.metricFactory.createMetric(
+      "RecordsPerSecondLimit",
+      MetricStatistic.AVERAGE,
+      "Records/s Limit",
+      undefined,
+      undefined,
+      FirehoseNamespace
+    );
+  }
+
+  metricPutRequestsPerSecondLimit() {
+    return this.metricFactory.createMetric(
+      "PutRequestsPerSecondLimit",
+      MetricStatistic.AVERAGE,
+      "PutRequests/s Limit",
+      undefined,
+      undefined,
+      FirehoseNamespace
+    );
+  }
 }
diff --git a/lib/monitoring/aws-kinesis/KinesisFirehoseMonitoring.ts b/lib/monitoring/aws-kinesis/KinesisFirehoseMonitoring.ts
index 390b938c..46daedb8 100644
--- a/lib/monitoring/aws-kinesis/KinesisFirehoseMonitoring.ts
+++ b/lib/monitoring/aws-kinesis/KinesisFirehoseMonitoring.ts
@@ -1,4 +1,8 @@
-import { GraphWidget, IWidget } from "aws-cdk-lib/aws-cloudwatch";
+import {
+  GraphWidget,
+  HorizontalAnnotation,
+  IWidget,
+} from "aws-cdk-lib/aws-cloudwatch";
 
 import {
   BaseMonitoringProps,
@@ -6,10 +10,13 @@ import {
   DefaultGraphWidgetHeight,
   DefaultSummaryWidgetHeight,
   HalfWidth,
+  KinesisAlarmFactory,
   MetricWithAlarmSupport,
   Monitoring,
   MonitoringScope,
-  ThirdWidth,
+  QuarterWidth,
+  RateAxisFromZero,
+  RecordsThrottledThreshold,
   TimeAxisMillisFromZero,
 } from "../../common";
 import {
@@ -21,7 +28,9 @@ import {
   KinesisFirehoseMetricFactoryProps,
 } from "./KinesisFirehoseMetricFactory";
 
-export interface KinesisFirehoseMonitoringOptions extends BaseMonitoringProps {}
+export interface KinesisFirehoseMonitoringOptions extends BaseMonitoringProps {
+  readonly addRecordsThrottledAlarm?: Record<string, RecordsThrottledThreshold>;
+}
 
 export interface KinesisFirehoseMonitoringProps
   extends KinesisFirehoseMetricFactoryProps,
@@ -31,6 +40,9 @@ export class KinesisFirehoseMonitoring extends Monitoring {
   protected readonly title: string;
   protected readonly streamUrl?: string;
 
+  protected readonly kinesisAlarmFactory: KinesisAlarmFactory;
+  protected readonly recordCountAnnotations: HorizontalAnnotation[];
+
   protected readonly incomingBytesMetric: MetricWithAlarmSupport;
   protected readonly incomingRecordsMetric: MetricWithAlarmSupport;
   protected readonly throttledRecordsMetric: MetricWithAlarmSupport;
@@ -38,6 +50,9 @@ export class KinesisFirehoseMonitoring extends Monitoring {
   protected readonly failedConversionMetric: MetricWithAlarmSupport;
   protected readonly putRecordLatency: MetricWithAlarmSupport;
   protected readonly putRecordBatchLatency: MetricWithAlarmSupport;
+  protected readonly incomingBytesToLimitRate: MetricWithAlarmSupport;
+  protected readonly incomingRecordsToLimitRate: MetricWithAlarmSupport;
+  protected readonly incomingPutRequestsToLimitRate: MetricWithAlarmSupport;
 
   constructor(scope: MonitoringScope, props: KinesisFirehoseMonitoringProps) {
     super(scope);
@@ -55,6 +70,12 @@ export class KinesisFirehoseMonitoring extends Monitoring {
       scope.createMetricFactory(),
       props
     );
+    const alarmFactory = this.createAlarmFactory(
+      namingStrategy.resolveAlarmFriendlyName()
+    );
+    this.kinesisAlarmFactory = new KinesisAlarmFactory(alarmFactory);
+    this.recordCountAnnotations = [];
+
     this.incomingBytesMetric = metricFactory.metricIncomingBytes();
     this.incomingRecordsMetric = metricFactory.metricIncomingRecordCount();
     this.throttledRecordsMetric = metricFactory.metricThrottledRecordCount();
@@ -64,6 +85,25 @@ export class KinesisFirehoseMonitoring extends Monitoring {
     this.putRecordLatency = metricFactory.metricPutRecordLatencyP90InMillis();
     this.putRecordBatchLatency =
       metricFactory.metricPutRecordBatchLatencyP90InMillis();
+    this.incomingBytesToLimitRate =
+      metricFactory.metricIncomingBytesToLimitRate();
+    this.incomingRecordsToLimitRate =
+      metricFactory.metricIncomingRecordsToLimitRate();
+    this.incomingPutRequestsToLimitRate =
+      metricFactory.metricIncomingPutRequestsToLimitRate();
+
+    for (const disambiguator in props.addRecordsThrottledAlarm) {
+      const alarmProps = props.addRecordsThrottledAlarm[disambiguator];
+      const createdAlarm = this.kinesisAlarmFactory.addPutRecordsThrottledAlarm(
+        this.throttledRecordsMetric,
+        alarmProps,
+        disambiguator
+      );
+      this.recordCountAnnotations.push(createdAlarm.annotation);
+      this.addAlarm(createdAlarm);
+    }
+
+    props.useCreatedAlarms?.consume(this.createdAlarms());
   }
 
   summaryWidgets(): IWidget[] {
@@ -77,9 +117,10 @@ export class KinesisFirehoseMonitoring extends Monitoring {
   widgets(): IWidget[] {
     return [
       this.createTitleWidget(),
-      this.createIncomingRecordWidget(ThirdWidth, DefaultGraphWidgetHeight),
-      this.createLatencyWidget(ThirdWidth, DefaultGraphWidgetHeight),
-      this.createConversionWidget(ThirdWidth, DefaultGraphWidgetHeight),
+      this.createIncomingRecordWidget(QuarterWidth, DefaultGraphWidgetHeight),
+      this.createLatencyWidget(QuarterWidth, DefaultGraphWidgetHeight),
+      this.createConversionWidget(QuarterWidth, DefaultGraphWidgetHeight),
+      this.createLimitWidget(QuarterWidth, DefaultGraphWidgetHeight),
     ];
   }
 
@@ -98,6 +139,7 @@ export class KinesisFirehoseMonitoring extends Monitoring {
       title: "Records",
       left: [this.incomingRecordsMetric, this.throttledRecordsMetric],
       leftYAxis: CountAxisFromZero,
+      leftAnnotations: this.recordCountAnnotations,
     });
   }
 
@@ -120,4 +162,19 @@ export class KinesisFirehoseMonitoring extends Monitoring {
       leftYAxis: CountAxisFromZero,
     });
   }
+
+  protected createLimitWidget(width: number, height: number) {
+    return new GraphWidget({
+      width,
+      height,
+      title: "Limits (rate)",
+      left: [
+        this.incomingBytesToLimitRate.with({ label: "Bytes" }),
+        this.incomingRecordsToLimitRate.with({ label: "Records" }),
+        this.incomingPutRequestsToLimitRate.with({ label: "PutRequests" }),
+      ],
+      leftYAxis: RateAxisFromZero,
+      leftAnnotations: [{ value: 1, label: "100% usage" }],
+    });
+  }
 }


Test patch:
diff --git a/test/facade/__snapshots__/MonitoringAspect.test.ts.snap b/test/facade/__snapshots__/MonitoringAspect.test.ts.snap
index 475baeb1..20d51090 100644
--- a/test/facade/__snapshots__/MonitoringAspect.test.ts.snap
+++ b/test/facade/__snapshots__/MonitoringAspect.test.ts.snap
@@ -3775,7 +3775,7 @@ Object {
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Latency\\",\\"StreamName\\",{\\"label\\":\\"GetRecords\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Latency\\",\\"StreamName\\",{\\"label\\":\\"PutRecord\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Latency\\",\\"StreamName\\",{\\"label\\":\\"PutRecords\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Throttles\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Latency\\",\\"StreamName\\",{\\"label\\":\\"GetRecords\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Latency\\",\\"StreamName\\",{\\"label\\":\\"PutRecord\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Latency\\",\\"StreamName\\",{\\"label\\":\\"PutRecords\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Provisioned Capacity Exceeded\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -3825,7 +3825,7 @@ Object {
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Latency\\",\\"StreamName\\",{\\"label\\":\\"GetRecords\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Latency\\",\\"StreamName\\",{\\"label\\":\\"PutRecord\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Latency\\",\\"StreamName\\",{\\"label\\":\\"PutRecords\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Throttles\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Latency\\",\\"StreamName\\",{\\"label\\":\\"GetRecords\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Latency\\",\\"StreamName\\",{\\"label\\":\\"PutRecord\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Latency\\",\\"StreamName\\",{\\"label\\":\\"PutRecords\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Provisioned Capacity Exceeded\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -3921,19 +3921,23 @@ Object {
               Object {
                 "Ref": "AWS::Region",
               },
-              "#/details/undefined/monitoring)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Records\\",\\"region\\":\\"",
+              "#/details/undefined/monitoring)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Records\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/Firehose\\",\\"IncomingRecords\\",{\\"label\\":\\"Incoming\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Firehose\\",\\"ThrottledRecords\\",{\\"label\\":\\"Throttled\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":5,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency (P90)\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/Firehose\\",\\"IncomingRecords\\",{\\"label\\":\\"Incoming\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Firehose\\",\\"ThrottledRecords\\",{\\"label\\":\\"Throttled\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency (P90)\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/Firehose\\",\\"PutRecord.Latency\\",{\\"label\\":\\"PutRecord P90\\",\\"stat\\":\\"p90\\"}],[\\"AWS/Firehose\\",\\"PutRecordBatch.Latency\\",{\\"label\\":\\"PutRecordBatch P90\\",\\"stat\\":\\"p90\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":5,\\"x\\":16,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Conversions\\",\\"region\\":\\"",
+              "\\",\\"metrics\\":[[\\"AWS/Firehose\\",\\"PutRecord.Latency\\",{\\"label\\":\\"PutRecord P90\\",\\"stat\\":\\"p90\\"}],[\\"AWS/Firehose\\",\\"PutRecordBatch.Latency\\",{\\"label\\":\\"PutRecordBatch P90\\",\\"stat\\":\\"p90\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Conversions\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/Firehose\\",\\"SucceedConversion.Records\\",{\\"label\\":\\"Succeed\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Firehose\\",\\"FailedConversion.Records\\",{\\"label\\":\\"Failed\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}}]}",
+              "\\",\\"metrics\\":[[\\"AWS/Firehose\\",\\"SucceedConversion.Records\\",{\\"label\\":\\"Succeed\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Firehose\\",\\"FailedConversion.Records\\",{\\"label\\":\\"Failed\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Limits (rate)\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[{\\"label\\":\\"Bytes\\",\\"expression\\":\\"(bytes_in / PERIOD(bytes_in)) / bytes_max\\"}],[\\"AWS/Firehose\\",\\"IncomingBytes\\",{\\"label\\":\\"Incoming (bytes)\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"bytes_in\\"}],[\\"AWS/Firehose\\",\\"BytesPerSecondLimit\\",{\\"label\\":\\"Incoming Bytes/s Limit\\",\\"visible\\":false,\\"id\\":\\"bytes_max\\"}],[{\\"label\\":\\"Records\\",\\"expression\\":\\"(records_in / PERIOD(records_in)) / records_max\\"}],[\\"AWS/Firehose\\",\\"IncomingRecords\\",{\\"label\\":\\"Incoming\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"records_in\\"}],[\\"AWS/Firehose\\",\\"RecordsPerSecondLimit\\",{\\"label\\":\\"Records/s Limit\\",\\"visible\\":false,\\"id\\":\\"records_max\\"}],[{\\"label\\":\\"PutRequests\\",\\"expression\\":\\"(requests_in / PERIOD(requests_in)) / requests_max\\"}],[\\"AWS/Firehose\\",\\"IncomingPutRequests\\",{\\"label\\":\\"Incoming (PutRequest)\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests_in\\"}],[\\"AWS/Firehose\\",\\"PutRequestsPerSecondLimit\\",{\\"label\\":\\"PutRequests/s Limit\\",\\"visible\\":false,\\"id\\":\\"requests_max\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"value\\":1,\\"label\\":\\"100% usage\\",\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}}]}",
             ],
           ],
         },
diff --git a/test/monitoring/aws-kinesis/KinesisDataStreamMonitoring.test.ts b/test/monitoring/aws-kinesis/KinesisDataStreamMonitoring.test.ts
index e8e99552..7d30f868 100644
--- a/test/monitoring/aws-kinesis/KinesisDataStreamMonitoring.test.ts
+++ b/test/monitoring/aws-kinesis/KinesisDataStreamMonitoring.test.ts
@@ -2,6 +2,7 @@ import { Stack } from "aws-cdk-lib";
 import { Template } from "aws-cdk-lib/assertions";
 
 import { KinesisDataStreamMonitoring } from "../../../lib";
+import { addMonitoringDashboardsToStack } from "../../utils/SnapshotUtil";
 import { TestMonitoringScope } from "../TestMonitoringScope";
 
 test("snapshot test for stream: no alarms", () => {
@@ -9,10 +10,11 @@ test("snapshot test for stream: no alarms", () => {
 
   const scope = new TestMonitoringScope(stack, "Scope");
 
-  new KinesisDataStreamMonitoring(scope, {
+  const monitoring = new KinesisDataStreamMonitoring(scope, {
     streamName: "my-kinesis-data-stream",
   });
 
+  addMonitoringDashboardsToStack(stack, monitoring);
   expect(Template.fromStack(stack)).toMatchSnapshot();
 });
 
@@ -23,7 +25,7 @@ test("snapshot test for stream: all alarms", () => {
 
   let numAlarmsCreated = 0;
 
-  new KinesisDataStreamMonitoring(scope, {
+  const monitoring = new KinesisDataStreamMonitoring(scope, {
     streamName: "my-kinesis-data-stream",
     addIteratorMaxAgeAlarm: {
       Warning: {
@@ -40,6 +42,16 @@ test("snapshot test for stream: all alarms", () => {
         maxRecordsFailedThreshold: 5,
       },
     },
+    addReadProvisionedThroughputExceededAlarm: {
+      Critical: {
+        maxRecordsThrottledThreshold: 0,
+      },
+    },
+    addWriteProvisionedThroughputExceededAlarm: {
+      Critical: {
+        maxRecordsThrottledThreshold: 0,
+      },
+    },
     useCreatedAlarms: {
       consume(alarms) {
         numAlarmsCreated = alarms.length;
@@ -47,6 +59,7 @@ test("snapshot test for stream: all alarms", () => {
     },
   });
 
-  expect(numAlarmsCreated).toStrictEqual(3);
+  expect(numAlarmsCreated).toStrictEqual(5);
+  addMonitoringDashboardsToStack(stack, monitoring);
   expect(Template.fromStack(stack)).toMatchSnapshot();
 });
diff --git a/test/monitoring/aws-kinesis/KinesisFirehoseMonitoring.test.ts b/test/monitoring/aws-kinesis/KinesisFirehoseMonitoring.test.ts
index ae3a72d2..182d85a6 100644
--- a/test/monitoring/aws-kinesis/KinesisFirehoseMonitoring.test.ts
+++ b/test/monitoring/aws-kinesis/KinesisFirehoseMonitoring.test.ts
@@ -4,7 +4,7 @@ import { Template } from "aws-cdk-lib/assertions";
 import { KinesisFirehoseMonitoring } from "../../../lib";
 import { TestMonitoringScope } from "../TestMonitoringScope";
 
-test("snapshot test", () => {
+test("snapshot test: no alarms", () => {
   const stack = new Stack();
 
   const scope = new TestMonitoringScope(stack, "Scope");
@@ -15,3 +15,28 @@ test("snapshot test", () => {
 
   expect(Template.fromStack(stack)).toMatchSnapshot();
 });
+
+test("snapshot test: all alarms", () => {
+  const stack = new Stack();
+
+  const scope = new TestMonitoringScope(stack, "Scope");
+
+  let numAlarmsCreated = 0;
+
+  new KinesisFirehoseMonitoring(scope, {
+    deliveryStreamName: "my-firehose-delivery-stream",
+    addRecordsThrottledAlarm: {
+      Critical: {
+        maxRecordsThrottledThreshold: 5,
+      },
+    },
+    useCreatedAlarms: {
+      consume(alarms) {
+        numAlarmsCreated = alarms.length;
+      },
+    },
+  });
+
+  expect(numAlarmsCreated).toStrictEqual(1);
+  expect(Template.fromStack(stack)).toMatchSnapshot();
+});
diff --git a/test/monitoring/aws-kinesis/__snapshots__/KinesisDataStreamMonitoring.test.ts.snap b/test/monitoring/aws-kinesis/__snapshots__/KinesisDataStreamMonitoring.test.ts.snap
index 5e6d11c2..ebf31985 100644
--- a/test/monitoring/aws-kinesis/__snapshots__/KinesisDataStreamMonitoring.test.ts.snap
+++ b/test/monitoring/aws-kinesis/__snapshots__/KinesisDataStreamMonitoring.test.ts.snap
@@ -10,6 +10,115 @@ Object {
     },
   },
   "Resources": Object {
+    "Alarm7103F465": Object {
+      "Properties": Object {
+        "DashboardBody": Object {
+          "Fn::Join": Array [
+            "",
+            Array [
+              "{\\"widgets\\":[{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":4,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"annotations\\":{\\"alarms\\":[\\"",
+              Object {
+                "Fn::GetAtt": Array [
+                  "ScopeTestmykinesisdatastreamIteratorAgeMaxWarningFF567B0D",
+                  "Arn",
+                ],
+              },
+              "\\"]},\\"yAxis\\":{}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":4,\\"x\\":6,\\"y\\":0,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"annotations\\":{\\"alarms\\":[\\"",
+              Object {
+                "Fn::GetAtt": Array [
+                  "ScopeTestmykinesisdatastreamPutRecordsThrottledCriticalA7AA987B",
+                  "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 [
+                  "ScopeTestmykinesisdatastreamPutRecordsFailedCritical0D738405",
+                  "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 [
+                  "ScopeTestmykinesisdatastreamReadThroughputExceededCriticalCC01B9CA",
+                  "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 [
+                  "ScopeTestmykinesisdatastreamWriteThroughputExceededCriticalE248115A",
+                  "Arn",
+                ],
+              },
+              "\\"]},\\"yAxis\\":{}}}]}",
+            ],
+          ],
+        },
+      },
+      "Type": "AWS::CloudWatch::Dashboard",
+    },
+    "Resource": Object {
+      "Properties": Object {
+        "DashboardBody": Object {
+          "Fn::Join": Array [
+            "",
+            Array [
+              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### Kinesis Data Stream **[my-kinesis-data-stream](https://eu-west-1.console.aws.amazon.com/kinesis/home?region=eu-west-1#/streams/details/my-kinesis-data-stream/monitoring)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Incoming\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"IncomingRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Incoming Records\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Iterator\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.IteratorAgeMilliseconds\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Iterator Age\\",\\"stat\\":\\"Maximum\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Iterator Age > 1000000 for 3 datapoints within 15 minutes\\",\\"value\\":1000000,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency (Average)\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"GetRecords\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecord\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Provisioned Capacity Exceeded\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"ReadProvisionedThroughputExceeded\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Read\\"}],[\\"AWS/Kinesis\\",\\"WriteProvisionedThroughputExceeded\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Write\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Read > 0 for 3 datapoints within 15 minutes\\",\\"value\\":0,\\"yAxis\\":\\"left\\"},{\\"label\\":\\"Write > 0 for 3 datapoints within 15 minutes\\",\\"value\\":0,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":12,\\"height\\":5,\\"x\\":0,\\"y\\":6,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Bytes\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Bytes\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"GetRecords\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Bytes\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecord\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Bytes\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":12,\\"height\\":5,\\"x\\":12,\\"y\\":6,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Successful Operations\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Success\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"GetRecords\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Success\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecord\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Success\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":24,\\"height\\":5,\\"x\\":0,\\"y\\":11,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Records\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Records\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"GetRecords.Records\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.TotalRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords.TotalRecords\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.SuccessfulRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords.SuccessfulRecords\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.FailedRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords.FailedRecords\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.ThrottledRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords.ThrottledRecords\\",\\"stat\\":\\"Sum\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"PutRecords.ThrottledRecords > 5 for 3 datapoints within 15 minutes\\",\\"value\\":5,\\"yAxis\\":\\"left\\"},{\\"label\\":\\"PutRecords.FailedRecords > 5 for 3 datapoints within 15 minutes\\",\\"value\\":5,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}}]}",
+            ],
+          ],
+        },
+      },
+      "Type": "AWS::CloudWatch::Dashboard",
+    },
     "ScopeTestmykinesisdatastreamIteratorAgeMaxWarningFF567B0D": Object {
       "Properties": Object {
         "ActionsEnabled": true,
@@ -112,6 +221,103 @@ Object {
       },
       "Type": "AWS::CloudWatch::Alarm",
     },
+    "ScopeTestmykinesisdatastreamReadThroughputExceededCriticalCC01B9CA": Object {
+      "Properties": Object {
+        "ActionsEnabled": true,
+        "AlarmDescription": "Number of records resulting in read throughput capacity throttling reached the threshold of 0.",
+        "AlarmName": "Test-my-kinesis-data-stream-ReadThroughputExceeded-Critical",
+        "ComparisonOperator": "GreaterThanThreshold",
+        "DatapointsToAlarm": 3,
+        "EvaluationPeriods": 3,
+        "Metrics": Array [
+          Object {
+            "Id": "m1",
+            "Label": "Read",
+            "MetricStat": Object {
+              "Metric": Object {
+                "Dimensions": Array [
+                  Object {
+                    "Name": "StreamName",
+                    "Value": "my-kinesis-data-stream",
+                  },
+                ],
+                "MetricName": "ReadProvisionedThroughputExceeded",
+                "Namespace": "AWS/Kinesis",
+              },
+              "Period": 300,
+              "Stat": "Average",
+            },
+            "ReturnData": true,
+          },
+        ],
+        "Threshold": 0,
+        "TreatMissingData": "notBreaching",
+      },
+      "Type": "AWS::CloudWatch::Alarm",
+    },
+    "ScopeTestmykinesisdatastreamWriteThroughputExceededCriticalE248115A": Object {
+      "Properties": Object {
+        "ActionsEnabled": true,
+        "AlarmDescription": "Number of records resulting in write throughput capacity throttling reached the threshold of 0.",
+        "AlarmName": "Test-my-kinesis-data-stream-WriteThroughputExceeded-Critical",
+        "ComparisonOperator": "GreaterThanThreshold",
+        "DatapointsToAlarm": 3,
+        "EvaluationPeriods": 3,
+        "Metrics": Array [
+          Object {
+            "Id": "m1",
+            "Label": "Write",
+            "MetricStat": Object {
+              "Metric": Object {
+                "Dimensions": Array [
+                  Object {
+                    "Name": "StreamName",
+                    "Value": "my-kinesis-data-stream",
+                  },
+                ],
+                "MetricName": "WriteProvisionedThroughputExceeded",
+                "Namespace": "AWS/Kinesis",
+              },
+              "Period": 300,
+              "Stat": "Average",
+            },
+            "ReturnData": true,
+          },
+        ],
+        "Threshold": 0,
+        "TreatMissingData": "notBreaching",
+      },
+      "Type": "AWS::CloudWatch::Alarm",
+    },
+    "Summary68521F81": Object {
+      "Properties": Object {
+        "DashboardBody": Object {
+          "Fn::Join": Array [
+            "",
+            Array [
+              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### Kinesis Data Stream **[my-kinesis-data-stream](https://eu-west-1.console.aws.amazon.com/kinesis/home?region=eu-west-1#/streams/details/my-kinesis-data-stream/monitoring)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Incoming\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"IncomingRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Incoming Records\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Iterator\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.IteratorAgeMilliseconds\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Iterator Age\\",\\"stat\\":\\"Maximum\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Iterator Age > 1000000 for 3 datapoints within 15 minutes\\",\\"value\\":1000000,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency (Average)\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"GetRecords\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecord\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Provisioned Capacity Exceeded\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"ReadProvisionedThroughputExceeded\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Read\\"}],[\\"AWS/Kinesis\\",\\"WriteProvisionedThroughputExceeded\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Write\\"}]],\\"annotations\\":{\\"horizontal\\":[{\\"label\\":\\"Read > 0 for 3 datapoints within 15 minutes\\",\\"value\\":0,\\"yAxis\\":\\"left\\"},{\\"label\\":\\"Write > 0 for 3 datapoints within 15 minutes\\",\\"value\\":0,\\"yAxis\\":\\"left\\"}]},\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}}]}",
+            ],
+          ],
+        },
+      },
+      "Type": "AWS::CloudWatch::Dashboard",
+    },
   },
   "Rules": Object {
     "CheckBootstrapVersion": Object {
@@ -152,6 +358,84 @@ Object {
       "Type": "AWS::SSM::Parameter::Value<String>",
     },
   },
+  "Resources": Object {
+    "Alarm7103F465": Object {
+      "Properties": Object {
+        "DashboardBody": "{\\"widgets\\":[]}",
+      },
+      "Type": "AWS::CloudWatch::Dashboard",
+    },
+    "Resource": Object {
+      "Properties": Object {
+        "DashboardBody": Object {
+          "Fn::Join": Array [
+            "",
+            Array [
+              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### Kinesis Data Stream **[my-kinesis-data-stream](https://eu-west-1.console.aws.amazon.com/kinesis/home?region=eu-west-1#/streams/details/my-kinesis-data-stream/monitoring)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Incoming\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"IncomingRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Incoming Records\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Iterator\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.IteratorAgeMilliseconds\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Iterator Age\\",\\"stat\\":\\"Maximum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency (Average)\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"GetRecords\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecord\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Provisioned Capacity Exceeded\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"ReadProvisionedThroughputExceeded\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Read\\"}],[\\"AWS/Kinesis\\",\\"WriteProvisionedThroughputExceeded\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Write\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":12,\\"height\\":5,\\"x\\":0,\\"y\\":6,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Bytes\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Bytes\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"GetRecords\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Bytes\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecord\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Bytes\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":12,\\"height\\":5,\\"x\\":12,\\"y\\":6,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Successful Operations\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Success\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"GetRecords\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Success\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecord\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Success\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":24,\\"height\\":5,\\"x\\":0,\\"y\\":11,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Records\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Records\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"GetRecords.Records\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.TotalRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords.TotalRecords\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.SuccessfulRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords.SuccessfulRecords\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.FailedRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords.FailedRecords\\",\\"stat\\":\\"Sum\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.ThrottledRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords.ThrottledRecords\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}}]}",
+            ],
+          ],
+        },
+      },
+      "Type": "AWS::CloudWatch::Dashboard",
+    },
+    "Summary68521F81": Object {
+      "Properties": Object {
+        "DashboardBody": Object {
+          "Fn::Join": Array [
+            "",
+            Array [
+              "{\\"widgets\\":[{\\"type\\":\\"text\\",\\"width\\":24,\\"height\\":1,\\"x\\":0,\\"y\\":0,\\"properties\\":{\\"markdown\\":\\"### Kinesis Data Stream **[my-kinesis-data-stream](https://eu-west-1.console.aws.amazon.com/kinesis/home?region=eu-west-1#/streams/details/my-kinesis-data-stream/monitoring)**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Incoming\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"IncomingRecords\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Incoming Records\\",\\"stat\\":\\"Sum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Iterator\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.IteratorAgeMilliseconds\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Iterator Age\\",\\"stat\\":\\"Maximum\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency (Average)\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"GetRecords.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"GetRecords\\"}],[\\"AWS/Kinesis\\",\\"PutRecord.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecord\\"}],[\\"AWS/Kinesis\\",\\"PutRecords.Latency\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"PutRecords\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Provisioned Capacity Exceeded\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/Kinesis\\",\\"ReadProvisionedThroughputExceeded\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Read\\"}],[\\"AWS/Kinesis\\",\\"WriteProvisionedThroughputExceeded\\",\\"StreamName\\",\\"my-kinesis-data-stream\\",{\\"label\\":\\"Write\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"ms\\",\\"showUnits\\":false}}}}]}",
+            ],
+          ],
+        },
+      },
+      "Type": "AWS::CloudWatch::Dashboard",
+    },
+  },
   "Rules": Object {
     "CheckBootstrapVersion": Object {
       "Assertions": Array [
diff --git a/test/monitoring/aws-kinesis/__snapshots__/KinesisFirehoseMonitoring.test.ts.snap b/test/monitoring/aws-kinesis/__snapshots__/KinesisFirehoseMonitoring.test.ts.snap
index dd795fe5..46baa805 100644
--- a/test/monitoring/aws-kinesis/__snapshots__/KinesisFirehoseMonitoring.test.ts.snap
+++ b/test/monitoring/aws-kinesis/__snapshots__/KinesisFirehoseMonitoring.test.ts.snap
@@ -1,6 +1,81 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`snapshot test 1`] = `
+exports[`snapshot test: all alarms 1`] = `
+Object {
+  "Parameters": Object {
+    "BootstrapVersion": Object {
+      "Default": "/cdk-bootstrap/hnb659fds/version",
+      "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]",
+      "Type": "AWS::SSM::Parameter::Value<String>",
+    },
+  },
+  "Resources": Object {
+    "ScopeTestmyfirehosedeliverystreamPutRecordsThrottledCritical95611854": Object {
+      "Properties": Object {
+        "ActionsEnabled": true,
+        "AlarmDescription": "Number of throttled PutRecords exceeded threshold of 5",
+        "AlarmName": "Test-my-firehose-delivery-stream-PutRecordsThrottled-Critical",
+        "ComparisonOperator": "GreaterThanThreshold",
+        "DatapointsToAlarm": 3,
+        "EvaluationPeriods": 3,
+        "Metrics": Array [
+          Object {
+            "Id": "m1",
+            "Label": "Throttled",
+            "MetricStat": Object {
+              "Metric": Object {
+                "Dimensions": Array [
+                  Object {
+                    "Name": "DeliveryStreamName",
+                    "Value": "my-firehose-delivery-stream",
+                  },
+                ],
+                "MetricName": "ThrottledRecords",
+                "Namespace": "AWS/Firehose",
+              },
+              "Period": 300,
+              "Stat": "Sum",
+            },
+            "ReturnData": true,
+          },
+        ],
+        "Threshold": 5,
+        "TreatMissingData": "notBreaching",
+      },
+      "Type": "AWS::CloudWatch::Alarm",
+    },
+  },
+  "Rules": Object {
+    "CheckBootstrapVersion": Object {
+      "Assertions": Array [
+        Object {
+          "Assert": Object {
+            "Fn::Not": Array [
+              Object {
+                "Fn::Contains": Array [
+                  Array [
+                    "1",
+                    "2",
+                    "3",
+                    "4",
+                    "5",
+                  ],
+                  Object {
+                    "Ref": "BootstrapVersion",
+                  },
+                ],
+              },
+            ],
+          },
+          "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.",
+        },
+      ],
+    },
+  },
+}
+`;
+
+exports[`snapshot test: no alarms 1`] = `
 Object {
   "Parameters": Object {
     "BootstrapVersion": Object {