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

Issue:
[ec2] add filter of instance IDs
As a customer:

> I would just prefer a property under .monitorEC2instances that would allow me to specify instance ID's or something along those lines. I didn't deploy the instances via an ASG, so it seems like an all or nothing approach using this construct.
[multiple] Add more ways to calculate request/error rate
The way to represent request rate should be customizable by a parameter.

Impacted constructs: API GW, API GW2, AppSync, CloudFront, Glue, Lambda, OpenSearch, Step Functions, Synthetics

Desired modes: Count, Average, per Second/Minute/Hour/Day


Discussion / hints:
If ASG is undefined, all instances are monitored and the metrics are created as a metric search expression. I think we need a different approach for a list of IDs - we do not want to use search expression, but iterate through the IDs, and create one metric for each instance separately, then combine them in a widget.


Fix patch:
diff --git a/API.md b/API.md
index 15830c47..0c721ae9 100644
--- a/API.md
+++ b/API.md
@@ -8104,6 +8104,7 @@ const cloudFrontDistributionMetricFactoryProps: CloudFrontDistributionMetricFact
 | --- | --- | --- |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMetricFactoryProps.property.distribution">distribution</a></code> | <code>monocdk.aws_cloudfront.IDistribution</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMetricFactoryProps.property.fillTpsWithZeroes">fillTpsWithZeroes</a></code> | <code>boolean</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMetricFactoryProps.property.rateComputationMethod">rateComputationMethod</a></code> | <code><a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a></code> | *No description.* |
 
 ---
 
@@ -8128,6 +8129,17 @@ public readonly fillTpsWithZeroes: boolean;
 
 ---
 
+##### `rateComputationMethod`<sup>Optional</sup> <a name="rateComputationMethod" id="cdk-monitoring-constructs.CloudFrontDistributionMetricFactoryProps.property.rateComputationMethod"></a>
+
+```typescript
+public readonly rateComputationMethod: RateComputationMethod;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a>
+- *Default:* average
+
+---
+
 ### CloudFrontDistributionMonitoringOptions <a name="CloudFrontDistributionMonitoringOptions" id="cdk-monitoring-constructs.CloudFrontDistributionMonitoringOptions"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.CloudFrontDistributionMonitoringOptions.Initializer"></a>
@@ -8266,6 +8278,7 @@ const cloudFrontDistributionMonitoringProps: CloudFrontDistributionMonitoringPro
 | --- | --- | --- |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMonitoringProps.property.distribution">distribution</a></code> | <code>monocdk.aws_cloudfront.IDistribution</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMonitoringProps.property.fillTpsWithZeroes">fillTpsWithZeroes</a></code> | <code>boolean</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMonitoringProps.property.rateComputationMethod">rateComputationMethod</a></code> | <code><a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMonitoringProps.property.alarmFriendlyName">alarmFriendlyName</a></code> | <code>string</code> | Plain name, used in naming alarms. |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMonitoringProps.property.humanReadableName">humanReadableName</a></code> | <code>string</code> | Human-readable name is a freeform string, used as a caption or description. |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMonitoringProps.property.localAlarmNamePrefixOverride">localAlarmNamePrefixOverride</a></code> | <code>string</code> | If this is defined, the local alarm name prefix used in naming alarms for the construct will be set to this value. |
@@ -8301,6 +8314,17 @@ public readonly fillTpsWithZeroes: boolean;
 
 ---
 
+##### `rateComputationMethod`<sup>Optional</sup> <a name="rateComputationMethod" id="cdk-monitoring-constructs.CloudFrontDistributionMonitoringProps.property.rateComputationMethod"></a>
+
+```typescript
+public readonly rateComputationMethod: RateComputationMethod;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a>
+- *Default:* average
+
+---
+
 ##### `alarmFriendlyName`<sup>Optional</sup> <a name="alarmFriendlyName" id="cdk-monitoring-constructs.CloudFrontDistributionMonitoringProps.property.alarmFriendlyName"></a>
 
 ```typescript
@@ -12717,6 +12741,51 @@ public readonly addUnhealthyTaskCountAlarm: {[ key: string ]: UnhealthyTaskCount
 
 ---
 
+### EC2MetricFactoryProps <a name="EC2MetricFactoryProps" id="cdk-monitoring-constructs.EC2MetricFactoryProps"></a>
+
+#### Initializer <a name="Initializer" id="cdk-monitoring-constructs.EC2MetricFactoryProps.Initializer"></a>
+
+```typescript
+import { EC2MetricFactoryProps } from 'cdk-monitoring-constructs'
+
+const eC2MetricFactoryProps: EC2MetricFactoryProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#cdk-monitoring-constructs.EC2MetricFactoryProps.property.autoScalingGroup">autoScalingGroup</a></code> | <code>monocdk.aws_autoscaling.IAutoScalingGroup</code> | Auto-Scaling Group to monitor. |
+| <code><a href="#cdk-monitoring-constructs.EC2MetricFactoryProps.property.instanceIds">instanceIds</a></code> | <code>string[]</code> | Selected IDs of EC2 instances to monitor. |
+
+---
+
+##### `autoScalingGroup`<sup>Optional</sup> <a name="autoScalingGroup" id="cdk-monitoring-constructs.EC2MetricFactoryProps.property.autoScalingGroup"></a>
+
+```typescript
+public readonly autoScalingGroup: IAutoScalingGroup;
+```
+
+- *Type:* monocdk.aws_autoscaling.IAutoScalingGroup
+- *Default:* no Auto-Scaling Group filter
+
+Auto-Scaling Group to monitor.
+
+---
+
+##### `instanceIds`<sup>Optional</sup> <a name="instanceIds" id="cdk-monitoring-constructs.EC2MetricFactoryProps.property.instanceIds"></a>
+
+```typescript
+public readonly instanceIds: string[];
+```
+
+- *Type:* string[]
+- *Default:* no instance filter
+
+Selected IDs of EC2 instances to monitor.
+
+---
+
 ### EC2MonitoringOptions <a name="EC2MonitoringOptions" id="cdk-monitoring-constructs.EC2MonitoringOptions"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.EC2MonitoringOptions.Initializer"></a>
@@ -12731,6 +12800,8 @@ const eC2MonitoringOptions: EC2MonitoringOptions = { ... }
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
+| <code><a href="#cdk-monitoring-constructs.EC2MonitoringOptions.property.autoScalingGroup">autoScalingGroup</a></code> | <code>monocdk.aws_autoscaling.IAutoScalingGroup</code> | Auto-Scaling Group to monitor. |
+| <code><a href="#cdk-monitoring-constructs.EC2MonitoringOptions.property.instanceIds">instanceIds</a></code> | <code>string[]</code> | Selected IDs of EC2 instances to monitor. |
 | <code><a href="#cdk-monitoring-constructs.EC2MonitoringOptions.property.alarmFriendlyName">alarmFriendlyName</a></code> | <code>string</code> | Plain name, used in naming alarms. |
 | <code><a href="#cdk-monitoring-constructs.EC2MonitoringOptions.property.humanReadableName">humanReadableName</a></code> | <code>string</code> | Human-readable name is a freeform string, used as a caption or description. |
 | <code><a href="#cdk-monitoring-constructs.EC2MonitoringOptions.property.localAlarmNamePrefixOverride">localAlarmNamePrefixOverride</a></code> | <code>string</code> | If this is defined, the local alarm name prefix used in naming alarms for the construct will be set to this value. |
@@ -12738,7 +12809,32 @@ const eC2MonitoringOptions: EC2MonitoringOptions = { ... }
 | <code><a href="#cdk-monitoring-constructs.EC2MonitoringOptions.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.EC2MonitoringOptions.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.EC2MonitoringOptions.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.EC2MonitoringOptions.property.autoScalingGroup">autoScalingGroup</a></code> | <code>monocdk.aws_autoscaling.IAutoScalingGroup</code> | *No description.* |
+
+---
+
+##### `autoScalingGroup`<sup>Optional</sup> <a name="autoScalingGroup" id="cdk-monitoring-constructs.EC2MonitoringOptions.property.autoScalingGroup"></a>
+
+```typescript
+public readonly autoScalingGroup: IAutoScalingGroup;
+```
+
+- *Type:* monocdk.aws_autoscaling.IAutoScalingGroup
+- *Default:* no Auto-Scaling Group filter
+
+Auto-Scaling Group to monitor.
+
+---
+
+##### `instanceIds`<sup>Optional</sup> <a name="instanceIds" id="cdk-monitoring-constructs.EC2MonitoringOptions.property.instanceIds"></a>
+
+```typescript
+public readonly instanceIds: string[];
+```
+
+- *Type:* string[]
+- *Default:* no instance filter
+
+Selected IDs of EC2 instances to monitor.
 
 ---
 
@@ -12840,16 +12936,6 @@ Calls provided function to process all alarms created.
 
 ---
 
-##### `autoScalingGroup`<sup>Optional</sup> <a name="autoScalingGroup" id="cdk-monitoring-constructs.EC2MonitoringOptions.property.autoScalingGroup"></a>
-
-```typescript
-public readonly autoScalingGroup: IAutoScalingGroup;
-```
-
-- *Type:* monocdk.aws_autoscaling.IAutoScalingGroup
-
----
-
 ### EC2MonitoringProps <a name="EC2MonitoringProps" id="cdk-monitoring-constructs.EC2MonitoringProps"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.EC2MonitoringProps.Initializer"></a>
@@ -12864,6 +12950,8 @@ const eC2MonitoringProps: EC2MonitoringProps = { ... }
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
+| <code><a href="#cdk-monitoring-constructs.EC2MonitoringProps.property.autoScalingGroup">autoScalingGroup</a></code> | <code>monocdk.aws_autoscaling.IAutoScalingGroup</code> | Auto-Scaling Group to monitor. |
+| <code><a href="#cdk-monitoring-constructs.EC2MonitoringProps.property.instanceIds">instanceIds</a></code> | <code>string[]</code> | Selected IDs of EC2 instances to monitor. |
 | <code><a href="#cdk-monitoring-constructs.EC2MonitoringProps.property.alarmFriendlyName">alarmFriendlyName</a></code> | <code>string</code> | Plain name, used in naming alarms. |
 | <code><a href="#cdk-monitoring-constructs.EC2MonitoringProps.property.humanReadableName">humanReadableName</a></code> | <code>string</code> | Human-readable name is a freeform string, used as a caption or description. |
 | <code><a href="#cdk-monitoring-constructs.EC2MonitoringProps.property.localAlarmNamePrefixOverride">localAlarmNamePrefixOverride</a></code> | <code>string</code> | If this is defined, the local alarm name prefix used in naming alarms for the construct will be set to this value. |
@@ -12871,7 +12959,32 @@ const eC2MonitoringProps: EC2MonitoringProps = { ... }
 | <code><a href="#cdk-monitoring-constructs.EC2MonitoringProps.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.EC2MonitoringProps.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.EC2MonitoringProps.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.EC2MonitoringProps.property.autoScalingGroup">autoScalingGroup</a></code> | <code>monocdk.aws_autoscaling.IAutoScalingGroup</code> | *No description.* |
+
+---
+
+##### `autoScalingGroup`<sup>Optional</sup> <a name="autoScalingGroup" id="cdk-monitoring-constructs.EC2MonitoringProps.property.autoScalingGroup"></a>
+
+```typescript
+public readonly autoScalingGroup: IAutoScalingGroup;
+```
+
+- *Type:* monocdk.aws_autoscaling.IAutoScalingGroup
+- *Default:* no Auto-Scaling Group filter
+
+Auto-Scaling Group to monitor.
+
+---
+
+##### `instanceIds`<sup>Optional</sup> <a name="instanceIds" id="cdk-monitoring-constructs.EC2MonitoringProps.property.instanceIds"></a>
+
+```typescript
+public readonly instanceIds: string[];
+```
+
+- *Type:* string[]
+- *Default:* no instance filter
+
+Selected IDs of EC2 instances to monitor.
 
 ---
 
@@ -12973,16 +13086,6 @@ Calls provided function to process all alarms created.
 
 ---
 
-##### `autoScalingGroup`<sup>Optional</sup> <a name="autoScalingGroup" id="cdk-monitoring-constructs.EC2MonitoringProps.property.autoScalingGroup"></a>
-
-```typescript
-public readonly autoScalingGroup: IAutoScalingGroup;
-```
-
-- *Type:* monocdk.aws_autoscaling.IAutoScalingGroup
-
----
-
 ### Ec2NetworkLoadBalancerMonitoringProps <a name="Ec2NetworkLoadBalancerMonitoringProps" id="cdk-monitoring-constructs.Ec2NetworkLoadBalancerMonitoringProps"></a>
 
 Monitoring props for EC2 service with network load balancer and plain service.
