From 7cc9c6b83948221fea53fd748e52d784cd451900 Mon Sep 17 00:00:00 2001
From: phuhung273 <phuhung.tranpham@gmail.com>
Date: Wed, 5 Feb 2025 12:06:06 +0000
Subject: [PATCH 1/2] init

---
 ...dk-aws-apigatewayv2-http-stage.assets.json |  6 +--
 ...-aws-apigatewayv2-http-stage.template.json |  1 +
 .../test/http/integ.stage.js.snapshot/cdk.out |  2 +-
 .../http/integ.stage.js.snapshot/integ.json   |  2 +-
 .../integ.stage.js.snapshot/manifest.json     | 16 ++++++-
 .../http/integ.stage.js.snapshot/tree.json    | 43 +++++++++++--------
 .../aws-apigatewayv2/test/http/integ.stage.ts |  1 +
 ...s-apigatewayv2-websocket-stage.assets.json |  6 +--
 ...apigatewayv2-websocket-stage.template.json |  1 +
 .../websocket/integ.stage.js.snapshot/cdk.out |  2 +-
 .../integ.stage.js.snapshot/integ.json        |  2 +-
 .../integ.stage.js.snapshot/manifest.json     | 16 ++++++-
 .../integ.stage.js.snapshot/tree.json         | 43 +++++++++++--------
 .../test/websocket/integ.stage.ts             |  1 +
 .../aws-cdk-lib/aws-apigatewayv2/README.md    | 19 ++++++++
 .../aws-apigatewayv2/lib/common/stage.ts      |  7 +++
 .../aws-apigatewayv2/lib/http/stage.ts        |  5 ++-
 .../aws-apigatewayv2/lib/websocket/stage.ts   |  5 ++-
 .../aws-apigatewayv2/test/http/stage.test.ts  |  4 +-
 .../test/websocket/stage.test.ts              |  4 +-
 20 files changed, 130 insertions(+), 56 deletions(-)

diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.assets.json
index 54d26fb516d85..e8e4030e9bda3 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.assets.json
@@ -1,7 +1,7 @@
 {
-  "version": "36.0.0",
+  "version": "39.0.0",
   "files": {
-    "d0e21994eba50227669b2052acb6e237940781e64fc7baad9c2946a2c56d4b8d": {
+    "8a139312fcbabd6668985694bc84920a0266fbf9ed13095c117cdf1f87b97373": {
       "source": {
         "path": "aws-cdk-aws-apigatewayv2-http-stage.template.json",
         "packaging": "file"
@@ -9,7 +9,7 @@
       "destinations": {
         "current_account-current_region": {
           "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
-          "objectKey": "d0e21994eba50227669b2052acb6e237940781e64fc7baad9c2946a2c56d4b8d.json",
+          "objectKey": "8a139312fcbabd6668985694bc84920a0266fbf9ed13095c117cdf1f87b97373.json",
           "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
         }
       }
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.template.json
index e684ea62ef5e0..823f4be372aa4 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-http-stage.template.json
@@ -14,6 +14,7 @@
      "Ref": "HttpApiF5A9A8A7"
     },
     "DefaultRouteSettings": {
+     "DetailedMetricsEnabled": true,
      "ThrottlingBurstLimit": 1000,
      "ThrottlingRateLimit": 1000
     },
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/cdk.out
index 1f0068d32659a..91e1a8b9901d5 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"36.0.0"}
\ No newline at end of file
+{"version":"39.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/integ.json
index 6f3b6b3048bfd..108cff4a7691e 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/integ.json
@@ -1,5 +1,5 @@
 {
-  "version": "36.0.0",
+  "version": "39.0.0",
   "testCases": {
     "integ.stage": {
       "stacks": [
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/manifest.json
index 7619a5e497d6c..927b2f8f0c83e 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
 {
-  "version": "36.0.0",
+  "version": "39.0.0",
   "artifacts": {
     "aws-cdk-aws-apigatewayv2-http-stage.assets": {
       "type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
         "validateOnSynth": false,
         "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}",
         "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}",
-        "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d0e21994eba50227669b2052acb6e237940781e64fc7baad9c2946a2c56d4b8d.json",
+        "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/8a139312fcbabd6668985694bc84920a0266fbf9ed13095c117cdf1f87b97373.json",
         "requiresBootstrapStackVersion": 6,
         "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
         "additionalDependencies": [
@@ -34,12 +34,24 @@
         "aws-cdk-aws-apigatewayv2-http-stage.assets"
       ],
       "metadata": {
+        "/aws-cdk-aws-apigatewayv2-http-stage/HttpApi": [
+          {
+            "type": "aws:cdk:analytics:construct",
+            "data": "*"
+          }
+        ],
         "/aws-cdk-aws-apigatewayv2-http-stage/HttpApi/Resource": [
           {
             "type": "aws:cdk:logicalId",
             "data": "HttpApiF5A9A8A7"
           }
         ],
+        "/aws-cdk-aws-apigatewayv2-http-stage/HttpStageWithProperties": [
+          {
+            "type": "aws:cdk:analytics:construct",
+            "data": "*"
+          }
+        ],
         "/aws-cdk-aws-apigatewayv2-http-stage/HttpStageWithProperties/Resource": [
           {
             "type": "aws:cdk:logicalId",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/tree.json
index d51fb3fce8033..df35f6d3e5382 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.js.snapshot/tree.json
@@ -23,14 +23,17 @@
                   }
                 },
                 "constructInfo": {
-                  "fqn": "constructs.Construct",
-                  "version": "10.3.0"
+                  "fqn": "aws-cdk-lib.aws_apigatewayv2.CfnApi",
+                  "version": "0.0.0"
                 }
               }
             },
             "constructInfo": {
-              "fqn": "constructs.Construct",
-              "version": "10.3.0"
+              "fqn": "aws-cdk-lib.aws_apigatewayv2.HttpApi",
+              "version": "0.0.0",
+              "metadata": [
+                "*"
+              ]
             }
           },
           "HttpStageWithProperties": {
@@ -48,43 +51,47 @@
                     },
                     "defaultRouteSettings": {
                       "throttlingBurstLimit": 1000,
-                      "throttlingRateLimit": 1000
+                      "throttlingRateLimit": 1000,
+                      "detailedMetricsEnabled": true
                     },
                     "description": "My Stage",
                     "stageName": "$default"
                   }
                 },
                 "constructInfo": {
-                  "fqn": "constructs.Construct",
-                  "version": "10.3.0"
+                  "fqn": "aws-cdk-lib.aws_apigatewayv2.CfnStage",
+                  "version": "0.0.0"
                 }
               }
             },
             "constructInfo": {
-              "fqn": "constructs.Construct",
-              "version": "10.3.0"
+              "fqn": "aws-cdk-lib.aws_apigatewayv2.HttpStage",
+              "version": "0.0.0",
+              "metadata": [
+                "*"
+              ]
             }
           },
           "BootstrapVersion": {
             "id": "BootstrapVersion",
             "path": "aws-cdk-aws-apigatewayv2-http-stage/BootstrapVersion",
             "constructInfo": {
-              "fqn": "constructs.Construct",
-              "version": "10.3.0"
+              "fqn": "aws-cdk-lib.CfnParameter",
+              "version": "0.0.0"
             }
           },
           "CheckBootstrapVersion": {
             "id": "CheckBootstrapVersion",
             "path": "aws-cdk-aws-apigatewayv2-http-stage/CheckBootstrapVersion",
             "constructInfo": {
-              "fqn": "constructs.Construct",
-              "version": "10.3.0"
+              "fqn": "aws-cdk-lib.CfnRule",
+              "version": "0.0.0"
             }
           }
         },
         "constructInfo": {
-          "fqn": "constructs.Construct",
-          "version": "10.3.0"
+          "fqn": "aws-cdk-lib.Stack",
+          "version": "0.0.0"
         }
       },
       "Tree": {
@@ -92,13 +99,13 @@
         "path": "Tree",
         "constructInfo": {
           "fqn": "constructs.Construct",
-          "version": "10.3.0"
+          "version": "10.4.2"
         }
       }
     },
     "constructInfo": {
-      "fqn": "constructs.Construct",
-      "version": "10.3.0"
+      "fqn": "aws-cdk-lib.App",
+      "version": "0.0.0"
     }
   }
 }
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.ts
index bf3bec4e11a04..7c745d8dfa603 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.ts
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/http/integ.stage.ts
@@ -12,6 +12,7 @@ new apigw.HttpStage(stack, 'HttpStageWithProperties', {
     rateLimit: 1000,
     burstLimit: 1000,
   },
+  detailedMetricsEnabled: true,
   description: 'My Stage',
 });
 
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.assets.json
index 772dd4683f795..b4cf64f990680 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.assets.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.assets.json
@@ -1,7 +1,7 @@
 {
-  "version": "36.0.0",
+  "version": "39.0.0",
   "files": {
-    "02efbccda911967e201733b39679d97db7a1c0b2ee2c60da90fb7fe7b4352502": {
+    "f395ca0d527831a9bb9efb9f8596f28402b0cdf892c286ff1597977eb5faf167": {
       "source": {
         "path": "aws-cdk-aws-apigatewayv2-websocket-stage.template.json",
         "packaging": "file"
@@ -9,7 +9,7 @@
       "destinations": {
         "current_account-current_region": {
           "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
-          "objectKey": "02efbccda911967e201733b39679d97db7a1c0b2ee2c60da90fb7fe7b4352502.json",
+          "objectKey": "f395ca0d527831a9bb9efb9f8596f28402b0cdf892c286ff1597977eb5faf167.json",
           "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
         }
       }
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.template.json
index 03da37384007b..b78d128d2f6ef 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.template.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/aws-cdk-aws-apigatewayv2-websocket-stage.template.json
@@ -15,6 +15,7 @@
      "Ref": "WebSocketApi34BCF99B"
     },
     "DefaultRouteSettings": {
+     "DetailedMetricsEnabled": true,
      "ThrottlingBurstLimit": 1000,
      "ThrottlingRateLimit": 1000
     },
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/cdk.out b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/cdk.out
index 1f0068d32659a..91e1a8b9901d5 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/cdk.out
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/cdk.out
@@ -1 +1 @@
-{"version":"36.0.0"}
\ No newline at end of file
+{"version":"39.0.0"}
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/integ.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/integ.json
index d35c639b2cf4c..3ef55a716e8b4 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/integ.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/integ.json
@@ -1,5 +1,5 @@
 {
-  "version": "36.0.0",
+  "version": "39.0.0",
   "testCases": {
     "integ.stage": {
       "stacks": [
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/manifest.json
index a42e23755bdcf..2a898abd94486 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/manifest.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/manifest.json
@@ -1,5 +1,5 @@
 {
-  "version": "36.0.0",
+  "version": "39.0.0",
   "artifacts": {
     "aws-cdk-aws-apigatewayv2-websocket-stage.assets": {
       "type": "cdk:asset-manifest",
@@ -18,7 +18,7 @@
         "validateOnSynth": false,
         "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}",
         "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}",
-        "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/02efbccda911967e201733b39679d97db7a1c0b2ee2c60da90fb7fe7b4352502.json",
+        "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/f395ca0d527831a9bb9efb9f8596f28402b0cdf892c286ff1597977eb5faf167.json",
         "requiresBootstrapStackVersion": 6,
         "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version",
         "additionalDependencies": [
@@ -34,12 +34,24 @@
         "aws-cdk-aws-apigatewayv2-websocket-stage.assets"
       ],
       "metadata": {
+        "/aws-cdk-aws-apigatewayv2-websocket-stage/WebSocketApi": [
+          {
+            "type": "aws:cdk:analytics:construct",
+            "data": "*"
+          }
+        ],
         "/aws-cdk-aws-apigatewayv2-websocket-stage/WebSocketApi/Resource": [
           {
             "type": "aws:cdk:logicalId",
             "data": "WebSocketApi34BCF99B"
           }
         ],
+        "/aws-cdk-aws-apigatewayv2-websocket-stage/WebSocketStage": [
+          {
+            "type": "aws:cdk:analytics:construct",
+            "data": "*"
+          }
+        ],
         "/aws-cdk-aws-apigatewayv2-websocket-stage/WebSocketStage/Resource": [
           {
             "type": "aws:cdk:logicalId",
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/tree.json
index c1e47bf0a01af..c4156995352eb 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/tree.json
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.js.snapshot/tree.json
@@ -24,14 +24,17 @@
                   }
                 },
                 "constructInfo": {
-                  "fqn": "constructs.Construct",
-                  "version": "10.3.0"
+                  "fqn": "aws-cdk-lib.aws_apigatewayv2.CfnApi",
+                  "version": "0.0.0"
                 }
               }
             },
             "constructInfo": {
-              "fqn": "constructs.Construct",
-              "version": "10.3.0"
+              "fqn": "aws-cdk-lib.aws_apigatewayv2.WebSocketApi",
+              "version": "0.0.0",
+              "metadata": [
+                "*"
+              ]
             }
           },
           "WebSocketStage": {
@@ -49,43 +52,47 @@
                     },
                     "defaultRouteSettings": {
                       "throttlingBurstLimit": 1000,
-                      "throttlingRateLimit": 1000
+                      "throttlingRateLimit": 1000,
+                      "detailedMetricsEnabled": true
                     },
                     "description": "My Stage",
                     "stageName": "dev"
                   }
                 },
                 "constructInfo": {
-                  "fqn": "constructs.Construct",
-                  "version": "10.3.0"
+                  "fqn": "aws-cdk-lib.aws_apigatewayv2.CfnStage",
+                  "version": "0.0.0"
                 }
               }
             },
             "constructInfo": {
-              "fqn": "constructs.Construct",
-              "version": "10.3.0"
+              "fqn": "aws-cdk-lib.aws_apigatewayv2.WebSocketStage",
+              "version": "0.0.0",
+              "metadata": [
+                "*"
+              ]
             }
           },
           "BootstrapVersion": {
             "id": "BootstrapVersion",
             "path": "aws-cdk-aws-apigatewayv2-websocket-stage/BootstrapVersion",
             "constructInfo": {
-              "fqn": "constructs.Construct",
-              "version": "10.3.0"
+              "fqn": "aws-cdk-lib.CfnParameter",
+              "version": "0.0.0"
             }
           },
           "CheckBootstrapVersion": {
             "id": "CheckBootstrapVersion",
             "path": "aws-cdk-aws-apigatewayv2-websocket-stage/CheckBootstrapVersion",
             "constructInfo": {
-              "fqn": "constructs.Construct",
-              "version": "10.3.0"
+              "fqn": "aws-cdk-lib.CfnRule",
+              "version": "0.0.0"
             }
           }
         },
         "constructInfo": {
-          "fqn": "constructs.Construct",
-          "version": "10.3.0"
+          "fqn": "aws-cdk-lib.Stack",
+          "version": "0.0.0"
         }
       },
       "Tree": {
@@ -93,13 +100,13 @@
         "path": "Tree",
         "constructInfo": {
           "fqn": "constructs.Construct",
-          "version": "10.3.0"
+          "version": "10.4.2"
         }
       }
     },
     "constructInfo": {
-      "fqn": "constructs.Construct",
-      "version": "10.3.0"
+      "fqn": "aws-cdk-lib.App",
+      "version": "0.0.0"
     }
   }
 }