@@ -15471,6 +15574,46 @@ public readonly maxFullRestartCount: number;
 
 ---
 
+### GlueJobMetricFactoryProps <a name="GlueJobMetricFactoryProps" id="cdk-monitoring-constructs.GlueJobMetricFactoryProps"></a>
+
+#### Initializer <a name="Initializer" id="cdk-monitoring-constructs.GlueJobMetricFactoryProps.Initializer"></a>
+
+```typescript
+import { GlueJobMetricFactoryProps } from 'cdk-monitoring-constructs'
+
+const glueJobMetricFactoryProps: GlueJobMetricFactoryProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#cdk-monitoring-constructs.GlueJobMetricFactoryProps.property.jobName">jobName</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.GlueJobMetricFactoryProps.property.rateComputationMethod">rateComputationMethod</a></code> | <code><a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a></code> | *No description.* |
+
+---
+
+##### `jobName`<sup>Required</sup> <a name="jobName" id="cdk-monitoring-constructs.GlueJobMetricFactoryProps.property.jobName"></a>
+
+```typescript
+public readonly jobName: string;
+```
+
+- *Type:* string
+
+---
+
+##### `rateComputationMethod`<sup>Optional</sup> <a name="rateComputationMethod" id="cdk-monitoring-constructs.GlueJobMetricFactoryProps.property.rateComputationMethod"></a>
+
+```typescript
+public readonly rateComputationMethod: RateComputationMethod;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a>
+- *Default:* average
+
+---
+
 ### GlueJobMonitoringOptions <a name="GlueJobMonitoringOptions" id="cdk-monitoring-constructs.GlueJobMonitoringOptions"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.GlueJobMonitoringOptions.Initializer"></a>
@@ -15485,6 +15628,8 @@ const glueJobMonitoringOptions: GlueJobMonitoringOptions = { ... }
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
+| <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringOptions.property.jobName">jobName</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringOptions.property.rateComputationMethod">rateComputationMethod</a></code> | <code><a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringOptions.property.alarmFriendlyName">alarmFriendlyName</a></code> | <code>string</code> | Plain name, used in naming alarms. |
 | <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringOptions.property.humanReadableName">humanReadableName</a></code> | <code>string</code> | Human-readable name is a freeform string, used as a caption or description. |
 | <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringOptions.property.localAlarmNamePrefixOverride">localAlarmNamePrefixOverride</a></code> | <code>string</code> | If this is defined, the local alarm name prefix used in naming alarms for the construct will be set to this value. |
@@ -15499,6 +15644,27 @@ const glueJobMonitoringOptions: GlueJobMonitoringOptions = { ... }
 
 ---
 
+##### `jobName`<sup>Required</sup> <a name="jobName" id="cdk-monitoring-constructs.GlueJobMonitoringOptions.property.jobName"></a>
+
+```typescript
+public readonly jobName: string;
+```
+
+- *Type:* string
+
+---
+
+##### `rateComputationMethod`<sup>Optional</sup> <a name="rateComputationMethod" id="cdk-monitoring-constructs.GlueJobMonitoringOptions.property.rateComputationMethod"></a>
+
+```typescript
+public readonly rateComputationMethod: RateComputationMethod;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a>
+- *Default:* average
+
+---
+
 ##### `alarmFriendlyName`<sup>Optional</sup> <a name="alarmFriendlyName" id="cdk-monitoring-constructs.GlueJobMonitoringOptions.property.alarmFriendlyName"></a>
 
 ```typescript
@@ -15651,6 +15817,8 @@ const glueJobMonitoringProps: GlueJobMonitoringProps = { ... }
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
+| <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringProps.property.jobName">jobName</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringProps.property.rateComputationMethod">rateComputationMethod</a></code> | <code><a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringProps.property.alarmFriendlyName">alarmFriendlyName</a></code> | <code>string</code> | Plain name, used in naming alarms. |
 | <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringProps.property.humanReadableName">humanReadableName</a></code> | <code>string</code> | Human-readable name is a freeform string, used as a caption or description. |
 | <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringProps.property.localAlarmNamePrefixOverride">localAlarmNamePrefixOverride</a></code> | <code>string</code> | If this is defined, the local alarm name prefix used in naming alarms for the construct will be set to this value. |
@@ -15662,7 +15830,27 @@ const glueJobMonitoringProps: GlueJobMonitoringProps = { ... }
 | <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringProps.property.addFailedTaskRateAlarm">addFailedTaskRateAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.ErrorRateThreshold">ErrorRateThreshold</a>}</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringProps.property.addKilledTaskCountAlarm">addKilledTaskCountAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.ErrorCountThreshold">ErrorCountThreshold</a>}</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringProps.property.addKilledTaskRateAlarm">addKilledTaskRateAlarm</a></code> | <code>{[ key: string ]: <a href="#cdk-monitoring-constructs.ErrorRateThreshold">ErrorRateThreshold</a>}</code> | *No description.* |
-| <code><a href="#cdk-monitoring-constructs.GlueJobMonitoringProps.property.jobName">jobName</a></code> | <code>string</code> | *No description.* |
+
+---
+
+##### `jobName`<sup>Required</sup> <a name="jobName" id="cdk-monitoring-constructs.GlueJobMonitoringProps.property.jobName"></a>
+
+```typescript
+public readonly jobName: string;
+```
+
+- *Type:* string
+
+---
+
+##### `rateComputationMethod`<sup>Optional</sup> <a name="rateComputationMethod" id="cdk-monitoring-constructs.GlueJobMonitoringProps.property.rateComputationMethod"></a>
+
+```typescript
+public readonly rateComputationMethod: RateComputationMethod;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a>
+- *Default:* average
 
 ---
 
@@ -15804,16 +15992,6 @@ public readonly addKilledTaskRateAlarm: {[ key: string ]: ErrorRateThreshold};
 
 ---
 
-##### `jobName`<sup>Required</sup> <a name="jobName" id="cdk-monitoring-constructs.GlueJobMonitoringProps.property.jobName"></a>
-
-```typescript
-public readonly jobName: string;
-```
-
-- *Type:* string
-
----
-
 ### HealthyTaskCountThreshold <a name="HealthyTaskCountThreshold" id="cdk-monitoring-constructs.HealthyTaskCountThreshold"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.HealthyTaskCountThreshold.Initializer"></a>
@@ -25377,6 +25555,7 @@ const openSearchClusterMetricFactoryProps: OpenSearchClusterMetricFactoryProps =
 | --- | --- | --- |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactoryProps.property.domain">domain</a></code> | <code>monocdk.aws_elasticsearch.IDomain \| monocdk.aws_elasticsearch.CfnDomain \| monocdk.aws_opensearchservice.IDomain \| monocdk.aws_opensearchservice.CfnDomain</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactoryProps.property.fillTpsWithZeroes">fillTpsWithZeroes</a></code> | <code>boolean</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactoryProps.property.rateComputationMethod">rateComputationMethod</a></code> | <code><a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a></code> | *No description.* |
 
 ---
 
@@ -25401,6 +25580,17 @@ public readonly fillTpsWithZeroes: boolean;
 
 ---
 
+##### `rateComputationMethod`<sup>Optional</sup> <a name="rateComputationMethod" id="cdk-monitoring-constructs.OpenSearchClusterMetricFactoryProps.property.rateComputationMethod"></a>
+
+```typescript
+public readonly rateComputationMethod: RateComputationMethod;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a>
+- *Default:* average
+
+---
+
 ### OpenSearchClusterMonitoringOptions <a name="OpenSearchClusterMonitoringOptions" id="cdk-monitoring-constructs.OpenSearchClusterMonitoringOptions"></a>
 
 #### Initializer <a name="Initializer" id="cdk-monitoring-constructs.OpenSearchClusterMonitoringOptions.Initializer"></a>
@@ -25726,6 +25916,7 @@ const openSearchClusterMonitoringProps: OpenSearchClusterMonitoringProps = { ...
 | --- | --- | --- |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMonitoringProps.property.domain">domain</a></code> | <code>monocdk.aws_elasticsearch.IDomain \| monocdk.aws_elasticsearch.CfnDomain \| monocdk.aws_opensearchservice.IDomain \| monocdk.aws_opensearchservice.CfnDomain</code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMonitoringProps.property.fillTpsWithZeroes">fillTpsWithZeroes</a></code> | <code>boolean</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMonitoringProps.property.rateComputationMethod">rateComputationMethod</a></code> | <code><a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMonitoringProps.property.alarmFriendlyName">alarmFriendlyName</a></code> | <code>string</code> | Plain name, used in naming alarms. |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMonitoringProps.property.humanReadableName">humanReadableName</a></code> | <code>string</code> | Human-readable name is a freeform string, used as a caption or description. |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMonitoringProps.property.localAlarmNamePrefixOverride">localAlarmNamePrefixOverride</a></code> | <code>string</code> | If this is defined, the local alarm name prefix used in naming alarms for the construct will be set to this value. |
@@ -25774,6 +25965,17 @@ public readonly fillTpsWithZeroes: boolean;
 
 ---
 
+##### `rateComputationMethod`<sup>Optional</sup> <a name="rateComputationMethod" id="cdk-monitoring-constructs.OpenSearchClusterMonitoringProps.property.rateComputationMethod"></a>
+
+```typescript
+public readonly rateComputationMethod: RateComputationMethod;
+```
+
+- *Type:* <a href="#cdk-monitoring-constructs.RateComputationMethod">RateComputationMethod</a>
+- *Default:* average
+
+---
+
 ##### `alarmFriendlyName`<sup>Optional</sup> <a name="alarmFriendlyName" id="cdk-monitoring-constructs.OpenSearchClusterMonitoringProps.property.alarmFriendlyName"></a>
 
 ```typescript
@@ -35252,6 +35454,7 @@ new ApiGatewayMetricFactory(metricFactory: MetricFactory, props: ApiGatewayMetri
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayMetricFactory.metric5XXFaultCount">metric5XXFaultCount</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayMetricFactory.metric5XXFaultRate">metric5XXFaultRate</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayMetricFactory.metricInvocationCount">metricInvocationCount</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.ApiGatewayMetricFactory.metricInvocationRate">metricInvocationRate</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayMetricFactory.metricLatencyInMillis">metricLatencyInMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayMetricFactory.metricLatencyP50InMillis">metricLatencyP50InMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayMetricFactory.metricLatencyP90InMillis">metricLatencyP90InMillis</a></code> | *No description.* |
@@ -35290,6 +35493,12 @@ public metric5XXFaultRate(): Metric | MathExpression
 public metricInvocationCount(): Metric | MathExpression
 ```
 
+##### `metricInvocationRate` <a name="metricInvocationRate" id="cdk-monitoring-constructs.ApiGatewayMetricFactory.metricInvocationRate"></a>
+
+```typescript
+public metricInvocationRate(): Metric | MathExpression
+```
+
 ##### `metricLatencyInMillis` <a name="metricLatencyInMillis" id="cdk-monitoring-constructs.ApiGatewayMetricFactory.metricLatencyInMillis"></a>
 
 ```typescript
@@ -35320,7 +35529,7 @@ public metricLatencyP90InMillis(): Metric | MathExpression
 public metricLatencyP99InMillis(): Metric | MathExpression
 ```
 
-##### `metricTps` <a name="metricTps" id="cdk-monitoring-constructs.ApiGatewayMetricFactory.metricTps"></a>
+##### ~~`metricTps`~~ <a name="metricTps" id="cdk-monitoring-constructs.ApiGatewayMetricFactory.metricTps"></a>
 
 ```typescript
 public metricTps(): Metric | MathExpression
@@ -35502,6 +35711,7 @@ new ApiGatewayV2HttpApiMetricFactory(metricFactory: MetricFactory, props: ApiGat
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayV2HttpApiMetricFactory.metricIntegrationLatencyP90InMillis">metricIntegrationLatencyP90InMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayV2HttpApiMetricFactory.metricIntegrationLatencyP99InMillis">metricIntegrationLatencyP99InMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayV2HttpApiMetricFactory.metricInvocationCount">metricInvocationCount</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.ApiGatewayV2HttpApiMetricFactory.metricInvocationRate">metricInvocationRate</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayV2HttpApiMetricFactory.metricLatencyInMillis">metricLatencyInMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayV2HttpApiMetricFactory.metricLatencyP50InMillis">metricLatencyP50InMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.ApiGatewayV2HttpApiMetricFactory.metricLatencyP90InMillis">metricLatencyP90InMillis</a></code> | *No description.* |
@@ -35570,6 +35780,12 @@ public metricIntegrationLatencyP99InMillis(): Metric | MathExpression
 public metricInvocationCount(): Metric | MathExpression
 ```
 
+##### `metricInvocationRate` <a name="metricInvocationRate" id="cdk-monitoring-constructs.ApiGatewayV2HttpApiMetricFactory.metricInvocationRate"></a>
+
+```typescript
+public metricInvocationRate(): Metric | MathExpression
+```
+
 ##### `metricLatencyInMillis` <a name="metricLatencyInMillis" id="cdk-monitoring-constructs.ApiGatewayV2HttpApiMetricFactory.metricLatencyInMillis"></a>
 
 ```typescript
@@ -35600,7 +35816,7 @@ public metricLatencyP90InMillis(): Metric | MathExpression
 public metricLatencyP99InMillis(): Metric | MathExpression
 ```
 
-##### `metricTps` <a name="metricTps" id="cdk-monitoring-constructs.ApiGatewayV2HttpApiMetricFactory.metricTps"></a>
+##### ~~`metricTps`~~ <a name="metricTps" id="cdk-monitoring-constructs.ApiGatewayV2HttpApiMetricFactory.metricTps"></a>
 
 ```typescript
 public metricTps(): Metric | MathExpression
@@ -35866,6 +36082,7 @@ new AppSyncMetricFactory(metricFactory: MetricFactory, props: AppSyncMetricFacto
 | <code><a href="#cdk-monitoring-constructs.AppSyncMetricFactory.metricLatencyP90InMillis">metricLatencyP90InMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.AppSyncMetricFactory.metricLatencyP99InMillis">metricLatencyP99InMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.AppSyncMetricFactory.metricRequestCount">metricRequestCount</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.AppSyncMetricFactory.metricRequestRate">metricRequestRate</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.AppSyncMetricFactory.metricTps">metricTps</a></code> | *No description.* |
 
 ---
@@ -35918,7 +36135,13 @@ public metricLatencyP99InMillis(): Metric | MathExpression
 public metricRequestCount(): Metric | MathExpression
 ```
 
-##### `metricTps` <a name="metricTps" id="cdk-monitoring-constructs.AppSyncMetricFactory.metricTps"></a>
+##### `metricRequestRate` <a name="metricRequestRate" id="cdk-monitoring-constructs.AppSyncMetricFactory.metricRequestRate"></a>
+
+```typescript
+public metricRequestRate(): Metric | MathExpression
+```
+
+##### ~~`metricTps`~~ <a name="metricTps" id="cdk-monitoring-constructs.AppSyncMetricFactory.metricTps"></a>
 
 ```typescript
 public metricTps(): Metric | MathExpression
@@ -37034,6 +37257,7 @@ new CloudFrontDistributionMetricFactory(metricFactory: MetricFactory, props: Clo
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMetricFactory.metric5xxErrorRateAverage">metric5xxErrorRateAverage</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMetricFactory.metricCacheHitRateAverageInPercent">metricCacheHitRateAverageInPercent</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMetricFactory.metricRequestCount">metricRequestCount</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMetricFactory.metricRequestRate">metricRequestRate</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMetricFactory.metricRequestTps">metricRequestTps</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMetricFactory.metricTotalBytesDownloaded">metricTotalBytesDownloaded</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.CloudFrontDistributionMetricFactory.metricTotalBytesUploaded">metricTotalBytesUploaded</a></code> | *No description.* |
@@ -37065,7 +37289,13 @@ public metricCacheHitRateAverageInPercent(): Metric | MathExpression
 public metricRequestCount(): Metric | MathExpression
 ```
 
-##### `metricRequestTps` <a name="metricRequestTps" id="cdk-monitoring-constructs.CloudFrontDistributionMetricFactory.metricRequestTps"></a>
+##### `metricRequestRate` <a name="metricRequestRate" id="cdk-monitoring-constructs.CloudFrontDistributionMetricFactory.metricRequestRate"></a>
+
+```typescript
+public metricRequestRate(): Metric | MathExpression
+```
+
+##### ~~`metricRequestTps`~~ <a name="metricRequestTps" id="cdk-monitoring-constructs.CloudFrontDistributionMetricFactory.metricRequestTps"></a>
 
 ```typescript
 public metricRequestTps(): Metric | MathExpression
@@ -38481,13 +38711,13 @@ Returns widgets to be placed on the main dashboard.
 ```typescript
 import { EC2MetricFactory } from 'cdk-monitoring-constructs'
 
-new EC2MetricFactory(metricFactory: MetricFactory, autoScalingGroup?: IAutoScalingGroup)
+new EC2MetricFactory(metricFactory: MetricFactory, props: EC2MetricFactoryProps)
 ```
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
 | <code><a href="#cdk-monitoring-constructs.EC2MetricFactory.Initializer.parameter.metricFactory">metricFactory</a></code> | <code><a href="#cdk-monitoring-constructs.MetricFactory">MetricFactory</a></code> | *No description.* |
-| <code><a href="#cdk-monitoring-constructs.EC2MetricFactory.Initializer.parameter.autoScalingGroup">autoScalingGroup</a></code> | <code>monocdk.aws_autoscaling.IAutoScalingGroup</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.EC2MetricFactory.Initializer.parameter.props">props</a></code> | <code><a href="#cdk-monitoring-constructs.EC2MetricFactoryProps">EC2MetricFactoryProps</a></code> | *No description.* |
 
 ---
 
@@ -38497,9 +38727,9 @@ new EC2MetricFactory(metricFactory: MetricFactory, autoScalingGroup?: IAutoScali
 
 ---
 
-##### `autoScalingGroup`<sup>Optional</sup> <a name="autoScalingGroup" id="cdk-monitoring-constructs.EC2MetricFactory.Initializer.parameter.autoScalingGroup"></a>
+##### `props`<sup>Required</sup> <a name="props" id="cdk-monitoring-constructs.EC2MetricFactory.Initializer.parameter.props"></a>
 
-- *Type:* monocdk.aws_autoscaling.IAutoScalingGroup
+- *Type:* <a href="#cdk-monitoring-constructs.EC2MetricFactoryProps">EC2MetricFactoryProps</a>
 
 ---
 
@@ -38520,7 +38750,7 @@ new EC2MetricFactory(metricFactory: MetricFactory, autoScalingGroup?: IAutoScali
 ##### `metricAverageCpuUtilisationPercent` <a name="metricAverageCpuUtilisationPercent" id="cdk-monitoring-constructs.EC2MetricFactory.metricAverageCpuUtilisationPercent"></a>
 
 ```typescript
-public metricAverageCpuUtilisationPercent(): IMetric
+public metricAverageCpuUtilisationPercent(): IMetric[]
 ```
 
 The percentage of allocated EC2 compute units that are currently in use on the instance.
@@ -38532,7 +38762,7 @@ CloudWatch when the instance is not allocated a full processor core.
 ##### `metricAverageDiskReadBytes` <a name="metricAverageDiskReadBytes" id="cdk-monitoring-constructs.EC2MetricFactory.metricAverageDiskReadBytes"></a>
 
 ```typescript
-public metricAverageDiskReadBytes(): IMetric
+public metricAverageDiskReadBytes(): IMetric[]
 ```
 
 Bytes read from all instance store volumes available to the instance.
@@ -38543,7 +38773,7 @@ This can be used to determine the speed of the application.
 ##### `metricAverageDiskReadOps` <a name="metricAverageDiskReadOps" id="cdk-monitoring-constructs.EC2MetricFactory.metricAverageDiskReadOps"></a>
 
 ```typescript
-public metricAverageDiskReadOps(): IMetric
+public metricAverageDiskReadOps(): IMetric[]
 ```
 
 Completed read operations from all instance store volumes available to the instance in a specified period of time.
@@ -38551,7 +38781,7 @@ Completed read operations from all instance store volumes available to the insta
 ##### `metricAverageDiskWriteBytes` <a name="metricAverageDiskWriteBytes" id="cdk-monitoring-constructs.EC2MetricFactory.metricAverageDiskWriteBytes"></a>
 
 ```typescript
-public metricAverageDiskWriteBytes(): IMetric
+public metricAverageDiskWriteBytes(): IMetric[]
 ```
 
 Bytes written to all instance store volumes available to the instance.
@@ -38562,7 +38792,7 @@ This can be used to determine the speed of the application.
 ##### `metricAverageDiskWriteOps` <a name="metricAverageDiskWriteOps" id="cdk-monitoring-constructs.EC2MetricFactory.metricAverageDiskWriteOps"></a>
 
 ```typescript
-public metricAverageDiskWriteOps(): IMetric
+public metricAverageDiskWriteOps(): IMetric[]
 ```
 
 Completed write operations to all instance store volumes available to the instance in a specified period of time.
@@ -38570,7 +38800,7 @@ Completed write operations to all instance store volumes available to the instan
 ##### `metricAverageNetworkInRateBytes` <a name="metricAverageNetworkInRateBytes" id="cdk-monitoring-constructs.EC2MetricFactory.metricAverageNetworkInRateBytes"></a>
 
 ```typescript
-public metricAverageNetworkInRateBytes(): IMetric
+public metricAverageNetworkInRateBytes(): IMetric[]
 ```
 
 The number of bytes received on all network interfaces by the instance.
@@ -38580,7 +38810,7 @@ This metric identifies the volume of incoming network traffic to a single instan
 ##### `metricAverageNetworkOutRateBytes` <a name="metricAverageNetworkOutRateBytes" id="cdk-monitoring-constructs.EC2MetricFactory.metricAverageNetworkOutRateBytes"></a>
 
 ```typescript
-public metricAverageNetworkOutRateBytes(): IMetric
+public metricAverageNetworkOutRateBytes(): IMetric[]
 ```
 
 The number of bytes sent out on all network interfaces by the instance.
@@ -39575,13 +39805,13 @@ Creates annotation based on the metric and alarm properties.
 ```typescript
 import { GlueJobMetricFactory } from 'cdk-monitoring-constructs'
 
-new GlueJobMetricFactory(metricFactory: MetricFactory, jobName: string)
+new GlueJobMetricFactory(metricFactory: MetricFactory, props: GlueJobMetricFactoryProps)
 ```
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
 | <code><a href="#cdk-monitoring-constructs.GlueJobMetricFactory.Initializer.parameter.metricFactory">metricFactory</a></code> | <code><a href="#cdk-monitoring-constructs.MetricFactory">MetricFactory</a></code> | *No description.* |
-| <code><a href="#cdk-monitoring-constructs.GlueJobMetricFactory.Initializer.parameter.jobName">jobName</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.GlueJobMetricFactory.Initializer.parameter.props">props</a></code> | <code><a href="#cdk-monitoring-constructs.GlueJobMetricFactoryProps">GlueJobMetricFactoryProps</a></code> | *No description.* |
 
 ---
 
@@ -39591,9 +39821,9 @@ new GlueJobMetricFactory(metricFactory: MetricFactory, jobName: string)
 
 ---
 
-##### `jobName`<sup>Required</sup> <a name="jobName" id="cdk-monitoring-constructs.GlueJobMetricFactory.Initializer.parameter.jobName"></a>
+##### `props`<sup>Required</sup> <a name="props" id="cdk-monitoring-constructs.GlueJobMetricFactory.Initializer.parameter.props"></a>
 
-- *Type:* string
+- *Type:* <a href="#cdk-monitoring-constructs.GlueJobMetricFactoryProps">GlueJobMetricFactoryProps</a>
 
 ---
 
@@ -41205,6 +41435,7 @@ new LambdaFunctionMetricFactory(metricFactory: MetricFactory, props: LambdaFunct
 | <code><a href="#cdk-monitoring-constructs.LambdaFunctionMetricFactory.metricFaultCount">metricFaultCount</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.LambdaFunctionMetricFactory.metricFaultRate">metricFaultRate</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.LambdaFunctionMetricFactory.metricInvocationCount">metricInvocationCount</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.LambdaFunctionMetricFactory.metricInvocationRate">metricInvocationRate</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.LambdaFunctionMetricFactory.metricLatencyP50InMillis">metricLatencyP50InMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.LambdaFunctionMetricFactory.metricLatencyP90InMillis">metricLatencyP90InMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.LambdaFunctionMetricFactory.metricLatencyP99InMillis">metricLatencyP99InMillis</a></code> | *No description.* |
@@ -41241,6 +41472,12 @@ public metricFaultRate(): Metric | MathExpression
 public metricInvocationCount(): Metric | MathExpression
 ```
 
+##### `metricInvocationRate` <a name="metricInvocationRate" id="cdk-monitoring-constructs.LambdaFunctionMetricFactory.metricInvocationRate"></a>
+
+```typescript
+public metricInvocationRate(): Metric | MathExpression
+```
+
 ##### `metricLatencyP50InMillis` <a name="metricLatencyP50InMillis" id="cdk-monitoring-constructs.LambdaFunctionMetricFactory.metricLatencyP50InMillis"></a>
 
 ```typescript
@@ -41289,7 +41526,7 @@ public metricThrottlesCount(): Metric | MathExpression
 public metricThrottlesRate(): Metric | MathExpression
 ```
 
-##### `metricTps` <a name="metricTps" id="cdk-monitoring-constructs.LambdaFunctionMetricFactory.metricTps"></a>
+##### ~~`metricTps`~~ <a name="metricTps" id="cdk-monitoring-constructs.LambdaFunctionMetricFactory.metricTps"></a>
 
 ```typescript
 public metricTps(): Metric | MathExpression
@@ -43028,6 +43265,7 @@ new OpenSearchBackportedMetrics(domain: IDomain | CfnDomain | IDomain | CfnDomai
 | <code><a href="#cdk-monitoring-constructs.OpenSearchBackportedMetrics.metric">metric</a></code> | Return the given named metric for this Domain. |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchBackportedMetrics.metricAutomatedSnapshotFailure">metricAutomatedSnapshotFailure</a></code> | Metric for automated snapshot failures. |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchBackportedMetrics.metricClusterIndexWriteBlocked">metricClusterIndexWriteBlocked</a></code> | Metric for the cluster blocking index writes. |
+| <code><a href="#cdk-monitoring-constructs.OpenSearchBackportedMetrics.metricClusterIndexWritesBlocked">metricClusterIndexWritesBlocked</a></code> | Metric for the cluster blocking index writes. |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchBackportedMetrics.metricClusterStatusRed">metricClusterStatusRed</a></code> | Metric for the time the cluster status is red. |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchBackportedMetrics.metricClusterStatusYellow">metricClusterStatusYellow</a></code> | Metric for the time the cluster status is yellow. |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchBackportedMetrics.metricCPUUtilization">metricCPUUtilization</a></code> | Metric for CPU utilization. |
@@ -43078,7 +43316,7 @@ Metric for automated snapshot failures.
 
 ---
 
-##### `metricClusterIndexWriteBlocked` <a name="metricClusterIndexWriteBlocked" id="cdk-monitoring-constructs.OpenSearchBackportedMetrics.metricClusterIndexWriteBlocked"></a>
+##### ~~`metricClusterIndexWriteBlocked`~~ <a name="metricClusterIndexWriteBlocked" id="cdk-monitoring-constructs.OpenSearchBackportedMetrics.metricClusterIndexWriteBlocked"></a>
 
 ```typescript
 public metricClusterIndexWriteBlocked(props?: MetricOptions): Metric
@@ -43092,6 +43330,20 @@ Metric for the cluster blocking index writes.
 
 ---
 
+##### `metricClusterIndexWritesBlocked` <a name="metricClusterIndexWritesBlocked" id="cdk-monitoring-constructs.OpenSearchBackportedMetrics.metricClusterIndexWritesBlocked"></a>
+
+```typescript
+public metricClusterIndexWritesBlocked(props?: MetricOptions): Metric
+```
+
+Metric for the cluster blocking index writes.
+
+###### `props`<sup>Optional</sup> <a name="props" id="cdk-monitoring-constructs.OpenSearchBackportedMetrics.metricClusterIndexWritesBlocked.parameter.props"></a>
+
+- *Type:* monocdk.aws_cloudwatch.MetricOptions
+
+---
+
 ##### `metricClusterStatusRed` <a name="metricClusterStatusRed" id="cdk-monitoring-constructs.OpenSearchBackportedMetrics.metricClusterStatusRed"></a>
 
 ```typescript
@@ -43494,6 +43746,7 @@ new OpenSearchClusterMetricFactory(metricFactory: MetricFactory, props: OpenSear
 | --- | --- |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricAutomatedSnapshotFailure">metricAutomatedSnapshotFailure</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricClusterIndexWriteBlocked">metricClusterIndexWriteBlocked</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricClusterIndexWritesBlocked">metricClusterIndexWritesBlocked</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricClusterStatusRed">metricClusterStatusRed</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricClusterStatusYellow">metricClusterStatusYellow</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricCpuUsage">metricCpuUsage</a></code> | *No description.* |
@@ -43507,9 +43760,11 @@ new OpenSearchClusterMetricFactory(metricFactory: MetricFactory, props: OpenSear
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricMasterCpuUsage">metricMasterCpuUsage</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricMasterJvmMemoryPressure">metricMasterJvmMemoryPressure</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricNodes">metricNodes</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricSearchCount">metricSearchCount</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricSearchLatencyP50InMillis">metricSearchLatencyP50InMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricSearchLatencyP90InMillis">metricSearchLatencyP90InMillis</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricSearchLatencyP99InMillis">metricSearchLatencyP99InMillis</a></code> | *No description.* |
+| <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricSearchRate">metricSearchRate</a></code> | *No description.* |
 | <code><a href="#cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricTps">metricTps</a></code> | *No description.* |
 
 ---
@@ -43520,12 +43775,18 @@ new OpenSearchClusterMetricFactory(metricFactory: MetricFactory, props: OpenSear
 public metricAutomatedSnapshotFailure(): Metric | MathExpression
 ```
 
-##### `metricClusterIndexWriteBlocked` <a name="metricClusterIndexWriteBlocked" id="cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricClusterIndexWriteBlocked"></a>
+##### ~~`metricClusterIndexWriteBlocked`~~ <a name="metricClusterIndexWriteBlocked" id="cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricClusterIndexWriteBlocked"></a>
 
 ```typescript
 public metricClusterIndexWriteBlocked(): Metric | MathExpression
 ```
 
+##### `metricClusterIndexWritesBlocked` <a name="metricClusterIndexWritesBlocked" id="cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricClusterIndexWritesBlocked"></a>
+
+```typescript
+public metricClusterIndexWritesBlocked(): Metric | MathExpression
+```
+
 ##### `metricClusterStatusRed` <a name="metricClusterStatusRed" id="cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricClusterStatusRed"></a>
 
 ```typescript
@@ -43604,6 +43865,12 @@ public metricMasterJvmMemoryPressure(): Metric | MathExpression
 public metricNodes(): Metric | MathExpression
 ```
 
+##### `metricSearchCount` <a name="metricSearchCount" id="cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricSearchCount"></a>
+
+```typescript
+public metricSearchCount(): Metric
+```
+
 ##### `metricSearchLatencyP50InMillis` <a name="metricSearchLatencyP50InMillis" id="cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricSearchLatencyP50InMillis"></a>
 
 ```typescript
@@ -43622,7 +43889,13 @@ public metricSearchLatencyP90InMillis(): Metric | MathExpression
 public metricSearchLatencyP99InMillis(): Metric | MathExpression
 ```
 
-##### `metricTps` <a name="metricTps" id="cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricTps"></a>
+##### `metricSearchRate` <a name="metricSearchRate" id="cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricSearchRate"></a>
+
+```typescript
+public metricSearchRate(): Metric | MathExpression
+```
+
+##### ~~`metricTps`~~ <a name="metricTps" id="cdk-monitoring-constructs.OpenSearchClusterMetricFactory.metricTps"></a>
 
 ```typescript
 public metricTps(): Metric | MathExpression
@@ -48054,6 +48327,43 @@ Returns all widgets.
 These should go to the detailed service dashboard.
 
 
+### IEC2MetricFactoryStrategy <a name="IEC2MetricFactoryStrategy" id="cdk-monitoring-constructs.IEC2MetricFactoryStrategy"></a>
+
+- *Implemented By:* <a href="#cdk-monitoring-constructs.IEC2MetricFactoryStrategy">IEC2MetricFactoryStrategy</a>
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#cdk-monitoring-constructs.IEC2MetricFactoryStrategy.createMetrics">createMetrics</a></code> | *No description.* |
+
+---
+
+##### `createMetrics` <a name="createMetrics" id="cdk-monitoring-constructs.IEC2MetricFactoryStrategy.createMetrics"></a>
+
+```typescript
+public createMetrics(metricFactory: MetricFactory, metricName: string, statistic: MetricStatistic): IMetric[]
+```
+
+###### `metricFactory`<sup>Required</sup> <a name="metricFactory" id="cdk-monitoring-constructs.IEC2MetricFactoryStrategy.createMetrics.parameter.metricFactory"></a>
+
+- *Type:* <a href="#cdk-monitoring-constructs.MetricFactory">MetricFactory</a>
+
+---
+
+###### `metricName`<sup>Required</sup> <a name="metricName" id="cdk-monitoring-constructs.IEC2MetricFactoryStrategy.createMetrics.parameter.metricName"></a>
+
+- *Type:* string
+
+---
+
+###### `statistic`<sup>Required</sup> <a name="statistic" id="cdk-monitoring-constructs.IEC2MetricFactoryStrategy.createMetrics.parameter.statistic"></a>
+
+- *Type:* <a href="#cdk-monitoring-constructs.MetricStatistic">MetricStatistic</a>
+
+---
+
+
 ### ILoadBalancerMetricFactory <a name="ILoadBalancerMetricFactory" id="cdk-monitoring-constructs.ILoadBalancerMetricFactory"></a>
 
 - *Implemented By:* <a href="#cdk-monitoring-constructs.ApplicationLoadBalancerMetricFactory">ApplicationLoadBalancerMetricFactory</a>, <a href="#cdk-monitoring-constructs.NetworkLoadBalancerMetricFactory">NetworkLoadBalancerMetricFactory</a>, <a href="#cdk-monitoring-constructs.ILoadBalancerMetricFactory">ILoadBalancerMetricFactory</a>
diff --git a/lib/common/metric/MetricFactory.ts b/lib/common/metric/MetricFactory.ts
index 57932826..5a985993 100644
--- a/lib/common/metric/MetricFactory.ts
+++ b/lib/common/metric/MetricFactory.ts
@@ -334,7 +334,7 @@ export class MetricFactory {
           labelPrefix === "Invocations" ||
           labelPrefix === "Transactions"
         ) {
-          // currently kept as "TPS" to reduce number of snapshot changes
+          // currently, kept as "TPS" to reduce number of snapshot changes
           perSecondLabel = `TPS${labelAppendix}`;
         }
         return this.createMetricMath(
diff --git a/lib/monitoring/aws-apigateway/ApiGatewayMetricFactory.ts b/lib/monitoring/aws-apigateway/ApiGatewayMetricFactory.ts
index 3c3a48fd..c63acafc 100644
--- a/lib/monitoring/aws-apigateway/ApiGatewayMetricFactory.ts
+++ b/lib/monitoring/aws-apigateway/ApiGatewayMetricFactory.ts
@@ -61,8 +61,10 @@ export class ApiGatewayMetricFactory {
     };
   }
 
+  /**
+   * @deprecated use metricInvocationRate
+   */
   metricTps() {
-    // TODO: rename to metricInvocationRate and use rateComputationMethod
     return this.metricFactory.toRate(
       this.metricInvocationCount(),
       RateComputationMethod.PER_SECOND,
@@ -72,6 +74,16 @@ export class ApiGatewayMetricFactory {
     );
   }
 
+  metricInvocationRate() {
+    return this.metricFactory.toRate(
+      this.metricInvocationCount(),
+      this.rateComputationMethod,
+      false,
+      "requests",
+      this.fillTpsWithZeroes
+    );
+  }
+
   metricInvocationCount() {
     return this.metricFactory.createMetric(
       "Count",
diff --git a/lib/monitoring/aws-apigatewayv2/ApiGatewayV2HttpApiMetricFactory.ts b/lib/monitoring/aws-apigatewayv2/ApiGatewayV2HttpApiMetricFactory.ts
index 5f5349a4..57a6f07d 100644
--- a/lib/monitoring/aws-apigatewayv2/ApiGatewayV2HttpApiMetricFactory.ts
+++ b/lib/monitoring/aws-apigatewayv2/ApiGatewayV2HttpApiMetricFactory.ts
@@ -58,8 +58,10 @@ export class ApiGatewayV2HttpApiMetricFactory {
     };
   }
 
+  /**
+   * @deprecated use metricInvocationRate
+   */
   metricTps() {
-    // TODO: rename to metricInvocationRate and use rateComputationMethod
     return this.metricFactory.toRate(
       this.metricInvocationCount(),
       RateComputationMethod.PER_SECOND,
@@ -68,6 +70,15 @@ export class ApiGatewayV2HttpApiMetricFactory {
     );
   }
 
+  metricInvocationRate() {
+    return this.metricFactory.toRate(
+      this.metricInvocationCount(),
+      this.rateComputationMethod,
+      false,
+      "requests"
+    );
+  }
+
   metricInvocationCount() {
     return this.metricFactory.createMetric(
       "Count",
diff --git a/lib/monitoring/aws-apigatewayv2/ApiGatewayV2HttpApiMonitoring.ts b/lib/monitoring/aws-apigatewayv2/ApiGatewayV2HttpApiMonitoring.ts
index d0bbd287..be102590 100644
--- a/lib/monitoring/aws-apigatewayv2/ApiGatewayV2HttpApiMonitoring.ts
+++ b/lib/monitoring/aws-apigatewayv2/ApiGatewayV2HttpApiMonitoring.ts
@@ -369,7 +369,7 @@ export class ApiGatewayV2HttpApiMonitoring extends Monitoring {
       height,
       title: "TPS",
       left: [this.tpsMetric],
-      leftYAxis: CountAxisFromZero,
+      leftYAxis: RateAxisFromZero,
       leftAnnotations: this.tpsAnnotations,
     });
   }
diff --git a/lib/monitoring/aws-appsync/AppSyncMetricFactory.ts b/lib/monitoring/aws-appsync/AppSyncMetricFactory.ts
index 2728f8e2..1357edac 100644
--- a/lib/monitoring/aws-appsync/AppSyncMetricFactory.ts
+++ b/lib/monitoring/aws-appsync/AppSyncMetricFactory.ts
@@ -42,8 +42,10 @@ export class AppSyncMetricFactory {
     };
   }
 
+  /**
+   * @deprecated use metricRequestRate
+   */
   metricTps() {
-    // TODO: rename to metricInvocationRate and use rateComputationMethod
     return this.metricFactory.toRate(
       this.metricRequestCount(),
       RateComputationMethod.PER_SECOND,
@@ -53,6 +55,16 @@ export class AppSyncMetricFactory {
     );
   }
 
+  metricRequestRate() {
+    return this.metricFactory.toRate(
+      this.metricRequestCount(),
+      this.rateComputationMethod,
+      true,
+      "requests",
+      this.fillTpsWithZeroes
+    );
+  }
+
   metricRequestCount() {
     return this.metricFactory.createMetric(
       "Latency",
diff --git a/lib/monitoring/aws-cloudfront/CloudFrontDistributionMetricFactory.ts b/lib/monitoring/aws-cloudfront/CloudFrontDistributionMetricFactory.ts
index b57c083f..b4a1aa9e 100644
--- a/lib/monitoring/aws-cloudfront/CloudFrontDistributionMetricFactory.ts
+++ b/lib/monitoring/aws-cloudfront/CloudFrontDistributionMetricFactory.ts
@@ -17,6 +17,10 @@ export interface CloudFrontDistributionMetricFactoryProps {
    * @default true
    */
   readonly fillTpsWithZeroes?: boolean;
+  /**
+   * @default average
+   */
+  readonly rateComputationMethod?: RateComputationMethod;
 }
 
 /**
@@ -27,6 +31,7 @@ export class CloudFrontDistributionMetricFactory {
   private readonly metricFactory: MetricFactory;
   private readonly fillTpsWithZeroes: boolean;
   private readonly dimensions: DimensionHash;
+  private readonly rateComputationMethod: RateComputationMethod;
 
   constructor(
     metricFactory: MetricFactory,
@@ -34,6 +39,8 @@ export class CloudFrontDistributionMetricFactory {
   ) {
     this.metricFactory = metricFactory;
     this.fillTpsWithZeroes = props.fillTpsWithZeroes ?? true;
+    this.rateComputationMethod =
+      props.rateComputationMethod ?? RateComputationMethod.AVERAGE;
     this.dimensions = {
       DistributionId: props.distribution.distributionId,
       Region: CloudFrontGlobalRegion,
@@ -53,8 +60,20 @@ export class CloudFrontDistributionMetricFactory {
       .with({ region: CloudFrontDefaultMetricRegion });
   }
 
+  metricRequestRate() {
+    return this.metricFactory.toRate(
+      this.metricRequestCount(),
+      this.rateComputationMethod,
+      false,
+      "requests",
+      this.fillTpsWithZeroes
+    );
+  }
+
+  /**
+   * @deprecated use metricRequestRate
+   */
   metricRequestTps() {
-    // TODO: rename to metricInvocationRate and use rateComputationMethod
     return this.metricFactory.toRate(
       this.metricRequestCount(),
       RateComputationMethod.PER_SECOND,
diff --git a/lib/monitoring/aws-cloudfront/CloudFrontDistributionMonitoring.ts b/lib/monitoring/aws-cloudfront/CloudFrontDistributionMonitoring.ts
index 6ddb4465..0f900c33 100644
--- a/lib/monitoring/aws-cloudfront/CloudFrontDistributionMonitoring.ts
+++ b/lib/monitoring/aws-cloudfront/CloudFrontDistributionMonitoring.ts
@@ -7,7 +7,6 @@ import {
 import {
   AlarmFactory,
   BaseMonitoringProps,
-  CountAxisFromZero,
   DefaultGraphWidgetHeight,
   DefaultSummaryWidgetHeight,
   ErrorAlarmFactory,
@@ -184,7 +183,7 @@ export class CloudFrontDistributionMonitoring extends Monitoring {
       height,
       title: "TPS",
       left: [this.tpsMetric],
-      leftYAxis: CountAxisFromZero,
+      leftYAxis: RateAxisFromZero,
       leftAnnotations: this.tpsAnnotations,
     });
   }
diff --git a/lib/monitoring/aws-ec2/EC2MetricFactory.ts b/lib/monitoring/aws-ec2/EC2MetricFactory.ts
index 9ca042e8..08af79b5 100644
--- a/lib/monitoring/aws-ec2/EC2MetricFactory.ts
+++ b/lib/monitoring/aws-ec2/EC2MetricFactory.ts
@@ -1,22 +1,150 @@
 import { IAutoScalingGroup } from "monocdk/aws-autoscaling";
-import { DimensionHash } from "monocdk/aws-cloudwatch";
+import { DimensionHash, IMetric } from "monocdk/aws-cloudwatch";
 
 import { MetricFactory, MetricStatistic } from "../../common";
 
 const EC2Namespace = "AWS/EC2";
 
-export class EC2MetricFactory {
-  protected readonly metricFactory: MetricFactory;
-  protected readonly autoScalingGroup?: IAutoScalingGroup;
+export interface IEC2MetricFactoryStrategy {
+  createMetrics(
+    metricFactory: MetricFactory,
+    metricName: string,
+    statistic: MetricStatistic
+  ): IMetric[];
+}
+
+/**
+ * Creates a single metric for the whole ASG.
+ */
+class AutoScalingGroupStrategy implements IEC2MetricFactoryStrategy {
+  protected autoScalingGroup: IAutoScalingGroup;
+
+  constructor(autoScalingGroup: IAutoScalingGroup) {
+    this.autoScalingGroup = autoScalingGroup;
+  }
 
-  constructor(
+  createMetrics(
     metricFactory: MetricFactory,
-    autoScalingGroup?: IAutoScalingGroup
+    metricName: string,
+    statistic: MetricStatistic
   ) {
-    this.metricFactory = metricFactory;
+    return [
+      metricFactory.createMetric(
+        metricName,
+        statistic,
+        undefined,
+        resolveDimensions(this.autoScalingGroup, undefined),
+        undefined,
+        EC2Namespace
+      ),
+    ];
+  }
+}
+
+/**
+ * Creates multiple metrics (one for each instance) with an optional ASG filter.
+ */
+class SelectedInstancesStrategy implements IEC2MetricFactoryStrategy {
+  protected instanceIds: string[];
+  protected autoScalingGroup?: IAutoScalingGroup;
+
+  constructor(instanceIds: string[], autoScalingGroup?: IAutoScalingGroup) {
+    this.instanceIds = instanceIds;
     this.autoScalingGroup = autoScalingGroup;
   }
 
+  createMetrics(
+    metricFactory: MetricFactory,
+    metricName: string,
+    statistic: MetricStatistic
+  ) {
+    return this.instanceIds.map((instanceId) => {
+      return metricFactory.createMetric(
+        metricName,
+        statistic,
+        `${metricName} (${instanceId})`,
+        resolveDimensions(this.autoScalingGroup, instanceId),
+        undefined,
+        EC2Namespace
+      );
+    });
+  }
+}
+
+/**
+ * Creates a single metric search expression for all instances.
+ */
+class AllInstancesStrategy implements IEC2MetricFactoryStrategy {
+  createMetrics(
+    metricFactory: MetricFactory,
+    metricName: string,
+    statistic: MetricStatistic
+  ) {
+    return [
+      metricFactory.createMetricSearch(
+        `MetricName="${metricName}"`,
+        { InstanceId: undefined as unknown as string },
+        statistic,
+        EC2Namespace
+      ),
+    ];
+  }
+}
+
+function resolveDimensions(
+  autoScalingGroup?: IAutoScalingGroup,
+  instanceId?: string
+): DimensionHash {
+  const dimensions: DimensionHash = {};
+  if (autoScalingGroup) {
+    dimensions.AutoScalingGroupName = autoScalingGroup.autoScalingGroupName;
+  }
+  if (instanceId) {
+    dimensions.InstanceId = instanceId;
+  }
+  return dimensions;
+}
+
+function resolveStrategy(
+  props: EC2MetricFactoryProps
+): IEC2MetricFactoryStrategy {
+  if (props.instanceIds) {
+    // instance filter + optional ASG
+    return new SelectedInstancesStrategy(
+      props.instanceIds,
+      props.autoScalingGroup
+    );
+  } else if (props.autoScalingGroup) {
+    // ASG only
+    return new AutoScalingGroupStrategy(props.autoScalingGroup);
+  } else {
+    // all instances
+    return new AllInstancesStrategy();
+  }
+}
+
+export interface EC2MetricFactoryProps {
+  /**
+   * Auto-Scaling Group to monitor.
+   * @default no Auto-Scaling Group filter
+   */
+  readonly autoScalingGroup?: IAutoScalingGroup;
+  /**
+   * Selected IDs of EC2 instances to monitor.
+   * @default no instance filter
+   */
+  readonly instanceIds?: string[];
+}
+
+export class EC2MetricFactory {
+  protected readonly metricFactory: MetricFactory;
+  protected readonly strategy: IEC2MetricFactoryStrategy;
+
+  constructor(metricFactory: MetricFactory, props: EC2MetricFactoryProps) {
+    this.metricFactory = metricFactory;
+    this.strategy = resolveStrategy(props);
+  }
+
   /**
    * The percentage of allocated EC2 compute units that are currently in use on the instance.
    * This metric identifies the processing power required to run an application on a selected instance.
@@ -24,7 +152,7 @@ export class EC2MetricFactory {
    * CloudWatch when the instance is not allocated a full processor core.
    */
   metricAverageCpuUtilisationPercent() {
-    return this.createMetric("CPUUtilization", MetricStatistic.AVERAGE);
+    return this.createMetrics("CPUUtilization", MetricStatistic.AVERAGE);
   }
 
   /**
@@ -33,7 +161,7 @@ export class EC2MetricFactory {
    * This can be used to determine the speed of the application.
    */
   metricAverageDiskReadBytes() {
-    return this.createMetric("DiskReadBytes", MetricStatistic.AVERAGE);
+    return this.createMetrics("DiskReadBytes", MetricStatistic.AVERAGE);
   }
 
   /**
@@ -42,21 +170,21 @@ export class EC2MetricFactory {
    * This can be used to determine the speed of the application.
    */
   metricAverageDiskWriteBytes() {
-    return this.createMetric("DiskWriteBytes", MetricStatistic.AVERAGE);
+    return this.createMetrics("DiskWriteBytes", MetricStatistic.AVERAGE);
   }
 
   /**
    * Completed read operations from all instance store volumes available to the instance in a specified period of time.
    */
   metricAverageDiskReadOps() {
-    return this.createMetric("DiskReadOps", MetricStatistic.AVERAGE);
+    return this.createMetrics("DiskReadOps", MetricStatistic.AVERAGE);
   }
 
   /**
    * Completed write operations to all instance store volumes available to the instance in a specified period of time.
    */
   metricAverageDiskWriteOps() {
-    return this.createMetric("DiskWriteOps", MetricStatistic.AVERAGE);
+    return this.createMetrics("DiskWriteOps", MetricStatistic.AVERAGE);
   }
 
   /**
@@ -64,7 +192,7 @@ export class EC2MetricFactory {
    * This metric identifies the volume of incoming network traffic to a single instance.
    */
   metricAverageNetworkInRateBytes() {
-    return this.createMetric("NetworkIn", MetricStatistic.AVERAGE);
+    return this.createMetrics("NetworkIn", MetricStatistic.AVERAGE);
   }
 
   /**
@@ -72,44 +200,14 @@ export class EC2MetricFactory {
    * This metric identifies the volume of outgoing network traffic from a single instance.
    */
   metricAverageNetworkOutRateBytes() {
-    return this.createMetric("NetworkOut", MetricStatistic.AVERAGE);
+    return this.createMetrics("NetworkOut", MetricStatistic.AVERAGE);
   }
 
-  private createMetric(metricName: string, statistic: MetricStatistic) {
-    if (this.autoScalingGroup) {
-      return this.metricForAutoScalingGroup(metricName, statistic);
-    }
-    return this.metricForAllInstances(metricName, statistic);
-  }
-
-  private metricForAutoScalingGroup(
-    metricName: string,
-    statistic: MetricStatistic
-  ) {
-    const dimensions: DimensionHash = {};
-    if (this.autoScalingGroup) {
-      dimensions.AutoScalingGroupName =
-        this.autoScalingGroup.autoScalingGroupName;
-    }
-    return this.metricFactory.createMetric(
+  private createMetrics(metricName: string, statistic: MetricStatistic) {
+    return this.strategy.createMetrics(
+      this.metricFactory,
       metricName,
-      statistic,
-      undefined,
-      dimensions,
-      undefined,
-      EC2Namespace
-    );
-  }
-
-  private metricForAllInstances(
-    metricName: string,
-    statistic: MetricStatistic
-  ) {
-    return this.metricFactory.createMetricSearch(
-      `MetricName="${metricName}"`,
-      { InstanceId: undefined },
-      statistic,
-      EC2Namespace
+      statistic
     );
   }
 }
diff --git a/lib/monitoring/aws-ec2/EC2Monitoring.ts b/lib/monitoring/aws-ec2/EC2Monitoring.ts
index 181b43bd..3d251a2d 100644
--- a/lib/monitoring/aws-ec2/EC2Monitoring.ts
+++ b/lib/monitoring/aws-ec2/EC2Monitoring.ts
@@ -1,4 +1,3 @@
-import { IAutoScalingGroup } from "monocdk/aws-autoscaling";
 import { GraphWidget, IMetric, IWidget } from "monocdk/aws-cloudwatch";
 
 import {
@@ -17,11 +16,11 @@ import {
   MonitoringHeaderWidget,
   MonitoringNamingStrategy,
 } from "../../dashboard";
-import { EC2MetricFactory } from "./EC2MetricFactory";
+import { EC2MetricFactory, EC2MetricFactoryProps } from "./EC2MetricFactory";
 
-export interface EC2MonitoringOptions extends BaseMonitoringProps {
-  readonly autoScalingGroup?: IAutoScalingGroup;
-}
+export interface EC2MonitoringOptions
+  extends EC2MetricFactoryProps,
+    BaseMonitoringProps {}
 
 export interface EC2MonitoringProps extends EC2MonitoringOptions {}
 
@@ -29,13 +28,13 @@ export class EC2Monitoring extends Monitoring {
   protected readonly family: string;
   protected readonly title: string;
 
-  protected readonly cpuUtilisationMetric: IMetric;
-  protected readonly diskReadBytesMetric: IMetric;
-  protected readonly diskWriteBytesMetric: IMetric;
-  protected readonly diskReadOpsMetric: IMetric;
-  protected readonly diskWriteOpsMetric: IMetric;
-  protected readonly networkInMetric: IMetric;
-  protected readonly networkOutMetric: IMetric;
+  protected readonly cpuUtilisationMetrics: IMetric[];
+  protected readonly diskReadBytesMetrics: IMetric[];
+  protected readonly diskWriteBytesMetrics: IMetric[];
+  protected readonly diskReadOpsMetrics: IMetric[];
+  protected readonly diskWriteOpsMetrics: IMetric[];
+  protected readonly networkInMetrics: IMetric[];
+  protected readonly networkOutMetrics: IMetric[];
 
   constructor(scope: MonitoringScope, props: EC2MonitoringProps) {
     super(scope, props);
@@ -52,16 +51,16 @@ export class EC2Monitoring extends Monitoring {
 
     const metricFactory = new EC2MetricFactory(
       scope.createMetricFactory(),
-      props.autoScalingGroup
+      props
     );
-    this.cpuUtilisationMetric =
+    this.cpuUtilisationMetrics =
       metricFactory.metricAverageCpuUtilisationPercent();
-    this.diskReadBytesMetric = metricFactory.metricAverageDiskReadBytes();
-    this.diskWriteBytesMetric = metricFactory.metricAverageDiskWriteBytes();
-    this.diskReadOpsMetric = metricFactory.metricAverageDiskReadOps();
-    this.diskWriteOpsMetric = metricFactory.metricAverageDiskWriteOps();
-    this.networkInMetric = metricFactory.metricAverageNetworkInRateBytes();
-    this.networkOutMetric = metricFactory.metricAverageNetworkOutRateBytes();
+    this.diskReadBytesMetrics = metricFactory.metricAverageDiskReadBytes();
+    this.diskWriteBytesMetrics = metricFactory.metricAverageDiskWriteBytes();
+    this.diskReadOpsMetrics = metricFactory.metricAverageDiskReadOps();
+    this.diskWriteOpsMetrics = metricFactory.metricAverageDiskWriteOps();
+    this.networkInMetrics = metricFactory.metricAverageNetworkInRateBytes();
+    this.networkOutMetrics = metricFactory.metricAverageNetworkOutRateBytes();
   }
 
   summaryWidgets(): IWidget[] {
@@ -104,7 +103,7 @@ export class EC2Monitoring extends Monitoring {
       width,
       height,
       title: "CPU Utilization",
-      left: [this.cpuUtilisationMetric],
+      left: [...this.cpuUtilisationMetrics],
       leftYAxis: PercentageAxisFromZeroToHundred,
     });
   }
@@ -114,7 +113,7 @@ export class EC2Monitoring extends Monitoring {
       width,
       height,
       title: "Disk - Bytes",
-      left: [this.diskReadBytesMetric, this.diskWriteBytesMetric],
+      left: [...this.diskReadBytesMetrics, ...this.diskWriteBytesMetrics],
       leftYAxis: SizeAxisBytesFromZero,
     });
   }
@@ -124,7 +123,7 @@ export class EC2Monitoring extends Monitoring {
       width,
       height,
       title: "Disk - OPS",
-      left: [this.diskReadOpsMetric, this.diskWriteOpsMetric],
+      left: [...this.diskReadOpsMetrics, ...this.diskWriteOpsMetrics],
       leftYAxis: CountAxisFromZero,
     });
   }
@@ -134,7 +133,7 @@ export class EC2Monitoring extends Monitoring {
       width,
       height,
       title: "Network",
-      left: [this.networkInMetric, this.networkOutMetric],
+      left: [...this.networkInMetrics, ...this.networkOutMetrics],
       leftYAxis: SizeAxisBytesFromZero,
     });
   }
diff --git a/lib/monitoring/aws-glue/GlueJobMetricFactory.ts b/lib/monitoring/aws-glue/GlueJobMetricFactory.ts
index d5eef876..63a4814a 100644
--- a/lib/monitoring/aws-glue/GlueJobMetricFactory.ts
+++ b/lib/monitoring/aws-glue/GlueJobMetricFactory.ts
@@ -8,16 +8,27 @@ import {
 
 const GlueNamespace = "Glue";
 
+export interface GlueJobMetricFactoryProps {
+  readonly jobName: string;
+  /**
+   * @default average
+   */
+  readonly rateComputationMethod?: RateComputationMethod;
+}
+
 export class GlueJobMetricFactory {
   protected readonly metricFactory: MetricFactory;
   protected readonly dimensions: DimensionHash;
+  protected readonly rateComputationMethod: RateComputationMethod;
 
-  constructor(metricFactory: MetricFactory, jobName: string) {
+  constructor(metricFactory: MetricFactory, props: GlueJobMetricFactoryProps) {
     this.metricFactory = metricFactory;
+    this.rateComputationMethod =
+      props.rateComputationMethod ?? RateComputationMethod.AVERAGE;
     this.dimensions = {
       Type: "gauge",
       JobRunId: "ALL",
-      JobName: jobName,
+      JobName: props.jobName,
     };
   }
 
@@ -112,7 +123,7 @@ export class GlueJobMetricFactory {
   metricFailedTasksRate() {
     return this.metricFactory.toRate(
       this.metricFailedTasksSum(),
-      RateComputationMethod.AVERAGE,
+      this.rateComputationMethod,
       true,
       "killed",
       false
@@ -133,7 +144,7 @@ export class GlueJobMetricFactory {
   metricKilledTasksRate() {
     return this.metricFactory.toRate(
       this.metricKilledTasksSum(),
-      RateComputationMethod.AVERAGE,
+      this.rateComputationMethod,
       true,
       "killed",
       false
diff --git a/lib/monitoring/aws-glue/GlueJobMonitoring.ts b/lib/monitoring/aws-glue/GlueJobMonitoring.ts
index 49317a10..cc2ad6f8 100644
--- a/lib/monitoring/aws-glue/GlueJobMonitoring.ts
+++ b/lib/monitoring/aws-glue/GlueJobMonitoring.ts
@@ -28,18 +28,21 @@ import {
   MonitoringHeaderWidget,
   MonitoringNamingStrategy,
 } from "../../dashboard";
-import { GlueJobMetricFactory } from "./GlueJobMetricFactory";
+import {
+  GlueJobMetricFactory,
+  GlueJobMetricFactoryProps,
+} from "./GlueJobMetricFactory";
 
-export interface GlueJobMonitoringOptions extends BaseMonitoringProps {
+export interface GlueJobMonitoringOptions
+  extends GlueJobMetricFactoryProps,
+    BaseMonitoringProps {
   readonly addFailedTaskCountAlarm?: Record<string, ErrorCountThreshold>;
   readonly addFailedTaskRateAlarm?: Record<string, ErrorRateThreshold>;
   readonly addKilledTaskCountAlarm?: Record<string, ErrorCountThreshold>;
   readonly addKilledTaskRateAlarm?: Record<string, ErrorRateThreshold>;
 }
 
-export interface GlueJobMonitoringProps extends GlueJobMonitoringOptions {
-  readonly jobName: string;
-}
+export interface GlueJobMonitoringProps extends GlueJobMonitoringOptions {}
 
 export class GlueJobMonitoring extends Monitoring {
   protected readonly title: string;
@@ -74,7 +77,7 @@ export class GlueJobMonitoring extends Monitoring {
 
     const metricFactory = new GlueJobMetricFactory(
       scope.createMetricFactory(),
-      props.jobName
+      props
     );
 
     this.alarmFactory = this.createAlarmFactory(
diff --git a/lib/monitoring/aws-lambda/LambdaFunctionMetricFactory.ts b/lib/monitoring/aws-lambda/LambdaFunctionMetricFactory.ts
index aad82e86..41f6020c 100644
--- a/lib/monitoring/aws-lambda/LambdaFunctionMetricFactory.ts
+++ b/lib/monitoring/aws-lambda/LambdaFunctionMetricFactory.ts
@@ -44,8 +44,10 @@ export class LambdaFunctionMetricFactory {
       props.rateComputationMethod ?? RateComputationMethod.AVERAGE;
   }
 
+  /**
+   * @deprecated use metricInvocationRate
+   */
   metricTps() {
-    // TODO: rename to metricInvocationRate and use rateComputationMethod
     return this.metricFactory.toRate(
       this.metricInvocationCount(),
       RateComputationMethod.PER_SECOND,
@@ -55,6 +57,16 @@ export class LambdaFunctionMetricFactory {
     );
   }
 
+  metricInvocationRate() {
+    return this.metricFactory.toRate(
+      this.metricInvocationCount(),
+      this.rateComputationMethod,
+      false,
+      "requests",
+      this.fillTpsWithZeroes
+    );
+  }
+
   metricInvocationCount() {
     return this.metricFactory.adaptMetric(
       this.lambdaFunction.metricInvocations({
diff --git a/lib/monitoring/aws-lambda/LambdaFunctionMonitoring.ts b/lib/monitoring/aws-lambda/LambdaFunctionMonitoring.ts
index acb68e9b..96126af2 100644
--- a/lib/monitoring/aws-lambda/LambdaFunctionMonitoring.ts
+++ b/lib/monitoring/aws-lambda/LambdaFunctionMonitoring.ts
@@ -522,7 +522,7 @@ export class LambdaFunctionMonitoring extends Monitoring {
       height,
       title: "TPS",
       left: [this.tpsMetric],
-      leftYAxis: CountAxisFromZero,
+      leftYAxis: RateAxisFromZero,
       leftAnnotations: this.tpsAnnotations,
     });
   }
diff --git a/lib/monitoring/aws-opensearch/OpenSearchBackportedMetrics.ts b/lib/monitoring/aws-opensearch/OpenSearchBackportedMetrics.ts
index caf109b2..190bbc45 100644
--- a/lib/monitoring/aws-opensearch/OpenSearchBackportedMetrics.ts
+++ b/lib/monitoring/aws-opensearch/OpenSearchBackportedMetrics.ts
@@ -87,14 +87,25 @@ export class OpenSearchBackportedMetrics {
    *
    * @default maximum over 1 minute
    */
-  metricClusterIndexWriteBlocked(props?: MetricOptions): Metric {
-    return this.metric("ClusterIndexWriteBlocked", {
+  metricClusterIndexWritesBlocked(props?: MetricOptions): Metric {
+    return this.metric("ClusterIndexWritesBlocked", {
       statistic: Statistic.MAXIMUM,
       period: Duration.minutes(1),
       ...props,
     });
   }
 
+  /**
+   * Metric for the cluster blocking index writes.
+   *
+   * @default maximum over 1 minute
+   *
+   * @deprecated use metricClusterIndexWritesBlocked instead.
+   */
+  metricClusterIndexWriteBlocked(props?: MetricOptions): Metric {
+    return this.metricClusterIndexWritesBlocked(props);
+  }
+
   /**
    * Metric for the number of nodes.
    *
diff --git a/lib/monitoring/aws-opensearch/OpenSearchClusterMetricFactory.ts b/lib/monitoring/aws-opensearch/OpenSearchClusterMetricFactory.ts
index d5c7e47f..c7c9131e 100644
--- a/lib/monitoring/aws-opensearch/OpenSearchClusterMetricFactory.ts
+++ b/lib/monitoring/aws-opensearch/OpenSearchClusterMetricFactory.ts
@@ -16,12 +16,17 @@ export interface OpenSearchClusterMetricFactoryProps {
    * @default true
    */
   readonly fillTpsWithZeroes?: boolean;
+  /**
+   * @default average
+   */
+  readonly rateComputationMethod?: RateComputationMethod;
 }
 
 export class OpenSearchClusterMetricFactory {
   protected readonly metricFactory: MetricFactory;
   protected readonly domainMetrics: OpenSearchBackportedMetrics;
   protected readonly fillTpsWithZeroes: boolean;
+  protected readonly rateComputationMethod: RateComputationMethod;
 
   constructor(
     metricFactory: MetricFactory,
@@ -30,15 +35,32 @@ export class OpenSearchClusterMetricFactory {
     this.metricFactory = metricFactory;
     this.domainMetrics = new OpenSearchBackportedMetrics(props.domain);
     this.fillTpsWithZeroes = props.fillTpsWithZeroes ?? true;
+    this.rateComputationMethod =
+      props.rateComputationMethod ?? RateComputationMethod.AVERAGE;
   }
 
-  metricTps() {
-    // TODO: rename to metricInvocationRate and use rateComputationMethod
-    const requests = this.domainMetrics.metric("SearchRate", {
+  metricSearchCount() {
+    return this.domainMetrics.metric("SearchRate", {
       statistic: Statistic.SUM,
     });
+  }
+
+  metricSearchRate() {
     return this.metricFactory.toRate(
-      requests,
+      this.metricSearchCount(),
+      this.rateComputationMethod,
+      false,
+      "requests",
+      this.fillTpsWithZeroes
+    );
+  }
+
+  /**
+   * @deprecated use metricSearchRate
+   */
+  metricTps() {
+    return this.metricFactory.toRate(
+      this.metricSearchCount(),
       RateComputationMethod.PER_SECOND,
       false,
       "requests",
@@ -162,14 +184,21 @@ export class OpenSearchClusterMetricFactory {
     );
   }
 
-  metricClusterIndexWriteBlocked() {
+  metricClusterIndexWritesBlocked() {
     return this.metricFactory.adaptMetric(
-      this.domainMetrics.metricClusterIndexWriteBlocked({
+      this.domainMetrics.metricClusterIndexWritesBlocked({
         label: "Index Writes Blocked",
       })
     );
   }
 
+  /**
+   * @deprecated use metricClusterIndexWritesBlocked instead
+   */
+  metricClusterIndexWriteBlocked() {
+    return this.metricClusterIndexWritesBlocked();
+  }
+
   metricNodes() {
     return this.metricFactory.adaptMetric(
       this.domainMetrics.metricNodes({
diff --git a/lib/monitoring/aws-opensearch/OpenSearchClusterMonitoring.ts b/lib/monitoring/aws-opensearch/OpenSearchClusterMonitoring.ts
index 7b5cc34b..57fc3dda 100644
--- a/lib/monitoring/aws-opensearch/OpenSearchClusterMonitoring.ts
+++ b/lib/monitoring/aws-opensearch/OpenSearchClusterMonitoring.ts
@@ -26,6 +26,7 @@ import {
   OpenSearchKmsKeyInaccessibleThreshold,
   PercentageAxisFromZeroToHundred,
   QuarterWidth,
+  RateAxisFromZero,
   ThirdWidth,
   TimeAxisMillisFromZero,
   UsageAlarmFactory,
@@ -182,7 +183,7 @@ export class OpenSearchClusterMonitoring extends Monitoring {
     this.masterJvmMemoryPressureMetric =
       metricFactory.metricMasterJvmMemoryPressure();
     this.indexWriteBlockedMetric =
-      metricFactory.metricClusterIndexWriteBlocked();
+      metricFactory.metricClusterIndexWritesBlocked();
     this.nodesMetric = metricFactory.metricNodes();
     this.automatedSnapshotFailureMetric =
       metricFactory.metricAutomatedSnapshotFailure();
@@ -402,7 +403,7 @@ export class OpenSearchClusterMonitoring extends Monitoring {
         height: DefaultSummaryWidgetHeight,
         title: "TPS",
         left: [this.tpsMetric],
-        leftYAxis: CountAxisFromZero,
+        leftYAxis: RateAxisFromZero,
       }),
       // Indexing latency
       new GraphWidget({
@@ -467,7 +468,7 @@ export class OpenSearchClusterMonitoring extends Monitoring {
           height: DefaultGraphWidgetHeight,
           title: "TPS",
           left: [this.tpsMetric],
-          leftYAxis: CountAxisFromZero,
+          leftYAxis: RateAxisFromZero,
         }),
         // Indexing latency
         new GraphWidget({


Test patch:
diff --git a/test/facade/__snapshots__/MonitoringAspect.test.ts.snap b/test/facade/__snapshots__/MonitoringAspect.test.ts.snap
index 1994a807..c499c7f3 100644
--- a/test/facade/__snapshots__/MonitoringAspect.test.ts.snap
+++ b/test/facade/__snapshots__/MonitoringAspect.test.ts.snap
@@ -276,7 +276,7 @@ Object {
               Object {
                 "Ref": "DummyHttpApi8EEBCC85",
               },
-              "\\",\\"Stage\\",\\"$default\\",{\\"label\\":\\"Invocations\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency\\",\\"region\\":\\"",
+              "\\",\\"Stage\\",\\"$default\\",{\\"label\\":\\"Invocations\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -354,7 +354,7 @@ Object {
               Object {
                 "Ref": "DummyHttpApi8EEBCC85",
               },
-              "\\",\\"Stage\\",\\"$default\\",{\\"label\\":\\"Invocations\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency\\",\\"region\\":\\"",
+              "\\",\\"Stage\\",\\"$default\\",{\\"label\\":\\"Invocations\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -1640,7 +1640,7 @@ Object {
               Object {
                 "Ref": "Distribution830FAC52",
               },
-              "\\",\\"Region\\",\\"Global\\",{\\"label\\":\\"Uploaded\\",\\"region\\":\\"us-east-1\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":7,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Hit Rate\\",\\"region\\":\\"",
+              "\\",\\"Region\\",\\"Global\\",{\\"label\\":\\"Uploaded\\",\\"region\\":\\"us-east-1\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":7,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Hit Rate\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -1722,7 +1722,7 @@ Object {
               Object {
                 "Ref": "Distribution830FAC52",
               },
-              "\\",\\"Region\\",\\"Global\\",{\\"label\\":\\"Uploaded\\",\\"region\\":\\"us-east-1\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":12,\\"height\\":6,\\"x\\":12,\\"y\\":8,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Errors (rate)\\",\\"region\\":\\"",
+              "\\",\\"Region\\",\\"Global\\",{\\"label\\":\\"Uploaded\\",\\"region\\":\\"us-east-1\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":12,\\"height\\":6,\\"x\\":12,\\"y\\":8,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Errors (rate)\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -3434,7 +3434,7 @@ Object {
               Object {
                 "Ref": "DummyFunction3BB5AE03",
               },
-              "\\",{\\"label\\":\\"Invocations\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency\\",\\"region\\":\\"",
+              "\\",{\\"label\\":\\"Invocations\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -3532,7 +3532,7 @@ Object {
               Object {
                 "Ref": "DummyFunction3BB5AE03",
               },
-              "\\",{\\"label\\":\\"Invocations\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency\\",\\"region\\":\\"",
+              "\\",{\\"label\\":\\"Invocations\\",\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -3658,7 +3658,7 @@ Object {
               Object {
                 "Ref": "DummyOSDomain7A35A5DB",
               },
-              "\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
+              "\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -3786,7 +3786,7 @@ Object {
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/ES\\",\\"ClusterIndexWriteBlocked\\",\\"ClientId\\",\\"",
+              "\\",\\"metrics\\":[[\\"AWS/ES\\",\\"ClusterIndexWritesBlocked\\",\\"ClientId\\",\\"",
               Object {
                 "Ref": "AWS::AccountId",
               },
@@ -3834,7 +3834,7 @@ Object {
               Object {
                 "Ref": "AWS::AccountId",
               },
-              "\\",\\"DomainName\\",\\"dummy-os-domain\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":12,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
+              "\\",\\"DomainName\\",\\"dummy-os-domain\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":12,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -3910,7 +3910,7 @@ Object {
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/ES\\",\\"ClusterIndexWriteBlocked\\",\\"ClientId\\",\\"",
+              "\\",\\"metrics\\":[[\\"AWS/ES\\",\\"ClusterIndexWritesBlocked\\",\\"ClientId\\",\\"",
               Object {
                 "Ref": "AWS::AccountId",
               },
@@ -3950,7 +3950,7 @@ Object {
               Object {
                 "Ref": "DummyESDomainE8B8361E",
               },
-              "\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":23,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
+              "\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":23,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -4078,7 +4078,7 @@ Object {
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/ES\\",\\"ClusterIndexWriteBlocked\\",\\"ClientId\\",\\"",
+              "\\",\\"metrics\\":[[\\"AWS/ES\\",\\"ClusterIndexWritesBlocked\\",\\"ClientId\\",\\"",
               Object {
                 "Ref": "AWS::AccountId",
               },
@@ -4126,7 +4126,7 @@ Object {
               Object {
                 "Ref": "AWS::AccountId",
               },
-              "\\",\\"DomainName\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":34,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
+              "\\",\\"DomainName\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":34,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -4202,7 +4202,7 @@ Object {
               Object {
                 "Ref": "AWS::Region",
               },
-              "\\",\\"metrics\\":[[\\"AWS/ES\\",\\"ClusterIndexWriteBlocked\\",\\"ClientId\\",\\"",
+              "\\",\\"metrics\\":[[\\"AWS/ES\\",\\"ClusterIndexWritesBlocked\\",\\"ClientId\\",\\"",
               Object {
                 "Ref": "AWS::AccountId",
               },
@@ -4256,7 +4256,7 @@ Object {
               Object {
                 "Ref": "DummyOSDomain7A35A5DB",
               },
-              "\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
+              "\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -4380,7 +4380,7 @@ Object {
               Object {
                 "Ref": "AWS::AccountId",
               },
-              "\\",\\"DomainName\\",\\"dummy-os-domain\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":6,\\"y\\":8,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
+              "\\",\\"DomainName\\",\\"dummy-os-domain\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":6,\\"y\\":8,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -4464,7 +4464,7 @@ Object {
               Object {
                 "Ref": "DummyESDomainE8B8361E",
               },
-              "\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":6,\\"y\\":15,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
+              "\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":6,\\"y\\":15,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
@@ -4588,7 +4588,7 @@ Object {
               Object {
                 "Ref": "AWS::AccountId",
               },
-              "\\",\\"DomainName\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":6,\\"y\\":22,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
+              "\\",\\"DomainName\\",{\\"stat\\":\\"Sum\\",\\"visible\\":false,\\"id\\":\\"requests\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Rate\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":6,\\"x\\":6,\\"y\\":22,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Indexing Latency\\",\\"region\\":\\"",
               Object {
                 "Ref": "AWS::Region",
               },
diff --git a/test/monitoring/aws-ec2/EC2Monitoring.test.ts b/test/monitoring/aws-ec2/EC2Monitoring.test.ts
index 9161f7bf..6c3b1dfe 100644
--- a/test/monitoring/aws-ec2/EC2Monitoring.test.ts
+++ b/test/monitoring/aws-ec2/EC2Monitoring.test.ts
@@ -3,6 +3,7 @@ import { Template } from "monocdk/assertions";
 import { AutoScalingGroup } from "monocdk/aws-autoscaling";
 
 import { EC2Monitoring } from "../../../lib";
+import { addMonitoringDashboardsToStack } from "../../utils/SnapshotUtil";
 import { TestMonitoringScope } from "../TestMonitoringScope";
 
 test("snapshot test: all instances, no alarms", () => {
@@ -10,10 +11,11 @@ test("snapshot test: all instances, no alarms", () => {
 
   const scope = new TestMonitoringScope(stack, "Scope");
 
-  new EC2Monitoring(scope, {
+  const monitoring = new EC2Monitoring(scope, {
     alarmFriendlyName: "EC2",
   });
 
+  addMonitoringDashboardsToStack(stack, monitoring);
   expect(Template.fromStack(stack)).toMatchSnapshot();
 });
 
@@ -22,7 +24,7 @@ test("snapshot test: ASG, no alarms", () => {
 
   const scope = new TestMonitoringScope(stack, "Scope");
 
-  new EC2Monitoring(scope, {
+  const monitoring = new EC2Monitoring(scope, {
     alarmFriendlyName: "EC2",
     autoScalingGroup: AutoScalingGroup.fromAutoScalingGroupName(
       stack,
@@ -31,5 +33,39 @@ test("snapshot test: ASG, no alarms", () => {
     ),
   });
 
+  addMonitoringDashboardsToStack(stack, monitoring);
+  expect(Template.fromStack(stack)).toMatchSnapshot();
+});
+
+test("snapshot test: instance filter, no alarms", () => {
+  const stack = new Stack();
+
+  const scope = new TestMonitoringScope(stack, "Scope");
+
+  const monitoring = new EC2Monitoring(scope, {
+    alarmFriendlyName: "EC2",
+    instanceIds: ["instance1", "instance2"],
+  });
+
+  addMonitoringDashboardsToStack(stack, monitoring);
+  expect(Template.fromStack(stack)).toMatchSnapshot();
+});
+
+test("snapshot test: instance filter + ASG, no alarms", () => {
+  const stack = new Stack();
+
+  const scope = new TestMonitoringScope(stack, "Scope");
+
+  const monitoring = new EC2Monitoring(scope, {
+    alarmFriendlyName: "EC2",
+    instanceIds: ["instance1", "instance2"],
+    autoScalingGroup: AutoScalingGroup.fromAutoScalingGroupName(
+      stack,
+      "DummyASG",
+      "DummyASG"
+    ),
+  });
+
+  addMonitoringDashboardsToStack(stack, monitoring);
   expect(Template.fromStack(stack)).toMatchSnapshot();
 });
diff --git a/test/monitoring/aws-ec2/__snapshots__/EC2Monitoring.test.ts.snap b/test/monitoring/aws-ec2/__snapshots__/EC2Monitoring.test.ts.snap
index 00f4aba8..64cb8599 100644
--- a/test/monitoring/aws-ec2/__snapshots__/EC2Monitoring.test.ts.snap
+++ b/test/monitoring/aws-ec2/__snapshots__/EC2Monitoring.test.ts.snap
@@ -1,5 +1,269 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`snapshot test: ASG, no alarms 1`] = `Object {}`;
+exports[`snapshot test: ASG, no alarms 1`] = `
+Object {
+  "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\\":\\"### EC2 Auto Scaling Group **DummyASG**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU Utilization\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"CPUUtilization\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - OPS\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"DiskReadOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"],[\\"AWS/EC2\\",\\"DiskWriteOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - Bytes\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"DiskReadBytes\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"],[\\"AWS/EC2\\",\\"DiskWriteBytes\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Network\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"NetworkIn\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"],[\\"AWS/EC2\\",\\"NetworkOut\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"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\\":\\"### EC2 Auto Scaling Group **DummyASG**\\"}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU Utilization\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"CPUUtilization\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - OPS\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"DiskReadOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"],[\\"AWS/EC2\\",\\"DiskWriteOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":16,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Network\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"NetworkIn\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"],[\\"AWS/EC2\\",\\"NetworkOut\\",\\"AutoScalingGroupName\\",\\"DummyASG\\"]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"showUnits\\":false}}}}]}",
+            ],
+          ],
+        },
+      },
+      "Type": "AWS::CloudWatch::Dashboard",
+    },
+  },
+}
+`;
 
-exports[`snapshot test: all instances, no alarms 1`] = `Object {}`;
+exports[`snapshot test: all instances, no alarms 1`] = `
+Object {
+  "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\\":\\"### EC2 **All Instances**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU Utilization\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"CPUUtilization\\\\\\"', 'Average', 300)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - OPS\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"DiskReadOps\\\\\\"', 'Average', 300)\\"}],[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"DiskWriteOps\\\\\\"', 'Average', 300)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - Bytes\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"DiskReadBytes\\\\\\"', 'Average', 300)\\"}],[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"DiskWriteBytes\\\\\\"', 'Average', 300)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Network\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"NetworkIn\\\\\\"', 'Average', 300)\\"}],[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"NetworkOut\\\\\\"', 'Average', 300)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"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\\":\\"### EC2 **All Instances**\\"}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU Utilization\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"CPUUtilization\\\\\\"', 'Average', 300)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - OPS\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"DiskReadOps\\\\\\"', 'Average', 300)\\"}],[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"DiskWriteOps\\\\\\"', 'Average', 300)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":16,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Network\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"NetworkIn\\\\\\"', 'Average', 300)\\"}],[{\\"label\\":\\" \\",\\"expression\\":\\"SEARCH('{AWS/EC2,InstanceId}  MetricName=\\\\\\"NetworkOut\\\\\\"', 'Average', 300)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"showUnits\\":false}}}}]}",
+            ],
+          ],
+        },
+      },
+      "Type": "AWS::CloudWatch::Dashboard",
+    },
+  },
+}
+`;
+
+exports[`snapshot test: instance filter + ASG, no alarms 1`] = `
+Object {
+  "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\\":\\"### EC2 Auto Scaling Group **DummyASG**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU Utilization\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"CPUUtilization\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"CPUUtilization (instance1)\\"}],[\\"AWS/EC2\\",\\"CPUUtilization\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"CPUUtilization (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - OPS\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"DiskReadOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskReadOps (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskReadOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskReadOps (instance2)\\"}],[\\"AWS/EC2\\",\\"DiskWriteOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskWriteOps (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskWriteOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskWriteOps (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - Bytes\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"DiskReadBytes\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskReadBytes (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskReadBytes\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskReadBytes (instance2)\\"}],[\\"AWS/EC2\\",\\"DiskWriteBytes\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskWriteBytes (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskWriteBytes\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskWriteBytes (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Network\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"NetworkIn\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"NetworkIn (instance1)\\"}],[\\"AWS/EC2\\",\\"NetworkIn\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"NetworkIn (instance2)\\"}],[\\"AWS/EC2\\",\\"NetworkOut\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"NetworkOut (instance1)\\"}],[\\"AWS/EC2\\",\\"NetworkOut\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"NetworkOut (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"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\\":\\"### EC2 Auto Scaling Group **DummyASG**\\"}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU Utilization\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"CPUUtilization\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"CPUUtilization (instance1)\\"}],[\\"AWS/EC2\\",\\"CPUUtilization\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"CPUUtilization (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - OPS\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"DiskReadOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskReadOps (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskReadOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskReadOps (instance2)\\"}],[\\"AWS/EC2\\",\\"DiskWriteOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskWriteOps (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskWriteOps\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskWriteOps (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":16,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Network\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"NetworkIn\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"NetworkIn (instance1)\\"}],[\\"AWS/EC2\\",\\"NetworkIn\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"NetworkIn (instance2)\\"}],[\\"AWS/EC2\\",\\"NetworkOut\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"NetworkOut (instance1)\\"}],[\\"AWS/EC2\\",\\"NetworkOut\\",\\"AutoScalingGroupName\\",\\"DummyASG\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"NetworkOut (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"showUnits\\":false}}}}]}",
+            ],
+          ],
+        },
+      },
+      "Type": "AWS::CloudWatch::Dashboard",
+    },
+  },
+}
+`;
+
+exports[`snapshot test: instance filter, no alarms 1`] = `
+Object {
+  "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\\":\\"### EC2 **All Instances**\\"}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU Utilization\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"CPUUtilization\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"CPUUtilization (instance1)\\"}],[\\"AWS/EC2\\",\\"CPUUtilization\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"CPUUtilization (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":6,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - OPS\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"DiskReadOps\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskReadOps (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskReadOps\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskReadOps (instance2)\\"}],[\\"AWS/EC2\\",\\"DiskWriteOps\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskWriteOps (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskWriteOps\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskWriteOps (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":12,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - Bytes\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"DiskReadBytes\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskReadBytes (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskReadBytes\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskReadBytes (instance2)\\"}],[\\"AWS/EC2\\",\\"DiskWriteBytes\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskWriteBytes (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskWriteBytes\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskWriteBytes (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":6,\\"height\\":5,\\"x\\":18,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Network\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"NetworkIn\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"NetworkIn (instance1)\\"}],[\\"AWS/EC2\\",\\"NetworkIn\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"NetworkIn (instance2)\\"}],[\\"AWS/EC2\\",\\"NetworkOut\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"NetworkOut (instance1)\\"}],[\\"AWS/EC2\\",\\"NetworkOut\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"NetworkOut (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"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\\":\\"### EC2 **All Instances**\\"}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":0,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"CPU Utilization\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"CPUUtilization\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"CPUUtilization (instance1)\\"}],[\\"AWS/EC2\\",\\"CPUUtilization\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"CPUUtilization (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"max\\":100,\\"label\\":\\"%\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":8,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Disk - OPS\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"DiskReadOps\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskReadOps (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskReadOps\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskReadOps (instance2)\\"}],[\\"AWS/EC2\\",\\"DiskWriteOps\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"DiskWriteOps (instance1)\\"}],[\\"AWS/EC2\\",\\"DiskWriteOps\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"DiskWriteOps (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"Count\\",\\"showUnits\\":false}}}},{\\"type\\":\\"metric\\",\\"width\\":8,\\"height\\":6,\\"x\\":16,\\"y\\":1,\\"properties\\":{\\"view\\":\\"timeSeries\\",\\"title\\":\\"Network\\",\\"region\\":\\"",
+              Object {
+                "Ref": "AWS::Region",
+              },
+              "\\",\\"metrics\\":[[\\"AWS/EC2\\",\\"NetworkIn\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"NetworkIn (instance1)\\"}],[\\"AWS/EC2\\",\\"NetworkIn\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"NetworkIn (instance2)\\"}],[\\"AWS/EC2\\",\\"NetworkOut\\",\\"InstanceId\\",\\"instance1\\",{\\"label\\":\\"NetworkOut (instance1)\\"}],[\\"AWS/EC2\\",\\"NetworkOut\\",\\"InstanceId\\",\\"instance2\\",{\\"label\\":\\"NetworkOut (instance2)\\"}]],\\"yAxis\\":{\\"left\\":{\\"min\\":0,\\"label\\":\\"bytes\\",\\"showUnits\\":false}}}}]}",
+            ],
+          ],
+        },
+      },
+      "Type": "AWS::CloudWatch::Dashboard",
+    },
+  },
+}
+`;