\ No newline at end of file
diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.ts
index ecfff658d5f4b..1193a619fcd62 100644
--- a/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.ts
+++ b/packages/@aws-cdk-testing/framework-integ/test/aws-apigatewayv2/test/websocket/integ.stage.ts
@@ -13,6 +13,7 @@ new apigw.WebSocketStage(stack, 'WebSocketStage', {
     rateLimit: 1000,
     burstLimit: 1000,
   },
+  detailedMetricsEnabled: true,
   description: 'My Stage',
 });
 
diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/README.md b/packages/aws-cdk-lib/aws-apigatewayv2/README.md
index 90eae4cc7a05e..fe0fb367cf9b8 100644
--- a/packages/aws-cdk-lib/aws-apigatewayv2/README.md
+++ b/packages/aws-cdk-lib/aws-apigatewayv2/README.md
@@ -475,3 +475,22 @@ const webSocketApi = new apigwv2.WebSocketApi(this, 'mywsapi',{
   apiKeySelectionExpression: apigwv2.WebSocketApiKeySelectionExpression.HEADER_X_API_KEY,
 });
 ```
+
+## Common Config
+Common config for both HTTP API and WebSocket API
+
+### Route Settings
+Represents a collection of route settings.
+
+```ts
+declare const api: apigwv2.HttpApi;
+
+new apigwv2.HttpStage(this, 'Stage', {
+  httpApi: api,
+  throttle: {
+    rateLimit: 1000,
+    burstLimit: 1000,
+  },
+  detailedMetricsEnabled: true,
+});
+```
diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/lib/common/stage.ts b/packages/aws-cdk-lib/aws-apigatewayv2/lib/common/stage.ts
index 3eca733715514..be436d2332d33 100644
--- a/packages/aws-cdk-lib/aws-apigatewayv2/lib/common/stage.ts
+++ b/packages/aws-cdk-lib/aws-apigatewayv2/lib/common/stage.ts
@@ -73,6 +73,13 @@ export interface StageOptions {
    * @default - no description
    */
   readonly description?: string;
+
+  /**
+   * Specifies whether detailed metrics are enabled.
+   *
+   * @default false
+   */
+  readonly detailedMetricsEnabled?: boolean;
 }
 
 /**
diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/lib/http/stage.ts b/packages/aws-cdk-lib/aws-apigatewayv2/lib/http/stage.ts
index 4c4fafb9d7d76..85fbcd595a16c 100644
--- a/packages/aws-cdk-lib/aws-apigatewayv2/lib/http/stage.ts
+++ b/packages/aws-cdk-lib/aws-apigatewayv2/lib/http/stage.ts
@@ -171,10 +171,11 @@ export class HttpStage extends HttpStageBase {
       apiId: props.httpApi.apiId,
       stageName: this.physicalName,
       autoDeploy: props.autoDeploy,
-      defaultRouteSettings: !props.throttle ? undefined : {
+      defaultRouteSettings: props.throttle || props.detailedMetricsEnabled ? {
         throttlingBurstLimit: props.throttle?.burstLimit,
         throttlingRateLimit: props.throttle?.rateLimit,
-      },
+        detailedMetricsEnabled: props.detailedMetricsEnabled,
+      } : undefined,
       description: props.description,
     });
 
diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/lib/websocket/stage.ts b/packages/aws-cdk-lib/aws-apigatewayv2/lib/websocket/stage.ts
index 1db7bf126427f..82c53670783a4 100644
--- a/packages/aws-cdk-lib/aws-apigatewayv2/lib/websocket/stage.ts
+++ b/packages/aws-cdk-lib/aws-apigatewayv2/lib/websocket/stage.ts
@@ -95,10 +95,11 @@ export class WebSocketStage extends StageBase implements IWebSocketStage {
       apiId: props.webSocketApi.apiId,
       stageName: this.physicalName,
       autoDeploy: props.autoDeploy,
-      defaultRouteSettings: !props.throttle ? undefined : {
+      defaultRouteSettings: props.throttle || props.detailedMetricsEnabled ? {
         throttlingBurstLimit: props.throttle?.burstLimit,
         throttlingRateLimit: props.throttle?.rateLimit,
-      },
+        detailedMetricsEnabled: props.detailedMetricsEnabled,
+      } : undefined,
       description: props.description,
     });
 
diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts b/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts
index 357b4617f11ba..67cca9ecf1be3 100644
--- a/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts
+++ b/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts
@@ -164,7 +164,7 @@ describe('HttpStage with domain mapping', () => {
     expect(t).toThrow(/domainUrl is not available when no API mapping is associated with the Stage/);
   });
 
-  test('correctly sets throttle settings', () => {
+  test('correctly sets route settings', () => {
     // GIVEN
     const stack = new Stack();
     const api = new HttpApi(stack, 'Api', {
@@ -178,6 +178,7 @@ describe('HttpStage with domain mapping', () => {
         burstLimit: 1000,
         rateLimit: 1000,
       },
+      detailedMetricsEnabled: true,
     });
 
     // THEN
@@ -187,6 +188,7 @@ describe('HttpStage with domain mapping', () => {
       DefaultRouteSettings: {
         ThrottlingBurstLimit: 1000,
         ThrottlingRateLimit: 1000,
+        DetailedMetricsEnabled: true,
       },
     });
   });
diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts b/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts
index 549f7c02b2c91..7d92b1b1b0fda 100644
--- a/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts
+++ b/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts
@@ -108,7 +108,7 @@ describe('WebSocketStage', () => {
     });
   });
 
-  test('correctly sets throttle settings', () => {
+  test('correctly sets route settings', () => {
     // GIVEN
     const stack = new Stack();
     const api = new WebSocketApi(stack, 'Api');
@@ -121,6 +121,7 @@ describe('WebSocketStage', () => {
         burstLimit: 1000,
         rateLimit: 1000,
       },
+      detailedMetricsEnabled: true,
     });
 
     // THEN
@@ -130,6 +131,7 @@ describe('WebSocketStage', () => {
       DefaultRouteSettings: {
         ThrottlingBurstLimit: 1000,
         ThrottlingRateLimit: 1000,
+        DetailedMetricsEnabled: true,
       },
     });
   });

From ff5aae7d7b52afd39c3ca4e17cabbe9f5f079939 Mon Sep 17 00:00:00 2001
From: phuhung273 <phuhung.tranpham@gmail.com>
Date: Thu, 6 Feb 2025 16:00:06 +0000
Subject: [PATCH 2/2] improve unit test

---
 .../aws-apigatewayv2/test/http/stage.test.ts  | 91 ++++++++++---------
 .../test/websocket/stage.test.ts              | 70 +++++++++-----
 2 files changed, 95 insertions(+), 66 deletions(-)

diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts b/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts
index 67cca9ecf1be3..e18c374bc7c32 100644
--- a/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts
+++ b/packages/aws-cdk-lib/aws-apigatewayv2/test/http/stage.test.ts
@@ -4,13 +4,18 @@ import { Metric } from '../../../aws-cloudwatch';
 import { Stack } from '../../../core';
 import { DomainName, HttpApi, HttpStage } from '../../lib';
 
+let stack: Stack;
+let api: HttpApi;
+
+beforeEach(() => {
+  stack = new Stack();
+  api = new HttpApi(stack, 'Api', {
+    createDefaultStage: false,
+  });
+});
+
 describe('HttpStage', () => {
   test('default', () => {
-    const stack = new Stack();
-    const api = new HttpApi(stack, 'Api', {
-      createDefaultStage: false,
-    });
-
     new HttpStage(stack, 'Stage', {
       httpApi: api,
     });
@@ -22,11 +27,6 @@ describe('HttpStage', () => {
   });
 
   test('import', () => {
-    const stack = new Stack();
-    const api = new HttpApi(stack, 'Api', {
-      createDefaultStage: false,
-    });
-
     const stage = new HttpStage(stack, 'Stage', {
       httpApi: api,
     });
@@ -40,11 +40,6 @@ describe('HttpStage', () => {
   });
 
   test('url returns the correct path', () => {
-    const stack = new Stack();
-    const api = new HttpApi(stack, 'Api', {
-      createDefaultStage: false,
-    });
-
     const defaultStage = new HttpStage(stack, 'DefaultStage', {
       httpApi: api,
     });
@@ -60,10 +55,6 @@ describe('HttpStage', () => {
 
   test('get metric', () => {
     // GIVEN
-    const stack = new Stack();
-    const api = new HttpApi(stack, 'test-api', {
-      createDefaultStage: false,
-    });
     const stage = new HttpStage(stack, 'Stage', {
       httpApi: api,
     });
@@ -86,10 +77,6 @@ describe('HttpStage', () => {
 
   test('Exercise metrics', () => {
     // GIVEN
-    const stack = new Stack();
-    const api = new HttpApi(stack, 'test-api', {
-      createDefaultStage: false,
-    });
     const stage = new HttpStage(stack, 'Stage', {
       httpApi: api,
     });
@@ -123,11 +110,6 @@ describe('HttpStage with domain mapping', () => {
   const certArn = 'arn:aws:acm:us-east-1:111111111111:certificate';
 
   test('domainUrl returns the correct path', () => {
-    const stack = new Stack();
-    const api = new HttpApi(stack, 'Api', {
-      createDefaultStage: false,
-    });
-
     const dn = new DomainName(stack, 'DN', {
       domainName,
       certificate: Certificate.fromCertificateArn(stack, 'cert', certArn),
@@ -148,11 +130,6 @@ describe('HttpStage with domain mapping', () => {
   });
 
   test('domainUrl throws error if domainMapping is not configured', () => {
-    const stack = new Stack();
-    const api = new HttpApi(stack, 'Api', {
-      createDefaultStage: false,
-    });
-
     const stage = new HttpStage(stack, 'DefaultStage', {
       httpApi: api,
     });
@@ -164,13 +141,45 @@ describe('HttpStage with domain mapping', () => {
     expect(t).toThrow(/domainUrl is not available when no API mapping is associated with the Stage/);
   });
 
-  test('correctly sets route settings', () => {
-    // GIVEN
-    const stack = new Stack();
-    const api = new HttpApi(stack, 'Api', {
-      createDefaultStage: false,
+  test('correctly sets throttle settings', () => {
+    // WHEN
+    new HttpStage(stack, 'DefaultStage', {
+      httpApi: api,
+      throttle: {
+        burstLimit: 1000,
+        rateLimit: 1000,
+      },
+    });
+
+    // THEN
+    Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Stage', {
+      ApiId: stack.resolve(api.apiId),
+      StageName: '$default',
+      DefaultRouteSettings: {
+        ThrottlingBurstLimit: 1000,
+        ThrottlingRateLimit: 1000,
+      },
+    });
+  });
+
+  test('correctly sets details metrics settings', () => {
+    // WHEN
+    new HttpStage(stack, 'DefaultStage', {
+      httpApi: api,
+      detailedMetricsEnabled: true,
     });
 
+    // THEN
+    Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Stage', {
+      ApiId: stack.resolve(api.apiId),
+      StageName: '$default',
+      DefaultRouteSettings: {
+        DetailedMetricsEnabled: true,
+      },
+    });
+  });
+
+  test('correctly sets route settings', () => {
     // WHEN
     new HttpStage(stack, 'DefaultStage', {
       httpApi: api,
@@ -194,12 +203,6 @@ describe('HttpStage with domain mapping', () => {
   });
 
   test('specify description', () => {
-    // GIVEN
-    const stack = new Stack();
-    const api = new HttpApi(stack, 'Api', {
-      createDefaultStage: false,
-    });
-
     // WHEN
     new HttpStage(stack, 'DefaultStage', {
       httpApi: api,
diff --git a/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts b/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts
index 7d92b1b1b0fda..10535d3e59d27 100644
--- a/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts
+++ b/packages/aws-cdk-lib/aws-apigatewayv2/test/websocket/stage.test.ts
@@ -3,12 +3,16 @@ import { User } from '../../../aws-iam';
 import { Stack } from '../../../core';
 import { WebSocketApi, WebSocketStage } from '../../lib';
 
+let stack: Stack;
+let api: WebSocketApi;
+
+beforeEach(() => {
+  stack = new Stack();
+  api = new WebSocketApi(stack, 'Api');
+});
+
 describe('WebSocketStage', () => {
   test('default', () => {
-    // GIVEN
-    const stack = new Stack();
-    const api = new WebSocketApi(stack, 'Api');
-
     // WHEN
     const defaultStage = new WebSocketStage(stack, 'Stage', {
       webSocketApi: api,
@@ -24,10 +28,6 @@ describe('WebSocketStage', () => {
   });
 
   test('import', () => {
-    // GIVEN
-    const stack = new Stack();
-    const api = new WebSocketApi(stack, 'Api');
-
     // WHEN
     const stage = new WebSocketStage(stack, 'Stage', {
       webSocketApi: api,
@@ -46,10 +46,6 @@ describe('WebSocketStage', () => {
   });
 
   test('callback URL', () => {
-    // GIVEN
-    const stack = new Stack();
-    const api = new WebSocketApi(stack, 'Api');
-
     // WHEN
     const defaultStage = new WebSocketStage(stack, 'Stage', {
       webSocketApi: api,
@@ -64,8 +60,6 @@ describe('WebSocketStage', () => {
   describe('grantManageConnections', () => {
     test('adds an IAM policy to the principal', () => {
       // GIVEN
-      const stack = new Stack();
-      const api = new WebSocketApi(stack, 'Api');
       const defaultStage = new WebSocketStage(stack, 'Stage', {
         webSocketApi: api,
         stageName: 'dev',
@@ -108,11 +102,47 @@ describe('WebSocketStage', () => {
     });
   });
 
-  test('correctly sets route settings', () => {
-    // GIVEN
-    const stack = new Stack();
-    const api = new WebSocketApi(stack, 'Api');
+  test('correctly sets throttle settings', () => {
+    // WHEN
+    new WebSocketStage(stack, 'DefaultStage', {
+      webSocketApi: api,
+      stageName: 'dev',
+      throttle: {
+        burstLimit: 1000,
+        rateLimit: 1000,
+      },
+    });
+
+    // THEN
+    Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Stage', {
+      ApiId: stack.resolve(api.apiId),
+      StageName: 'dev',
+      DefaultRouteSettings: {
+        ThrottlingBurstLimit: 1000,
+        ThrottlingRateLimit: 1000,
+      },
+    });
+  });
 
+  test('correctly sets details metrics settings', () => {
+    // WHEN
+    new WebSocketStage(stack, 'DefaultStage', {
+      webSocketApi: api,
+      stageName: 'dev',
+      detailedMetricsEnabled: true,
+    });
+
+    // THEN
+    Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Stage', {
+      ApiId: stack.resolve(api.apiId),
+      StageName: 'dev',
+      DefaultRouteSettings: {
+        DetailedMetricsEnabled: true,
+      },
+    });
+  });
+
+  test('correctly sets route settings', () => {
     // WHEN
     new WebSocketStage(stack, 'DefaultStage', {
       webSocketApi: api,
@@ -137,10 +167,6 @@ describe('WebSocketStage', () => {
   });
 
   test('specify description', () => {
-    // GIVEN
-    const stack = new Stack();
-    const api = new WebSocketApi(stack, 'Api');
-
     // WHEN
     new WebSocketStage(stack, 'DefaultStage', {
       webSocketApi: api,