diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Amazon Performance Insights SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2018-02-27@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-pi)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Amazonka.Pi](http://hackage.haskell.org/package/amazonka-pi/docs/Amazonka-Pi.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-pi` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/amazonka-pi.cabal b/amazonka-pi.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-pi.cabal
@@ -0,0 +1,105 @@
+cabal-version:      2.2
+name:               amazonka-pi
+version:            2.0
+synopsis:           Amazon Performance Insights SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2018-02-27@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.Pi.Lens" and are
+  suitable for use with a lens package such as <http://hackage.haskell.org/package/lens lens> or <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+  .
+  See "Amazonka.Pi" and the <https://aws.amazon.com/documentation/ AWS documentation> to get started.
+
+source-repository head
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-pi
+
+library
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
+
+  exposed-modules:
+    Amazonka.Pi
+    Amazonka.Pi.DescribeDimensionKeys
+    Amazonka.Pi.GetDimensionKeyDetails
+    Amazonka.Pi.GetResourceMetadata
+    Amazonka.Pi.GetResourceMetrics
+    Amazonka.Pi.Lens
+    Amazonka.Pi.ListAvailableResourceDimensions
+    Amazonka.Pi.ListAvailableResourceMetrics
+    Amazonka.Pi.Types
+    Amazonka.Pi.Types.DataPoint
+    Amazonka.Pi.Types.DetailStatus
+    Amazonka.Pi.Types.DimensionDetail
+    Amazonka.Pi.Types.DimensionGroup
+    Amazonka.Pi.Types.DimensionGroupDetail
+    Amazonka.Pi.Types.DimensionKeyDescription
+    Amazonka.Pi.Types.DimensionKeyDetail
+    Amazonka.Pi.Types.FeatureMetadata
+    Amazonka.Pi.Types.FeatureStatus
+    Amazonka.Pi.Types.MetricDimensionGroups
+    Amazonka.Pi.Types.MetricKeyDataPoints
+    Amazonka.Pi.Types.MetricQuery
+    Amazonka.Pi.Types.ResponsePartitionKey
+    Amazonka.Pi.Types.ResponseResourceMetric
+    Amazonka.Pi.Types.ResponseResourceMetricKey
+    Amazonka.Pi.Types.ServiceType
+    Amazonka.Pi.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-pi-test
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
+
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.Gen.Pi
+    Test.Amazonka.Pi
+    Test.Amazonka.Pi.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-pi
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/DescribeDimensionKeys.yaml b/fixture/DescribeDimensionKeys.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDimensionKeys.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pi/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pi.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDimensionKeysResponse.proto b/fixture/DescribeDimensionKeysResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDimensionKeysResponse.proto
diff --git a/fixture/GetDimensionKeyDetails.yaml b/fixture/GetDimensionKeyDetails.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetDimensionKeyDetails.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pi/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pi.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetDimensionKeyDetailsResponse.proto b/fixture/GetDimensionKeyDetailsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetDimensionKeyDetailsResponse.proto
diff --git a/fixture/GetResourceMetadata.yaml b/fixture/GetResourceMetadata.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetResourceMetadata.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pi/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pi.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetResourceMetadataResponse.proto b/fixture/GetResourceMetadataResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetResourceMetadataResponse.proto
diff --git a/fixture/GetResourceMetrics.yaml b/fixture/GetResourceMetrics.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetResourceMetrics.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pi/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pi.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetResourceMetricsResponse.proto b/fixture/GetResourceMetricsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetResourceMetricsResponse.proto
diff --git a/fixture/ListAvailableResourceDimensions.yaml b/fixture/ListAvailableResourceDimensions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAvailableResourceDimensions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pi/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pi.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAvailableResourceDimensionsResponse.proto b/fixture/ListAvailableResourceDimensionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAvailableResourceDimensionsResponse.proto
diff --git a/fixture/ListAvailableResourceMetrics.yaml b/fixture/ListAvailableResourceMetrics.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAvailableResourceMetrics.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/pi/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  pi.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListAvailableResourceMetricsResponse.proto b/fixture/ListAvailableResourceMetricsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAvailableResourceMetricsResponse.proto
diff --git a/gen/Amazonka/Pi.hs b/gen/Amazonka/Pi.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi.hs
@@ -0,0 +1,206 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.Pi
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2018-02-27@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon RDS Performance Insights
+--
+-- Amazon RDS Performance Insights enables you to monitor and explore
+-- different dimensions of database load based on data captured from a
+-- running DB instance. The guide provides detailed information about
+-- Performance Insights data types, parameters and errors.
+--
+-- When Performance Insights is enabled, the Amazon RDS Performance
+-- Insights API provides visibility into the performance of your DB
+-- instance. Amazon CloudWatch provides the authoritative source for Amazon
+-- Web Services service-vended monitoring metrics. Performance Insights
+-- offers a domain-specific view of DB load.
+--
+-- DB load is measured as average active sessions. Performance Insights
+-- provides the data to API consumers as a two-dimensional time-series
+-- dataset. The time dimension provides DB load data for each time point in
+-- the queried time range. Each time point decomposes overall load in
+-- relation to the requested dimensions, measured at that time point.
+-- Examples include SQL, Wait event, User, and Host.
+--
+-- -   To learn more about Performance Insights and Amazon Aurora DB
+--     instances, go to the
+--     /<https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_PerfInsights.html Amazon Aurora User Guide>/
+--     .
+--
+-- -   To learn more about Performance Insights and Amazon RDS DB
+--     instances, go to the
+--     /<https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.html Amazon RDS User Guide>/
+--     .
+--
+-- -   To learn more about Performance Insights and Amazon DocumentDB
+--     clusters, go to the
+--     /<https://docs.aws.amazon.com/documentdb/latest/developerguide/performance-insights.html Amazon DocumentDB Developer Guide>/
+--     .
+module Amazonka.Pi
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** InternalServiceError
+    _InternalServiceError,
+
+    -- ** InvalidArgumentException
+    _InvalidArgumentException,
+
+    -- ** NotAuthorizedException
+    _NotAuthorizedException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** DescribeDimensionKeys
+    DescribeDimensionKeys (DescribeDimensionKeys'),
+    newDescribeDimensionKeys,
+    DescribeDimensionKeysResponse (DescribeDimensionKeysResponse'),
+    newDescribeDimensionKeysResponse,
+
+    -- ** GetDimensionKeyDetails
+    GetDimensionKeyDetails (GetDimensionKeyDetails'),
+    newGetDimensionKeyDetails,
+    GetDimensionKeyDetailsResponse (GetDimensionKeyDetailsResponse'),
+    newGetDimensionKeyDetailsResponse,
+
+    -- ** GetResourceMetadata
+    GetResourceMetadata (GetResourceMetadata'),
+    newGetResourceMetadata,
+    GetResourceMetadataResponse (GetResourceMetadataResponse'),
+    newGetResourceMetadataResponse,
+
+    -- ** GetResourceMetrics
+    GetResourceMetrics (GetResourceMetrics'),
+    newGetResourceMetrics,
+    GetResourceMetricsResponse (GetResourceMetricsResponse'),
+    newGetResourceMetricsResponse,
+
+    -- ** ListAvailableResourceDimensions
+    ListAvailableResourceDimensions (ListAvailableResourceDimensions'),
+    newListAvailableResourceDimensions,
+    ListAvailableResourceDimensionsResponse (ListAvailableResourceDimensionsResponse'),
+    newListAvailableResourceDimensionsResponse,
+
+    -- ** ListAvailableResourceMetrics
+    ListAvailableResourceMetrics (ListAvailableResourceMetrics'),
+    newListAvailableResourceMetrics,
+    ListAvailableResourceMetricsResponse (ListAvailableResourceMetricsResponse'),
+    newListAvailableResourceMetricsResponse,
+
+    -- * Types
+
+    -- ** DetailStatus
+    DetailStatus (..),
+
+    -- ** FeatureStatus
+    FeatureStatus (..),
+
+    -- ** ServiceType
+    ServiceType (..),
+
+    -- ** DataPoint
+    DataPoint (DataPoint'),
+    newDataPoint,
+
+    -- ** DimensionDetail
+    DimensionDetail (DimensionDetail'),
+    newDimensionDetail,
+
+    -- ** DimensionGroup
+    DimensionGroup (DimensionGroup'),
+    newDimensionGroup,
+
+    -- ** DimensionGroupDetail
+    DimensionGroupDetail (DimensionGroupDetail'),
+    newDimensionGroupDetail,
+
+    -- ** DimensionKeyDescription
+    DimensionKeyDescription (DimensionKeyDescription'),
+    newDimensionKeyDescription,
+
+    -- ** DimensionKeyDetail
+    DimensionKeyDetail (DimensionKeyDetail'),
+    newDimensionKeyDetail,
+
+    -- ** FeatureMetadata
+    FeatureMetadata (FeatureMetadata'),
+    newFeatureMetadata,
+
+    -- ** MetricDimensionGroups
+    MetricDimensionGroups (MetricDimensionGroups'),
+    newMetricDimensionGroups,
+
+    -- ** MetricKeyDataPoints
+    MetricKeyDataPoints (MetricKeyDataPoints'),
+    newMetricKeyDataPoints,
+
+    -- ** MetricQuery
+    MetricQuery (MetricQuery'),
+    newMetricQuery,
+
+    -- ** ResponsePartitionKey
+    ResponsePartitionKey (ResponsePartitionKey'),
+    newResponsePartitionKey,
+
+    -- ** ResponseResourceMetric
+    ResponseResourceMetric (ResponseResourceMetric'),
+    newResponseResourceMetric,
+
+    -- ** ResponseResourceMetricKey
+    ResponseResourceMetricKey (ResponseResourceMetricKey'),
+    newResponseResourceMetricKey,
+  )
+where
+
+import Amazonka.Pi.DescribeDimensionKeys
+import Amazonka.Pi.GetDimensionKeyDetails
+import Amazonka.Pi.GetResourceMetadata
+import Amazonka.Pi.GetResourceMetrics
+import Amazonka.Pi.Lens
+import Amazonka.Pi.ListAvailableResourceDimensions
+import Amazonka.Pi.ListAvailableResourceMetrics
+import Amazonka.Pi.Types
+import Amazonka.Pi.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'Pi'.
+
+-- $operations
+-- Some AWS operations return results that are incomplete and require subsequent
+-- requests in order to obtain the entire result set. The process of sending
+-- subsequent requests to continue where a previous request left off is called
+-- pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+-- 1000 objects at a time, and you must send subsequent requests with the
+-- appropriate Marker in order to retrieve the next page of results.
+--
+-- Operations that have an 'AWSPager' instance can transparently perform subsequent
+-- requests, correctly setting Markers and other request facets to iterate through
+-- the entire result set of a truncated API operation. Operations which support
+-- this have an additional note in the documentation.
+--
+-- Many operations have the ability to filter results on the server side. See the
+-- individual operation parameters for details.
+
+-- $waiters
+-- Waiters poll by repeatedly sending a request until some remote success condition
+-- configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+-- determines how many attempts should be made, in addition to delay and retry strategies.
diff --git a/gen/Amazonka/Pi/DescribeDimensionKeys.hs b/gen/Amazonka/Pi/DescribeDimensionKeys.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/DescribeDimensionKeys.hs
@@ -0,0 +1,624 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.DescribeDimensionKeys
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- For a specific time period, retrieve the top @N@ dimension keys for a
+-- metric.
+--
+-- Each response element returns a maximum of 500 bytes. For larger
+-- elements, such as SQL statements, only the first 500 bytes are returned.
+module Amazonka.Pi.DescribeDimensionKeys
+  ( -- * Creating a Request
+    DescribeDimensionKeys (..),
+    newDescribeDimensionKeys,
+
+    -- * Request Lenses
+    describeDimensionKeys_additionalMetrics,
+    describeDimensionKeys_filter,
+    describeDimensionKeys_maxResults,
+    describeDimensionKeys_nextToken,
+    describeDimensionKeys_partitionBy,
+    describeDimensionKeys_periodInSeconds,
+    describeDimensionKeys_serviceType,
+    describeDimensionKeys_identifier,
+    describeDimensionKeys_startTime,
+    describeDimensionKeys_endTime,
+    describeDimensionKeys_metric,
+    describeDimensionKeys_groupBy,
+
+    -- * Destructuring the Response
+    DescribeDimensionKeysResponse (..),
+    newDescribeDimensionKeysResponse,
+
+    -- * Response Lenses
+    describeDimensionKeysResponse_alignedEndTime,
+    describeDimensionKeysResponse_alignedStartTime,
+    describeDimensionKeysResponse_keys,
+    describeDimensionKeysResponse_nextToken,
+    describeDimensionKeysResponse_partitionKeys,
+    describeDimensionKeysResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeDimensionKeys' smart constructor.
+data DescribeDimensionKeys = DescribeDimensionKeys'
+  { -- | Additional metrics for the top @N@ dimension keys. If the specified
+    -- dimension group in the @GroupBy@ parameter is @db.sql_tokenized@, you
+    -- can specify per-SQL metrics to get the values for the top @N@ SQL
+    -- digests. The response syntax is as follows:
+    -- @\"AdditionalMetrics\" : { \"@/@string@/@\" : \"@/@string@/@\" }@.
+    additionalMetrics :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | One or more filters to apply in the request. Restrictions:
+    --
+    -- -   Any number of filters by the same dimension, as specified in the
+    --     @GroupBy@ or @Partition@ parameters.
+    --
+    -- -   A single filter for any other dimension in this dimension group.
+    filter' :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The maximum number of items to return in the response. If more items
+    -- exist than the specified @MaxRecords@ value, a pagination token is
+    -- included in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | An optional pagination token provided by a previous request. If this
+    -- parameter is specified, the response includes only records beyond the
+    -- token, up to the value specified by @MaxRecords@.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | For each dimension specified in @GroupBy@, specify a secondary dimension
+    -- to further subdivide the partition keys in the response.
+    partitionBy :: Prelude.Maybe DimensionGroup,
+    -- | The granularity, in seconds, of the data points returned from
+    -- Performance Insights. A period can be as short as one second, or as long
+    -- as one day (86400 seconds). Valid values are:
+    --
+    -- -   @1@ (one second)
+    --
+    -- -   @60@ (one minute)
+    --
+    -- -   @300@ (five minutes)
+    --
+    -- -   @3600@ (one hour)
+    --
+    -- -   @86400@ (twenty-four hours)
+    --
+    -- If you don\'t specify @PeriodInSeconds@, then Performance Insights
+    -- chooses a value for you, with a goal of returning roughly 100-200 data
+    -- points in the response.
+    periodInSeconds :: Prelude.Maybe Prelude.Int,
+    -- | The Amazon Web Services service for which Performance Insights will
+    -- return metrics. Valid values are as follows:
+    --
+    -- -   @RDS@
+    --
+    -- -   @DOCDB@
+    serviceType :: ServiceType,
+    -- | An immutable, Amazon Web Services Region-unique identifier for a data
+    -- source. Performance Insights gathers metrics from this data source.
+    --
+    -- To use an Amazon RDS instance as a data source, you specify its
+    -- @DbiResourceId@ value. For example, specify
+    -- @db-FAIHNTYBKTGAUSUZQYPDS2GW4A@.
+    identifier :: Prelude.Text,
+    -- | The date and time specifying the beginning of the requested time series
+    -- data. You must specify a @StartTime@ within the past 7 days. The value
+    -- specified is /inclusive/, which means that data points equal to or
+    -- greater than @StartTime@ are returned.
+    --
+    -- The value for @StartTime@ must be earlier than the value for @EndTime@.
+    startTime :: Data.POSIX,
+    -- | The date and time specifying the end of the requested time series data.
+    -- The value specified is /exclusive/, which means that data points less
+    -- than (but not equal to) @EndTime@ are returned.
+    --
+    -- The value for @EndTime@ must be later than the value for @StartTime@.
+    endTime :: Data.POSIX,
+    -- | The name of a Performance Insights metric to be measured.
+    --
+    -- Valid values for @Metric@ are:
+    --
+    -- -   @db.load.avg@ - A scaled representation of the number of active
+    --     sessions for the database engine.
+    --
+    -- -   @db.sampledload.avg@ - The raw number of active sessions for the
+    --     database engine.
+    --
+    -- If the number of active sessions is less than an internal Performance
+    -- Insights threshold, @db.load.avg@ and @db.sampledload.avg@ are the same
+    -- value. If the number of active sessions is greater than the internal
+    -- threshold, Performance Insights samples the active sessions, with
+    -- @db.load.avg@ showing the scaled values, @db.sampledload.avg@ showing
+    -- the raw values, and @db.sampledload.avg@ less than @db.load.avg@. For
+    -- most use cases, you can query @db.load.avg@ only.
+    metric :: Prelude.Text,
+    -- | A specification for how to aggregate the data points from a query
+    -- result. You must specify a valid dimension group. Performance Insights
+    -- returns all dimensions within this group, unless you provide the names
+    -- of specific dimensions within this group. You can also request that
+    -- Performance Insights return a limited number of values for a dimension.
+    groupBy :: DimensionGroup
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDimensionKeys' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'additionalMetrics', 'describeDimensionKeys_additionalMetrics' - Additional metrics for the top @N@ dimension keys. If the specified
+-- dimension group in the @GroupBy@ parameter is @db.sql_tokenized@, you
+-- can specify per-SQL metrics to get the values for the top @N@ SQL
+-- digests. The response syntax is as follows:
+-- @\"AdditionalMetrics\" : { \"@/@string@/@\" : \"@/@string@/@\" }@.
+--
+-- 'filter'', 'describeDimensionKeys_filter' - One or more filters to apply in the request. Restrictions:
+--
+-- -   Any number of filters by the same dimension, as specified in the
+--     @GroupBy@ or @Partition@ parameters.
+--
+-- -   A single filter for any other dimension in this dimension group.
+--
+-- 'maxResults', 'describeDimensionKeys_maxResults' - The maximum number of items to return in the response. If more items
+-- exist than the specified @MaxRecords@ value, a pagination token is
+-- included in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'describeDimensionKeys_nextToken' - An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+--
+-- 'partitionBy', 'describeDimensionKeys_partitionBy' - For each dimension specified in @GroupBy@, specify a secondary dimension
+-- to further subdivide the partition keys in the response.
+--
+-- 'periodInSeconds', 'describeDimensionKeys_periodInSeconds' - The granularity, in seconds, of the data points returned from
+-- Performance Insights. A period can be as short as one second, or as long
+-- as one day (86400 seconds). Valid values are:
+--
+-- -   @1@ (one second)
+--
+-- -   @60@ (one minute)
+--
+-- -   @300@ (five minutes)
+--
+-- -   @3600@ (one hour)
+--
+-- -   @86400@ (twenty-four hours)
+--
+-- If you don\'t specify @PeriodInSeconds@, then Performance Insights
+-- chooses a value for you, with a goal of returning roughly 100-200 data
+-- points in the response.
+--
+-- 'serviceType', 'describeDimensionKeys_serviceType' - The Amazon Web Services service for which Performance Insights will
+-- return metrics. Valid values are as follows:
+--
+-- -   @RDS@
+--
+-- -   @DOCDB@
+--
+-- 'identifier', 'describeDimensionKeys_identifier' - An immutable, Amazon Web Services Region-unique identifier for a data
+-- source. Performance Insights gathers metrics from this data source.
+--
+-- To use an Amazon RDS instance as a data source, you specify its
+-- @DbiResourceId@ value. For example, specify
+-- @db-FAIHNTYBKTGAUSUZQYPDS2GW4A@.
+--
+-- 'startTime', 'describeDimensionKeys_startTime' - The date and time specifying the beginning of the requested time series
+-- data. You must specify a @StartTime@ within the past 7 days. The value
+-- specified is /inclusive/, which means that data points equal to or
+-- greater than @StartTime@ are returned.
+--
+-- The value for @StartTime@ must be earlier than the value for @EndTime@.
+--
+-- 'endTime', 'describeDimensionKeys_endTime' - The date and time specifying the end of the requested time series data.
+-- The value specified is /exclusive/, which means that data points less
+-- than (but not equal to) @EndTime@ are returned.
+--
+-- The value for @EndTime@ must be later than the value for @StartTime@.
+--
+-- 'metric', 'describeDimensionKeys_metric' - The name of a Performance Insights metric to be measured.
+--
+-- Valid values for @Metric@ are:
+--
+-- -   @db.load.avg@ - A scaled representation of the number of active
+--     sessions for the database engine.
+--
+-- -   @db.sampledload.avg@ - The raw number of active sessions for the
+--     database engine.
+--
+-- If the number of active sessions is less than an internal Performance
+-- Insights threshold, @db.load.avg@ and @db.sampledload.avg@ are the same
+-- value. If the number of active sessions is greater than the internal
+-- threshold, Performance Insights samples the active sessions, with
+-- @db.load.avg@ showing the scaled values, @db.sampledload.avg@ showing
+-- the raw values, and @db.sampledload.avg@ less than @db.load.avg@. For
+-- most use cases, you can query @db.load.avg@ only.
+--
+-- 'groupBy', 'describeDimensionKeys_groupBy' - A specification for how to aggregate the data points from a query
+-- result. You must specify a valid dimension group. Performance Insights
+-- returns all dimensions within this group, unless you provide the names
+-- of specific dimensions within this group. You can also request that
+-- Performance Insights return a limited number of values for a dimension.
+newDescribeDimensionKeys ::
+  -- | 'serviceType'
+  ServiceType ->
+  -- | 'identifier'
+  Prelude.Text ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  -- | 'endTime'
+  Prelude.UTCTime ->
+  -- | 'metric'
+  Prelude.Text ->
+  -- | 'groupBy'
+  DimensionGroup ->
+  DescribeDimensionKeys
+newDescribeDimensionKeys
+  pServiceType_
+  pIdentifier_
+  pStartTime_
+  pEndTime_
+  pMetric_
+  pGroupBy_ =
+    DescribeDimensionKeys'
+      { additionalMetrics =
+          Prelude.Nothing,
+        filter' = Prelude.Nothing,
+        maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        partitionBy = Prelude.Nothing,
+        periodInSeconds = Prelude.Nothing,
+        serviceType = pServiceType_,
+        identifier = pIdentifier_,
+        startTime = Data._Time Lens.# pStartTime_,
+        endTime = Data._Time Lens.# pEndTime_,
+        metric = pMetric_,
+        groupBy = pGroupBy_
+      }
+
+-- | Additional metrics for the top @N@ dimension keys. If the specified
+-- dimension group in the @GroupBy@ parameter is @db.sql_tokenized@, you
+-- can specify per-SQL metrics to get the values for the top @N@ SQL
+-- digests. The response syntax is as follows:
+-- @\"AdditionalMetrics\" : { \"@/@string@/@\" : \"@/@string@/@\" }@.
+describeDimensionKeys_additionalMetrics :: Lens.Lens' DescribeDimensionKeys (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+describeDimensionKeys_additionalMetrics = Lens.lens (\DescribeDimensionKeys' {additionalMetrics} -> additionalMetrics) (\s@DescribeDimensionKeys' {} a -> s {additionalMetrics = a} :: DescribeDimensionKeys) Prelude.. Lens.mapping Lens.coerced
+
+-- | One or more filters to apply in the request. Restrictions:
+--
+-- -   Any number of filters by the same dimension, as specified in the
+--     @GroupBy@ or @Partition@ parameters.
+--
+-- -   A single filter for any other dimension in this dimension group.
+describeDimensionKeys_filter :: Lens.Lens' DescribeDimensionKeys (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+describeDimensionKeys_filter = Lens.lens (\DescribeDimensionKeys' {filter'} -> filter') (\s@DescribeDimensionKeys' {} a -> s {filter' = a} :: DescribeDimensionKeys) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of items to return in the response. If more items
+-- exist than the specified @MaxRecords@ value, a pagination token is
+-- included in the response so that the remaining results can be retrieved.
+describeDimensionKeys_maxResults :: Lens.Lens' DescribeDimensionKeys (Prelude.Maybe Prelude.Natural)
+describeDimensionKeys_maxResults = Lens.lens (\DescribeDimensionKeys' {maxResults} -> maxResults) (\s@DescribeDimensionKeys' {} a -> s {maxResults = a} :: DescribeDimensionKeys)
+
+-- | An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+describeDimensionKeys_nextToken :: Lens.Lens' DescribeDimensionKeys (Prelude.Maybe Prelude.Text)
+describeDimensionKeys_nextToken = Lens.lens (\DescribeDimensionKeys' {nextToken} -> nextToken) (\s@DescribeDimensionKeys' {} a -> s {nextToken = a} :: DescribeDimensionKeys)
+
+-- | For each dimension specified in @GroupBy@, specify a secondary dimension
+-- to further subdivide the partition keys in the response.
+describeDimensionKeys_partitionBy :: Lens.Lens' DescribeDimensionKeys (Prelude.Maybe DimensionGroup)
+describeDimensionKeys_partitionBy = Lens.lens (\DescribeDimensionKeys' {partitionBy} -> partitionBy) (\s@DescribeDimensionKeys' {} a -> s {partitionBy = a} :: DescribeDimensionKeys)
+
+-- | The granularity, in seconds, of the data points returned from
+-- Performance Insights. A period can be as short as one second, or as long
+-- as one day (86400 seconds). Valid values are:
+--
+-- -   @1@ (one second)
+--
+-- -   @60@ (one minute)
+--
+-- -   @300@ (five minutes)
+--
+-- -   @3600@ (one hour)
+--
+-- -   @86400@ (twenty-four hours)
+--
+-- If you don\'t specify @PeriodInSeconds@, then Performance Insights
+-- chooses a value for you, with a goal of returning roughly 100-200 data
+-- points in the response.
+describeDimensionKeys_periodInSeconds :: Lens.Lens' DescribeDimensionKeys (Prelude.Maybe Prelude.Int)
+describeDimensionKeys_periodInSeconds = Lens.lens (\DescribeDimensionKeys' {periodInSeconds} -> periodInSeconds) (\s@DescribeDimensionKeys' {} a -> s {periodInSeconds = a} :: DescribeDimensionKeys)
+
+-- | The Amazon Web Services service for which Performance Insights will
+-- return metrics. Valid values are as follows:
+--
+-- -   @RDS@
+--
+-- -   @DOCDB@
+describeDimensionKeys_serviceType :: Lens.Lens' DescribeDimensionKeys ServiceType
+describeDimensionKeys_serviceType = Lens.lens (\DescribeDimensionKeys' {serviceType} -> serviceType) (\s@DescribeDimensionKeys' {} a -> s {serviceType = a} :: DescribeDimensionKeys)
+
+-- | An immutable, Amazon Web Services Region-unique identifier for a data
+-- source. Performance Insights gathers metrics from this data source.
+--
+-- To use an Amazon RDS instance as a data source, you specify its
+-- @DbiResourceId@ value. For example, specify
+-- @db-FAIHNTYBKTGAUSUZQYPDS2GW4A@.
+describeDimensionKeys_identifier :: Lens.Lens' DescribeDimensionKeys Prelude.Text
+describeDimensionKeys_identifier = Lens.lens (\DescribeDimensionKeys' {identifier} -> identifier) (\s@DescribeDimensionKeys' {} a -> s {identifier = a} :: DescribeDimensionKeys)
+
+-- | The date and time specifying the beginning of the requested time series
+-- data. You must specify a @StartTime@ within the past 7 days. The value
+-- specified is /inclusive/, which means that data points equal to or
+-- greater than @StartTime@ are returned.
+--
+-- The value for @StartTime@ must be earlier than the value for @EndTime@.
+describeDimensionKeys_startTime :: Lens.Lens' DescribeDimensionKeys Prelude.UTCTime
+describeDimensionKeys_startTime = Lens.lens (\DescribeDimensionKeys' {startTime} -> startTime) (\s@DescribeDimensionKeys' {} a -> s {startTime = a} :: DescribeDimensionKeys) Prelude.. Data._Time
+
+-- | The date and time specifying the end of the requested time series data.
+-- The value specified is /exclusive/, which means that data points less
+-- than (but not equal to) @EndTime@ are returned.
+--
+-- The value for @EndTime@ must be later than the value for @StartTime@.
+describeDimensionKeys_endTime :: Lens.Lens' DescribeDimensionKeys Prelude.UTCTime
+describeDimensionKeys_endTime = Lens.lens (\DescribeDimensionKeys' {endTime} -> endTime) (\s@DescribeDimensionKeys' {} a -> s {endTime = a} :: DescribeDimensionKeys) Prelude.. Data._Time
+
+-- | The name of a Performance Insights metric to be measured.
+--
+-- Valid values for @Metric@ are:
+--
+-- -   @db.load.avg@ - A scaled representation of the number of active
+--     sessions for the database engine.
+--
+-- -   @db.sampledload.avg@ - The raw number of active sessions for the
+--     database engine.
+--
+-- If the number of active sessions is less than an internal Performance
+-- Insights threshold, @db.load.avg@ and @db.sampledload.avg@ are the same
+-- value. If the number of active sessions is greater than the internal
+-- threshold, Performance Insights samples the active sessions, with
+-- @db.load.avg@ showing the scaled values, @db.sampledload.avg@ showing
+-- the raw values, and @db.sampledload.avg@ less than @db.load.avg@. For
+-- most use cases, you can query @db.load.avg@ only.
+describeDimensionKeys_metric :: Lens.Lens' DescribeDimensionKeys Prelude.Text
+describeDimensionKeys_metric = Lens.lens (\DescribeDimensionKeys' {metric} -> metric) (\s@DescribeDimensionKeys' {} a -> s {metric = a} :: DescribeDimensionKeys)
+
+-- | A specification for how to aggregate the data points from a query
+-- result. You must specify a valid dimension group. Performance Insights
+-- returns all dimensions within this group, unless you provide the names
+-- of specific dimensions within this group. You can also request that
+-- Performance Insights return a limited number of values for a dimension.
+describeDimensionKeys_groupBy :: Lens.Lens' DescribeDimensionKeys DimensionGroup
+describeDimensionKeys_groupBy = Lens.lens (\DescribeDimensionKeys' {groupBy} -> groupBy) (\s@DescribeDimensionKeys' {} a -> s {groupBy = a} :: DescribeDimensionKeys)
+
+instance Core.AWSRequest DescribeDimensionKeys where
+  type
+    AWSResponse DescribeDimensionKeys =
+      DescribeDimensionKeysResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDimensionKeysResponse'
+            Prelude.<$> (x Data..?> "AlignedEndTime")
+            Prelude.<*> (x Data..?> "AlignedStartTime")
+            Prelude.<*> (x Data..?> "Keys" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "PartitionKeys" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeDimensionKeys where
+  hashWithSalt _salt DescribeDimensionKeys' {..} =
+    _salt
+      `Prelude.hashWithSalt` additionalMetrics
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` partitionBy
+      `Prelude.hashWithSalt` periodInSeconds
+      `Prelude.hashWithSalt` serviceType
+      `Prelude.hashWithSalt` identifier
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` metric
+      `Prelude.hashWithSalt` groupBy
+
+instance Prelude.NFData DescribeDimensionKeys where
+  rnf DescribeDimensionKeys' {..} =
+    Prelude.rnf additionalMetrics
+      `Prelude.seq` Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf partitionBy
+      `Prelude.seq` Prelude.rnf periodInSeconds
+      `Prelude.seq` Prelude.rnf serviceType
+      `Prelude.seq` Prelude.rnf identifier
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf metric
+      `Prelude.seq` Prelude.rnf groupBy
+
+instance Data.ToHeaders DescribeDimensionKeys where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PerformanceInsightsv20180227.DescribeDimensionKeys" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeDimensionKeys where
+  toJSON DescribeDimensionKeys' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AdditionalMetrics" Data..=)
+              Prelude.<$> additionalMetrics,
+            ("Filter" Data..=) Prelude.<$> filter',
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("PartitionBy" Data..=) Prelude.<$> partitionBy,
+            ("PeriodInSeconds" Data..=)
+              Prelude.<$> periodInSeconds,
+            Prelude.Just ("ServiceType" Data..= serviceType),
+            Prelude.Just ("Identifier" Data..= identifier),
+            Prelude.Just ("StartTime" Data..= startTime),
+            Prelude.Just ("EndTime" Data..= endTime),
+            Prelude.Just ("Metric" Data..= metric),
+            Prelude.Just ("GroupBy" Data..= groupBy)
+          ]
+      )
+
+instance Data.ToPath DescribeDimensionKeys where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeDimensionKeys where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDimensionKeysResponse' smart constructor.
+data DescribeDimensionKeysResponse = DescribeDimensionKeysResponse'
+  { -- | The end time for the returned dimension keys, after alignment to a
+    -- granular boundary (as specified by @PeriodInSeconds@). @AlignedEndTime@
+    -- will be greater than or equal to the value of the user-specified
+    -- @Endtime@.
+    alignedEndTime :: Prelude.Maybe Data.POSIX,
+    -- | The start time for the returned dimension keys, after alignment to a
+    -- granular boundary (as specified by @PeriodInSeconds@).
+    -- @AlignedStartTime@ will be less than or equal to the value of the
+    -- user-specified @StartTime@.
+    alignedStartTime :: Prelude.Maybe Data.POSIX,
+    -- | The dimension keys that were requested.
+    keys :: Prelude.Maybe [DimensionKeyDescription],
+    -- | A pagination token that indicates the response didn’t return all
+    -- available records because @MaxRecords@ was specified in the previous
+    -- request. To get the remaining records, specify @NextToken@ in a separate
+    -- request with this value.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | If @PartitionBy@ was present in the request, @PartitionKeys@ contains
+    -- the breakdown of dimension keys by the specified partitions.
+    partitionKeys :: Prelude.Maybe [ResponsePartitionKey],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDimensionKeysResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alignedEndTime', 'describeDimensionKeysResponse_alignedEndTime' - The end time for the returned dimension keys, after alignment to a
+-- granular boundary (as specified by @PeriodInSeconds@). @AlignedEndTime@
+-- will be greater than or equal to the value of the user-specified
+-- @Endtime@.
+--
+-- 'alignedStartTime', 'describeDimensionKeysResponse_alignedStartTime' - The start time for the returned dimension keys, after alignment to a
+-- granular boundary (as specified by @PeriodInSeconds@).
+-- @AlignedStartTime@ will be less than or equal to the value of the
+-- user-specified @StartTime@.
+--
+-- 'keys', 'describeDimensionKeysResponse_keys' - The dimension keys that were requested.
+--
+-- 'nextToken', 'describeDimensionKeysResponse_nextToken' - A pagination token that indicates the response didn’t return all
+-- available records because @MaxRecords@ was specified in the previous
+-- request. To get the remaining records, specify @NextToken@ in a separate
+-- request with this value.
+--
+-- 'partitionKeys', 'describeDimensionKeysResponse_partitionKeys' - If @PartitionBy@ was present in the request, @PartitionKeys@ contains
+-- the breakdown of dimension keys by the specified partitions.
+--
+-- 'httpStatus', 'describeDimensionKeysResponse_httpStatus' - The response's http status code.
+newDescribeDimensionKeysResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDimensionKeysResponse
+newDescribeDimensionKeysResponse pHttpStatus_ =
+  DescribeDimensionKeysResponse'
+    { alignedEndTime =
+        Prelude.Nothing,
+      alignedStartTime = Prelude.Nothing,
+      keys = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      partitionKeys = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The end time for the returned dimension keys, after alignment to a
+-- granular boundary (as specified by @PeriodInSeconds@). @AlignedEndTime@
+-- will be greater than or equal to the value of the user-specified
+-- @Endtime@.
+describeDimensionKeysResponse_alignedEndTime :: Lens.Lens' DescribeDimensionKeysResponse (Prelude.Maybe Prelude.UTCTime)
+describeDimensionKeysResponse_alignedEndTime = Lens.lens (\DescribeDimensionKeysResponse' {alignedEndTime} -> alignedEndTime) (\s@DescribeDimensionKeysResponse' {} a -> s {alignedEndTime = a} :: DescribeDimensionKeysResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The start time for the returned dimension keys, after alignment to a
+-- granular boundary (as specified by @PeriodInSeconds@).
+-- @AlignedStartTime@ will be less than or equal to the value of the
+-- user-specified @StartTime@.
+describeDimensionKeysResponse_alignedStartTime :: Lens.Lens' DescribeDimensionKeysResponse (Prelude.Maybe Prelude.UTCTime)
+describeDimensionKeysResponse_alignedStartTime = Lens.lens (\DescribeDimensionKeysResponse' {alignedStartTime} -> alignedStartTime) (\s@DescribeDimensionKeysResponse' {} a -> s {alignedStartTime = a} :: DescribeDimensionKeysResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The dimension keys that were requested.
+describeDimensionKeysResponse_keys :: Lens.Lens' DescribeDimensionKeysResponse (Prelude.Maybe [DimensionKeyDescription])
+describeDimensionKeysResponse_keys = Lens.lens (\DescribeDimensionKeysResponse' {keys} -> keys) (\s@DescribeDimensionKeysResponse' {} a -> s {keys = a} :: DescribeDimensionKeysResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A pagination token that indicates the response didn’t return all
+-- available records because @MaxRecords@ was specified in the previous
+-- request. To get the remaining records, specify @NextToken@ in a separate
+-- request with this value.
+describeDimensionKeysResponse_nextToken :: Lens.Lens' DescribeDimensionKeysResponse (Prelude.Maybe Prelude.Text)
+describeDimensionKeysResponse_nextToken = Lens.lens (\DescribeDimensionKeysResponse' {nextToken} -> nextToken) (\s@DescribeDimensionKeysResponse' {} a -> s {nextToken = a} :: DescribeDimensionKeysResponse)
+
+-- | If @PartitionBy@ was present in the request, @PartitionKeys@ contains
+-- the breakdown of dimension keys by the specified partitions.
+describeDimensionKeysResponse_partitionKeys :: Lens.Lens' DescribeDimensionKeysResponse (Prelude.Maybe [ResponsePartitionKey])
+describeDimensionKeysResponse_partitionKeys = Lens.lens (\DescribeDimensionKeysResponse' {partitionKeys} -> partitionKeys) (\s@DescribeDimensionKeysResponse' {} a -> s {partitionKeys = a} :: DescribeDimensionKeysResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+describeDimensionKeysResponse_httpStatus :: Lens.Lens' DescribeDimensionKeysResponse Prelude.Int
+describeDimensionKeysResponse_httpStatus = Lens.lens (\DescribeDimensionKeysResponse' {httpStatus} -> httpStatus) (\s@DescribeDimensionKeysResponse' {} a -> s {httpStatus = a} :: DescribeDimensionKeysResponse)
+
+instance Prelude.NFData DescribeDimensionKeysResponse where
+  rnf DescribeDimensionKeysResponse' {..} =
+    Prelude.rnf alignedEndTime
+      `Prelude.seq` Prelude.rnf alignedStartTime
+      `Prelude.seq` Prelude.rnf keys
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf partitionKeys
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Pi/GetDimensionKeyDetails.hs b/gen/Amazonka/Pi/GetDimensionKeyDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/GetDimensionKeyDetails.hs
@@ -0,0 +1,324 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.GetDimensionKeyDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Get the attributes of the specified dimension group for a DB instance or
+-- data source. For example, if you specify a SQL ID,
+-- @GetDimensionKeyDetails@ retrieves the full text of the dimension
+-- @db.sql.statement@ associated with this ID. This operation is useful
+-- because @GetResourceMetrics@ and @DescribeDimensionKeys@ don\'t support
+-- retrieval of large SQL statement text.
+module Amazonka.Pi.GetDimensionKeyDetails
+  ( -- * Creating a Request
+    GetDimensionKeyDetails (..),
+    newGetDimensionKeyDetails,
+
+    -- * Request Lenses
+    getDimensionKeyDetails_requestedDimensions,
+    getDimensionKeyDetails_serviceType,
+    getDimensionKeyDetails_identifier,
+    getDimensionKeyDetails_group,
+    getDimensionKeyDetails_groupIdentifier,
+
+    -- * Destructuring the Response
+    GetDimensionKeyDetailsResponse (..),
+    newGetDimensionKeyDetailsResponse,
+
+    -- * Response Lenses
+    getDimensionKeyDetailsResponse_dimensions,
+    getDimensionKeyDetailsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetDimensionKeyDetails' smart constructor.
+data GetDimensionKeyDetails = GetDimensionKeyDetails'
+  { -- | A list of dimensions to retrieve the detail data for within the given
+    -- dimension group. If you don\'t specify this parameter, Performance
+    -- Insights returns all dimension data within the specified dimension
+    -- group. Specify dimension names for the following dimension groups:
+    --
+    -- -   @db.sql@ - Specify either the full dimension name @db.sql.statement@
+    --     or the short dimension name @statement@ (Aurora and RDS only).
+    --
+    -- -   @db.query@ - Specify either the full dimension name
+    --     @db.query.statement@ or the short dimension name @statement@
+    --     (DocumentDB only).
+    requestedDimensions :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The Amazon Web Services service for which Performance Insights returns
+    -- data. The only valid value is @RDS@.
+    serviceType :: ServiceType,
+    -- | The ID for a data source from which to gather dimension data. This ID
+    -- must be immutable and unique within an Amazon Web Services Region. When
+    -- a DB instance is the data source, specify its @DbiResourceId@ value. For
+    -- example, specify @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+    identifier :: Prelude.Text,
+    -- | The name of the dimension group. Performance Insights searches the
+    -- specified group for the dimension group ID. The following group name
+    -- values are valid:
+    --
+    -- -   @db.query@ (Amazon DocumentDB only)
+    --
+    -- -   @db.sql@ (Amazon RDS and Aurora only)
+    group' :: Prelude.Text,
+    -- | The ID of the dimension group from which to retrieve dimension details.
+    -- For dimension group @db.sql@, the group ID is @db.sql.id@. The following
+    -- group ID values are valid:
+    --
+    -- -   @db.sql.id@ for dimension group @db.sql@ (Aurora and RDS only)
+    --
+    -- -   @db.query.id@ for dimension group @db.query@ (DocumentDB only)
+    groupIdentifier :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDimensionKeyDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'requestedDimensions', 'getDimensionKeyDetails_requestedDimensions' - A list of dimensions to retrieve the detail data for within the given
+-- dimension group. If you don\'t specify this parameter, Performance
+-- Insights returns all dimension data within the specified dimension
+-- group. Specify dimension names for the following dimension groups:
+--
+-- -   @db.sql@ - Specify either the full dimension name @db.sql.statement@
+--     or the short dimension name @statement@ (Aurora and RDS only).
+--
+-- -   @db.query@ - Specify either the full dimension name
+--     @db.query.statement@ or the short dimension name @statement@
+--     (DocumentDB only).
+--
+-- 'serviceType', 'getDimensionKeyDetails_serviceType' - The Amazon Web Services service for which Performance Insights returns
+-- data. The only valid value is @RDS@.
+--
+-- 'identifier', 'getDimensionKeyDetails_identifier' - The ID for a data source from which to gather dimension data. This ID
+-- must be immutable and unique within an Amazon Web Services Region. When
+-- a DB instance is the data source, specify its @DbiResourceId@ value. For
+-- example, specify @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+--
+-- 'group'', 'getDimensionKeyDetails_group' - The name of the dimension group. Performance Insights searches the
+-- specified group for the dimension group ID. The following group name
+-- values are valid:
+--
+-- -   @db.query@ (Amazon DocumentDB only)
+--
+-- -   @db.sql@ (Amazon RDS and Aurora only)
+--
+-- 'groupIdentifier', 'getDimensionKeyDetails_groupIdentifier' - The ID of the dimension group from which to retrieve dimension details.
+-- For dimension group @db.sql@, the group ID is @db.sql.id@. The following
+-- group ID values are valid:
+--
+-- -   @db.sql.id@ for dimension group @db.sql@ (Aurora and RDS only)
+--
+-- -   @db.query.id@ for dimension group @db.query@ (DocumentDB only)
+newGetDimensionKeyDetails ::
+  -- | 'serviceType'
+  ServiceType ->
+  -- | 'identifier'
+  Prelude.Text ->
+  -- | 'group''
+  Prelude.Text ->
+  -- | 'groupIdentifier'
+  Prelude.Text ->
+  GetDimensionKeyDetails
+newGetDimensionKeyDetails
+  pServiceType_
+  pIdentifier_
+  pGroup_
+  pGroupIdentifier_ =
+    GetDimensionKeyDetails'
+      { requestedDimensions =
+          Prelude.Nothing,
+        serviceType = pServiceType_,
+        identifier = pIdentifier_,
+        group' = pGroup_,
+        groupIdentifier = pGroupIdentifier_
+      }
+
+-- | A list of dimensions to retrieve the detail data for within the given
+-- dimension group. If you don\'t specify this parameter, Performance
+-- Insights returns all dimension data within the specified dimension
+-- group. Specify dimension names for the following dimension groups:
+--
+-- -   @db.sql@ - Specify either the full dimension name @db.sql.statement@
+--     or the short dimension name @statement@ (Aurora and RDS only).
+--
+-- -   @db.query@ - Specify either the full dimension name
+--     @db.query.statement@ or the short dimension name @statement@
+--     (DocumentDB only).
+getDimensionKeyDetails_requestedDimensions :: Lens.Lens' GetDimensionKeyDetails (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+getDimensionKeyDetails_requestedDimensions = Lens.lens (\GetDimensionKeyDetails' {requestedDimensions} -> requestedDimensions) (\s@GetDimensionKeyDetails' {} a -> s {requestedDimensions = a} :: GetDimensionKeyDetails) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Web Services service for which Performance Insights returns
+-- data. The only valid value is @RDS@.
+getDimensionKeyDetails_serviceType :: Lens.Lens' GetDimensionKeyDetails ServiceType
+getDimensionKeyDetails_serviceType = Lens.lens (\GetDimensionKeyDetails' {serviceType} -> serviceType) (\s@GetDimensionKeyDetails' {} a -> s {serviceType = a} :: GetDimensionKeyDetails)
+
+-- | The ID for a data source from which to gather dimension data. This ID
+-- must be immutable and unique within an Amazon Web Services Region. When
+-- a DB instance is the data source, specify its @DbiResourceId@ value. For
+-- example, specify @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+getDimensionKeyDetails_identifier :: Lens.Lens' GetDimensionKeyDetails Prelude.Text
+getDimensionKeyDetails_identifier = Lens.lens (\GetDimensionKeyDetails' {identifier} -> identifier) (\s@GetDimensionKeyDetails' {} a -> s {identifier = a} :: GetDimensionKeyDetails)
+
+-- | The name of the dimension group. Performance Insights searches the
+-- specified group for the dimension group ID. The following group name
+-- values are valid:
+--
+-- -   @db.query@ (Amazon DocumentDB only)
+--
+-- -   @db.sql@ (Amazon RDS and Aurora only)
+getDimensionKeyDetails_group :: Lens.Lens' GetDimensionKeyDetails Prelude.Text
+getDimensionKeyDetails_group = Lens.lens (\GetDimensionKeyDetails' {group'} -> group') (\s@GetDimensionKeyDetails' {} a -> s {group' = a} :: GetDimensionKeyDetails)
+
+-- | The ID of the dimension group from which to retrieve dimension details.
+-- For dimension group @db.sql@, the group ID is @db.sql.id@. The following
+-- group ID values are valid:
+--
+-- -   @db.sql.id@ for dimension group @db.sql@ (Aurora and RDS only)
+--
+-- -   @db.query.id@ for dimension group @db.query@ (DocumentDB only)
+getDimensionKeyDetails_groupIdentifier :: Lens.Lens' GetDimensionKeyDetails Prelude.Text
+getDimensionKeyDetails_groupIdentifier = Lens.lens (\GetDimensionKeyDetails' {groupIdentifier} -> groupIdentifier) (\s@GetDimensionKeyDetails' {} a -> s {groupIdentifier = a} :: GetDimensionKeyDetails)
+
+instance Core.AWSRequest GetDimensionKeyDetails where
+  type
+    AWSResponse GetDimensionKeyDetails =
+      GetDimensionKeyDetailsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetDimensionKeyDetailsResponse'
+            Prelude.<$> (x Data..?> "Dimensions" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetDimensionKeyDetails where
+  hashWithSalt _salt GetDimensionKeyDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` requestedDimensions
+      `Prelude.hashWithSalt` serviceType
+      `Prelude.hashWithSalt` identifier
+      `Prelude.hashWithSalt` group'
+      `Prelude.hashWithSalt` groupIdentifier
+
+instance Prelude.NFData GetDimensionKeyDetails where
+  rnf GetDimensionKeyDetails' {..} =
+    Prelude.rnf requestedDimensions
+      `Prelude.seq` Prelude.rnf serviceType
+      `Prelude.seq` Prelude.rnf identifier
+      `Prelude.seq` Prelude.rnf group'
+      `Prelude.seq` Prelude.rnf groupIdentifier
+
+instance Data.ToHeaders GetDimensionKeyDetails where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PerformanceInsightsv20180227.GetDimensionKeyDetails" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetDimensionKeyDetails where
+  toJSON GetDimensionKeyDetails' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("RequestedDimensions" Data..=)
+              Prelude.<$> requestedDimensions,
+            Prelude.Just ("ServiceType" Data..= serviceType),
+            Prelude.Just ("Identifier" Data..= identifier),
+            Prelude.Just ("Group" Data..= group'),
+            Prelude.Just
+              ("GroupIdentifier" Data..= groupIdentifier)
+          ]
+      )
+
+instance Data.ToPath GetDimensionKeyDetails where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetDimensionKeyDetails where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetDimensionKeyDetailsResponse' smart constructor.
+data GetDimensionKeyDetailsResponse = GetDimensionKeyDetailsResponse'
+  { -- | The details for the requested dimensions.
+    dimensions :: Prelude.Maybe [DimensionKeyDetail],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetDimensionKeyDetailsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dimensions', 'getDimensionKeyDetailsResponse_dimensions' - The details for the requested dimensions.
+--
+-- 'httpStatus', 'getDimensionKeyDetailsResponse_httpStatus' - The response's http status code.
+newGetDimensionKeyDetailsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetDimensionKeyDetailsResponse
+newGetDimensionKeyDetailsResponse pHttpStatus_ =
+  GetDimensionKeyDetailsResponse'
+    { dimensions =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The details for the requested dimensions.
+getDimensionKeyDetailsResponse_dimensions :: Lens.Lens' GetDimensionKeyDetailsResponse (Prelude.Maybe [DimensionKeyDetail])
+getDimensionKeyDetailsResponse_dimensions = Lens.lens (\GetDimensionKeyDetailsResponse' {dimensions} -> dimensions) (\s@GetDimensionKeyDetailsResponse' {} a -> s {dimensions = a} :: GetDimensionKeyDetailsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+getDimensionKeyDetailsResponse_httpStatus :: Lens.Lens' GetDimensionKeyDetailsResponse Prelude.Int
+getDimensionKeyDetailsResponse_httpStatus = Lens.lens (\GetDimensionKeyDetailsResponse' {httpStatus} -> httpStatus) (\s@GetDimensionKeyDetailsResponse' {} a -> s {httpStatus = a} :: GetDimensionKeyDetailsResponse)
+
+instance
+  Prelude.NFData
+    GetDimensionKeyDetailsResponse
+  where
+  rnf GetDimensionKeyDetailsResponse' {..} =
+    Prelude.rnf dimensions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Pi/GetResourceMetadata.hs b/gen/Amazonka/Pi/GetResourceMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/GetResourceMetadata.hs
@@ -0,0 +1,232 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.GetResourceMetadata
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieve the metadata for different features. For example, the metadata
+-- might indicate that a feature is turned on or off on a specific DB
+-- instance.
+module Amazonka.Pi.GetResourceMetadata
+  ( -- * Creating a Request
+    GetResourceMetadata (..),
+    newGetResourceMetadata,
+
+    -- * Request Lenses
+    getResourceMetadata_serviceType,
+    getResourceMetadata_identifier,
+
+    -- * Destructuring the Response
+    GetResourceMetadataResponse (..),
+    newGetResourceMetadataResponse,
+
+    -- * Response Lenses
+    getResourceMetadataResponse_features,
+    getResourceMetadataResponse_identifier,
+    getResourceMetadataResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetResourceMetadata' smart constructor.
+data GetResourceMetadata = GetResourceMetadata'
+  { -- | The Amazon Web Services service for which Performance Insights returns
+    -- metrics.
+    serviceType :: ServiceType,
+    -- | An immutable identifier for a data source that is unique for an Amazon
+    -- Web Services Region. Performance Insights gathers metrics from this data
+    -- source. To use a DB instance as a data source, specify its
+    -- @DbiResourceId@ value. For example, specify
+    -- @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+    identifier :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetResourceMetadata' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'serviceType', 'getResourceMetadata_serviceType' - The Amazon Web Services service for which Performance Insights returns
+-- metrics.
+--
+-- 'identifier', 'getResourceMetadata_identifier' - An immutable identifier for a data source that is unique for an Amazon
+-- Web Services Region. Performance Insights gathers metrics from this data
+-- source. To use a DB instance as a data source, specify its
+-- @DbiResourceId@ value. For example, specify
+-- @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+newGetResourceMetadata ::
+  -- | 'serviceType'
+  ServiceType ->
+  -- | 'identifier'
+  Prelude.Text ->
+  GetResourceMetadata
+newGetResourceMetadata pServiceType_ pIdentifier_ =
+  GetResourceMetadata'
+    { serviceType = pServiceType_,
+      identifier = pIdentifier_
+    }
+
+-- | The Amazon Web Services service for which Performance Insights returns
+-- metrics.
+getResourceMetadata_serviceType :: Lens.Lens' GetResourceMetadata ServiceType
+getResourceMetadata_serviceType = Lens.lens (\GetResourceMetadata' {serviceType} -> serviceType) (\s@GetResourceMetadata' {} a -> s {serviceType = a} :: GetResourceMetadata)
+
+-- | An immutable identifier for a data source that is unique for an Amazon
+-- Web Services Region. Performance Insights gathers metrics from this data
+-- source. To use a DB instance as a data source, specify its
+-- @DbiResourceId@ value. For example, specify
+-- @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+getResourceMetadata_identifier :: Lens.Lens' GetResourceMetadata Prelude.Text
+getResourceMetadata_identifier = Lens.lens (\GetResourceMetadata' {identifier} -> identifier) (\s@GetResourceMetadata' {} a -> s {identifier = a} :: GetResourceMetadata)
+
+instance Core.AWSRequest GetResourceMetadata where
+  type
+    AWSResponse GetResourceMetadata =
+      GetResourceMetadataResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetResourceMetadataResponse'
+            Prelude.<$> (x Data..?> "Features" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "Identifier")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetResourceMetadata where
+  hashWithSalt _salt GetResourceMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` serviceType
+      `Prelude.hashWithSalt` identifier
+
+instance Prelude.NFData GetResourceMetadata where
+  rnf GetResourceMetadata' {..} =
+    Prelude.rnf serviceType
+      `Prelude.seq` Prelude.rnf identifier
+
+instance Data.ToHeaders GetResourceMetadata where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PerformanceInsightsv20180227.GetResourceMetadata" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetResourceMetadata where
+  toJSON GetResourceMetadata' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ServiceType" Data..= serviceType),
+            Prelude.Just ("Identifier" Data..= identifier)
+          ]
+      )
+
+instance Data.ToPath GetResourceMetadata where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetResourceMetadata where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetResourceMetadataResponse' smart constructor.
+data GetResourceMetadataResponse = GetResourceMetadataResponse'
+  { -- | The metadata for different features. For example, the metadata might
+    -- indicate that a feature is turned on or off on a specific DB instance.
+    features :: Prelude.Maybe (Prelude.HashMap Prelude.Text FeatureMetadata),
+    -- | An immutable identifier for a data source that is unique for an Amazon
+    -- Web Services Region. Performance Insights gathers metrics from this data
+    -- source. To use a DB instance as a data source, specify its
+    -- @DbiResourceId@ value. For example, specify
+    -- @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+    identifier :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetResourceMetadataResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'features', 'getResourceMetadataResponse_features' - The metadata for different features. For example, the metadata might
+-- indicate that a feature is turned on or off on a specific DB instance.
+--
+-- 'identifier', 'getResourceMetadataResponse_identifier' - An immutable identifier for a data source that is unique for an Amazon
+-- Web Services Region. Performance Insights gathers metrics from this data
+-- source. To use a DB instance as a data source, specify its
+-- @DbiResourceId@ value. For example, specify
+-- @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+--
+-- 'httpStatus', 'getResourceMetadataResponse_httpStatus' - The response's http status code.
+newGetResourceMetadataResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetResourceMetadataResponse
+newGetResourceMetadataResponse pHttpStatus_ =
+  GetResourceMetadataResponse'
+    { features =
+        Prelude.Nothing,
+      identifier = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The metadata for different features. For example, the metadata might
+-- indicate that a feature is turned on or off on a specific DB instance.
+getResourceMetadataResponse_features :: Lens.Lens' GetResourceMetadataResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text FeatureMetadata))
+getResourceMetadataResponse_features = Lens.lens (\GetResourceMetadataResponse' {features} -> features) (\s@GetResourceMetadataResponse' {} a -> s {features = a} :: GetResourceMetadataResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | An immutable identifier for a data source that is unique for an Amazon
+-- Web Services Region. Performance Insights gathers metrics from this data
+-- source. To use a DB instance as a data source, specify its
+-- @DbiResourceId@ value. For example, specify
+-- @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+getResourceMetadataResponse_identifier :: Lens.Lens' GetResourceMetadataResponse (Prelude.Maybe Prelude.Text)
+getResourceMetadataResponse_identifier = Lens.lens (\GetResourceMetadataResponse' {identifier} -> identifier) (\s@GetResourceMetadataResponse' {} a -> s {identifier = a} :: GetResourceMetadataResponse)
+
+-- | The response's http status code.
+getResourceMetadataResponse_httpStatus :: Lens.Lens' GetResourceMetadataResponse Prelude.Int
+getResourceMetadataResponse_httpStatus = Lens.lens (\GetResourceMetadataResponse' {httpStatus} -> httpStatus) (\s@GetResourceMetadataResponse' {} a -> s {httpStatus = a} :: GetResourceMetadataResponse)
+
+instance Prelude.NFData GetResourceMetadataResponse where
+  rnf GetResourceMetadataResponse' {..} =
+    Prelude.rnf features
+      `Prelude.seq` Prelude.rnf identifier
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Pi/GetResourceMetrics.hs b/gen/Amazonka/Pi/GetResourceMetrics.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/GetResourceMetrics.hs
@@ -0,0 +1,499 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.GetResourceMetrics
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieve Performance Insights metrics for a set of data sources over a
+-- time period. You can provide specific dimension groups and dimensions,
+-- and provide aggregation and filtering criteria for each group.
+--
+-- Each response element returns a maximum of 500 bytes. For larger
+-- elements, such as SQL statements, only the first 500 bytes are returned.
+module Amazonka.Pi.GetResourceMetrics
+  ( -- * Creating a Request
+    GetResourceMetrics (..),
+    newGetResourceMetrics,
+
+    -- * Request Lenses
+    getResourceMetrics_maxResults,
+    getResourceMetrics_nextToken,
+    getResourceMetrics_periodInSeconds,
+    getResourceMetrics_serviceType,
+    getResourceMetrics_identifier,
+    getResourceMetrics_metricQueries,
+    getResourceMetrics_startTime,
+    getResourceMetrics_endTime,
+
+    -- * Destructuring the Response
+    GetResourceMetricsResponse (..),
+    newGetResourceMetricsResponse,
+
+    -- * Response Lenses
+    getResourceMetricsResponse_alignedEndTime,
+    getResourceMetricsResponse_alignedStartTime,
+    getResourceMetricsResponse_identifier,
+    getResourceMetricsResponse_metricList,
+    getResourceMetricsResponse_nextToken,
+    getResourceMetricsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetResourceMetrics' smart constructor.
+data GetResourceMetrics = GetResourceMetrics'
+  { -- | The maximum number of items to return in the response. If more items
+    -- exist than the specified @MaxRecords@ value, a pagination token is
+    -- included in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | An optional pagination token provided by a previous request. If this
+    -- parameter is specified, the response includes only records beyond the
+    -- token, up to the value specified by @MaxRecords@.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The granularity, in seconds, of the data points returned from
+    -- Performance Insights. A period can be as short as one second, or as long
+    -- as one day (86400 seconds). Valid values are:
+    --
+    -- -   @1@ (one second)
+    --
+    -- -   @60@ (one minute)
+    --
+    -- -   @300@ (five minutes)
+    --
+    -- -   @3600@ (one hour)
+    --
+    -- -   @86400@ (twenty-four hours)
+    --
+    -- If you don\'t specify @PeriodInSeconds@, then Performance Insights will
+    -- choose a value for you, with a goal of returning roughly 100-200 data
+    -- points in the response.
+    periodInSeconds :: Prelude.Maybe Prelude.Int,
+    -- | The Amazon Web Services service for which Performance Insights returns
+    -- metrics. Valid values are as follows:
+    --
+    -- -   @RDS@
+    --
+    -- -   @DOCDB@
+    serviceType :: ServiceType,
+    -- | An immutable identifier for a data source that is unique for an Amazon
+    -- Web Services Region. Performance Insights gathers metrics from this data
+    -- source. In the console, the identifier is shown as /ResourceID/. When
+    -- you call @DescribeDBInstances@, the identifier is returned as
+    -- @DbiResourceId@.
+    --
+    -- To use a DB instance as a data source, specify its @DbiResourceId@
+    -- value. For example, specify @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+    identifier :: Prelude.Text,
+    -- | An array of one or more queries to perform. Each query must specify a
+    -- Performance Insights metric, and can optionally specify aggregation and
+    -- filtering criteria.
+    metricQueries :: Prelude.NonEmpty MetricQuery,
+    -- | The date and time specifying the beginning of the requested time series
+    -- query range. You can\'t specify a @StartTime@ that is earlier than 7
+    -- days ago. By default, Performance Insights has 7 days of retention, but
+    -- you can extend this range up to 2 years. The value specified is
+    -- /inclusive/. Thus, the command returns data points equal to or greater
+    -- than @StartTime@.
+    --
+    -- The value for @StartTime@ must be earlier than the value for @EndTime@.
+    startTime :: Data.POSIX,
+    -- | The date and time specifying the end of the requested time series query
+    -- range. The value specified is /exclusive/. Thus, the command returns
+    -- data points less than (but not equal to) @EndTime@.
+    --
+    -- The value for @EndTime@ must be later than the value for @StartTime@.
+    endTime :: Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetResourceMetrics' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'getResourceMetrics_maxResults' - The maximum number of items to return in the response. If more items
+-- exist than the specified @MaxRecords@ value, a pagination token is
+-- included in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'getResourceMetrics_nextToken' - An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+--
+-- 'periodInSeconds', 'getResourceMetrics_periodInSeconds' - The granularity, in seconds, of the data points returned from
+-- Performance Insights. A period can be as short as one second, or as long
+-- as one day (86400 seconds). Valid values are:
+--
+-- -   @1@ (one second)
+--
+-- -   @60@ (one minute)
+--
+-- -   @300@ (five minutes)
+--
+-- -   @3600@ (one hour)
+--
+-- -   @86400@ (twenty-four hours)
+--
+-- If you don\'t specify @PeriodInSeconds@, then Performance Insights will
+-- choose a value for you, with a goal of returning roughly 100-200 data
+-- points in the response.
+--
+-- 'serviceType', 'getResourceMetrics_serviceType' - The Amazon Web Services service for which Performance Insights returns
+-- metrics. Valid values are as follows:
+--
+-- -   @RDS@
+--
+-- -   @DOCDB@
+--
+-- 'identifier', 'getResourceMetrics_identifier' - An immutable identifier for a data source that is unique for an Amazon
+-- Web Services Region. Performance Insights gathers metrics from this data
+-- source. In the console, the identifier is shown as /ResourceID/. When
+-- you call @DescribeDBInstances@, the identifier is returned as
+-- @DbiResourceId@.
+--
+-- To use a DB instance as a data source, specify its @DbiResourceId@
+-- value. For example, specify @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+--
+-- 'metricQueries', 'getResourceMetrics_metricQueries' - An array of one or more queries to perform. Each query must specify a
+-- Performance Insights metric, and can optionally specify aggregation and
+-- filtering criteria.
+--
+-- 'startTime', 'getResourceMetrics_startTime' - The date and time specifying the beginning of the requested time series
+-- query range. You can\'t specify a @StartTime@ that is earlier than 7
+-- days ago. By default, Performance Insights has 7 days of retention, but
+-- you can extend this range up to 2 years. The value specified is
+-- /inclusive/. Thus, the command returns data points equal to or greater
+-- than @StartTime@.
+--
+-- The value for @StartTime@ must be earlier than the value for @EndTime@.
+--
+-- 'endTime', 'getResourceMetrics_endTime' - The date and time specifying the end of the requested time series query
+-- range. The value specified is /exclusive/. Thus, the command returns
+-- data points less than (but not equal to) @EndTime@.
+--
+-- The value for @EndTime@ must be later than the value for @StartTime@.
+newGetResourceMetrics ::
+  -- | 'serviceType'
+  ServiceType ->
+  -- | 'identifier'
+  Prelude.Text ->
+  -- | 'metricQueries'
+  Prelude.NonEmpty MetricQuery ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  -- | 'endTime'
+  Prelude.UTCTime ->
+  GetResourceMetrics
+newGetResourceMetrics
+  pServiceType_
+  pIdentifier_
+  pMetricQueries_
+  pStartTime_
+  pEndTime_ =
+    GetResourceMetrics'
+      { maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        periodInSeconds = Prelude.Nothing,
+        serviceType = pServiceType_,
+        identifier = pIdentifier_,
+        metricQueries = Lens.coerced Lens.# pMetricQueries_,
+        startTime = Data._Time Lens.# pStartTime_,
+        endTime = Data._Time Lens.# pEndTime_
+      }
+
+-- | The maximum number of items to return in the response. If more items
+-- exist than the specified @MaxRecords@ value, a pagination token is
+-- included in the response so that the remaining results can be retrieved.
+getResourceMetrics_maxResults :: Lens.Lens' GetResourceMetrics (Prelude.Maybe Prelude.Natural)
+getResourceMetrics_maxResults = Lens.lens (\GetResourceMetrics' {maxResults} -> maxResults) (\s@GetResourceMetrics' {} a -> s {maxResults = a} :: GetResourceMetrics)
+
+-- | An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+getResourceMetrics_nextToken :: Lens.Lens' GetResourceMetrics (Prelude.Maybe Prelude.Text)
+getResourceMetrics_nextToken = Lens.lens (\GetResourceMetrics' {nextToken} -> nextToken) (\s@GetResourceMetrics' {} a -> s {nextToken = a} :: GetResourceMetrics)
+
+-- | The granularity, in seconds, of the data points returned from
+-- Performance Insights. A period can be as short as one second, or as long
+-- as one day (86400 seconds). Valid values are:
+--
+-- -   @1@ (one second)
+--
+-- -   @60@ (one minute)
+--
+-- -   @300@ (five minutes)
+--
+-- -   @3600@ (one hour)
+--
+-- -   @86400@ (twenty-four hours)
+--
+-- If you don\'t specify @PeriodInSeconds@, then Performance Insights will
+-- choose a value for you, with a goal of returning roughly 100-200 data
+-- points in the response.
+getResourceMetrics_periodInSeconds :: Lens.Lens' GetResourceMetrics (Prelude.Maybe Prelude.Int)
+getResourceMetrics_periodInSeconds = Lens.lens (\GetResourceMetrics' {periodInSeconds} -> periodInSeconds) (\s@GetResourceMetrics' {} a -> s {periodInSeconds = a} :: GetResourceMetrics)
+
+-- | The Amazon Web Services service for which Performance Insights returns
+-- metrics. Valid values are as follows:
+--
+-- -   @RDS@
+--
+-- -   @DOCDB@
+getResourceMetrics_serviceType :: Lens.Lens' GetResourceMetrics ServiceType
+getResourceMetrics_serviceType = Lens.lens (\GetResourceMetrics' {serviceType} -> serviceType) (\s@GetResourceMetrics' {} a -> s {serviceType = a} :: GetResourceMetrics)
+
+-- | An immutable identifier for a data source that is unique for an Amazon
+-- Web Services Region. Performance Insights gathers metrics from this data
+-- source. In the console, the identifier is shown as /ResourceID/. When
+-- you call @DescribeDBInstances@, the identifier is returned as
+-- @DbiResourceId@.
+--
+-- To use a DB instance as a data source, specify its @DbiResourceId@
+-- value. For example, specify @db-ABCDEFGHIJKLMNOPQRSTU1VW2X@.
+getResourceMetrics_identifier :: Lens.Lens' GetResourceMetrics Prelude.Text
+getResourceMetrics_identifier = Lens.lens (\GetResourceMetrics' {identifier} -> identifier) (\s@GetResourceMetrics' {} a -> s {identifier = a} :: GetResourceMetrics)
+
+-- | An array of one or more queries to perform. Each query must specify a
+-- Performance Insights metric, and can optionally specify aggregation and
+-- filtering criteria.
+getResourceMetrics_metricQueries :: Lens.Lens' GetResourceMetrics (Prelude.NonEmpty MetricQuery)
+getResourceMetrics_metricQueries = Lens.lens (\GetResourceMetrics' {metricQueries} -> metricQueries) (\s@GetResourceMetrics' {} a -> s {metricQueries = a} :: GetResourceMetrics) Prelude.. Lens.coerced
+
+-- | The date and time specifying the beginning of the requested time series
+-- query range. You can\'t specify a @StartTime@ that is earlier than 7
+-- days ago. By default, Performance Insights has 7 days of retention, but
+-- you can extend this range up to 2 years. The value specified is
+-- /inclusive/. Thus, the command returns data points equal to or greater
+-- than @StartTime@.
+--
+-- The value for @StartTime@ must be earlier than the value for @EndTime@.
+getResourceMetrics_startTime :: Lens.Lens' GetResourceMetrics Prelude.UTCTime
+getResourceMetrics_startTime = Lens.lens (\GetResourceMetrics' {startTime} -> startTime) (\s@GetResourceMetrics' {} a -> s {startTime = a} :: GetResourceMetrics) Prelude.. Data._Time
+
+-- | The date and time specifying the end of the requested time series query
+-- range. The value specified is /exclusive/. Thus, the command returns
+-- data points less than (but not equal to) @EndTime@.
+--
+-- The value for @EndTime@ must be later than the value for @StartTime@.
+getResourceMetrics_endTime :: Lens.Lens' GetResourceMetrics Prelude.UTCTime
+getResourceMetrics_endTime = Lens.lens (\GetResourceMetrics' {endTime} -> endTime) (\s@GetResourceMetrics' {} a -> s {endTime = a} :: GetResourceMetrics) Prelude.. Data._Time
+
+instance Core.AWSRequest GetResourceMetrics where
+  type
+    AWSResponse GetResourceMetrics =
+      GetResourceMetricsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetResourceMetricsResponse'
+            Prelude.<$> (x Data..?> "AlignedEndTime")
+            Prelude.<*> (x Data..?> "AlignedStartTime")
+            Prelude.<*> (x Data..?> "Identifier")
+            Prelude.<*> (x Data..?> "MetricList" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetResourceMetrics where
+  hashWithSalt _salt GetResourceMetrics' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` periodInSeconds
+      `Prelude.hashWithSalt` serviceType
+      `Prelude.hashWithSalt` identifier
+      `Prelude.hashWithSalt` metricQueries
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` endTime
+
+instance Prelude.NFData GetResourceMetrics where
+  rnf GetResourceMetrics' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf periodInSeconds
+      `Prelude.seq` Prelude.rnf serviceType
+      `Prelude.seq` Prelude.rnf identifier
+      `Prelude.seq` Prelude.rnf metricQueries
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf endTime
+
+instance Data.ToHeaders GetResourceMetrics where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PerformanceInsightsv20180227.GetResourceMetrics" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetResourceMetrics where
+  toJSON GetResourceMetrics' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("PeriodInSeconds" Data..=)
+              Prelude.<$> periodInSeconds,
+            Prelude.Just ("ServiceType" Data..= serviceType),
+            Prelude.Just ("Identifier" Data..= identifier),
+            Prelude.Just ("MetricQueries" Data..= metricQueries),
+            Prelude.Just ("StartTime" Data..= startTime),
+            Prelude.Just ("EndTime" Data..= endTime)
+          ]
+      )
+
+instance Data.ToPath GetResourceMetrics where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetResourceMetrics where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetResourceMetricsResponse' smart constructor.
+data GetResourceMetricsResponse = GetResourceMetricsResponse'
+  { -- | The end time for the returned metrics, after alignment to a granular
+    -- boundary (as specified by @PeriodInSeconds@). @AlignedEndTime@ will be
+    -- greater than or equal to the value of the user-specified @Endtime@.
+    alignedEndTime :: Prelude.Maybe Data.POSIX,
+    -- | The start time for the returned metrics, after alignment to a granular
+    -- boundary (as specified by @PeriodInSeconds@). @AlignedStartTime@ will be
+    -- less than or equal to the value of the user-specified @StartTime@.
+    alignedStartTime :: Prelude.Maybe Data.POSIX,
+    -- | An immutable identifier for a data source that is unique for an Amazon
+    -- Web Services Region. Performance Insights gathers metrics from this data
+    -- source. In the console, the identifier is shown as /ResourceID/. When
+    -- you call @DescribeDBInstances@, the identifier is returned as
+    -- @DbiResourceId@.
+    identifier :: Prelude.Maybe Prelude.Text,
+    -- | An array of metric results, where each array element contains all of the
+    -- data points for a particular dimension.
+    metricList :: Prelude.Maybe [MetricKeyDataPoints],
+    -- | An optional pagination token provided by a previous request. If this
+    -- parameter is specified, the response includes only records beyond the
+    -- token, up to the value specified by @MaxRecords@.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetResourceMetricsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'alignedEndTime', 'getResourceMetricsResponse_alignedEndTime' - The end time for the returned metrics, after alignment to a granular
+-- boundary (as specified by @PeriodInSeconds@). @AlignedEndTime@ will be
+-- greater than or equal to the value of the user-specified @Endtime@.
+--
+-- 'alignedStartTime', 'getResourceMetricsResponse_alignedStartTime' - The start time for the returned metrics, after alignment to a granular
+-- boundary (as specified by @PeriodInSeconds@). @AlignedStartTime@ will be
+-- less than or equal to the value of the user-specified @StartTime@.
+--
+-- 'identifier', 'getResourceMetricsResponse_identifier' - An immutable identifier for a data source that is unique for an Amazon
+-- Web Services Region. Performance Insights gathers metrics from this data
+-- source. In the console, the identifier is shown as /ResourceID/. When
+-- you call @DescribeDBInstances@, the identifier is returned as
+-- @DbiResourceId@.
+--
+-- 'metricList', 'getResourceMetricsResponse_metricList' - An array of metric results, where each array element contains all of the
+-- data points for a particular dimension.
+--
+-- 'nextToken', 'getResourceMetricsResponse_nextToken' - An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+--
+-- 'httpStatus', 'getResourceMetricsResponse_httpStatus' - The response's http status code.
+newGetResourceMetricsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetResourceMetricsResponse
+newGetResourceMetricsResponse pHttpStatus_ =
+  GetResourceMetricsResponse'
+    { alignedEndTime =
+        Prelude.Nothing,
+      alignedStartTime = Prelude.Nothing,
+      identifier = Prelude.Nothing,
+      metricList = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The end time for the returned metrics, after alignment to a granular
+-- boundary (as specified by @PeriodInSeconds@). @AlignedEndTime@ will be
+-- greater than or equal to the value of the user-specified @Endtime@.
+getResourceMetricsResponse_alignedEndTime :: Lens.Lens' GetResourceMetricsResponse (Prelude.Maybe Prelude.UTCTime)
+getResourceMetricsResponse_alignedEndTime = Lens.lens (\GetResourceMetricsResponse' {alignedEndTime} -> alignedEndTime) (\s@GetResourceMetricsResponse' {} a -> s {alignedEndTime = a} :: GetResourceMetricsResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The start time for the returned metrics, after alignment to a granular
+-- boundary (as specified by @PeriodInSeconds@). @AlignedStartTime@ will be
+-- less than or equal to the value of the user-specified @StartTime@.
+getResourceMetricsResponse_alignedStartTime :: Lens.Lens' GetResourceMetricsResponse (Prelude.Maybe Prelude.UTCTime)
+getResourceMetricsResponse_alignedStartTime = Lens.lens (\GetResourceMetricsResponse' {alignedStartTime} -> alignedStartTime) (\s@GetResourceMetricsResponse' {} a -> s {alignedStartTime = a} :: GetResourceMetricsResponse) Prelude.. Lens.mapping Data._Time
+
+-- | An immutable identifier for a data source that is unique for an Amazon
+-- Web Services Region. Performance Insights gathers metrics from this data
+-- source. In the console, the identifier is shown as /ResourceID/. When
+-- you call @DescribeDBInstances@, the identifier is returned as
+-- @DbiResourceId@.
+getResourceMetricsResponse_identifier :: Lens.Lens' GetResourceMetricsResponse (Prelude.Maybe Prelude.Text)
+getResourceMetricsResponse_identifier = Lens.lens (\GetResourceMetricsResponse' {identifier} -> identifier) (\s@GetResourceMetricsResponse' {} a -> s {identifier = a} :: GetResourceMetricsResponse)
+
+-- | An array of metric results, where each array element contains all of the
+-- data points for a particular dimension.
+getResourceMetricsResponse_metricList :: Lens.Lens' GetResourceMetricsResponse (Prelude.Maybe [MetricKeyDataPoints])
+getResourceMetricsResponse_metricList = Lens.lens (\GetResourceMetricsResponse' {metricList} -> metricList) (\s@GetResourceMetricsResponse' {} a -> s {metricList = a} :: GetResourceMetricsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+getResourceMetricsResponse_nextToken :: Lens.Lens' GetResourceMetricsResponse (Prelude.Maybe Prelude.Text)
+getResourceMetricsResponse_nextToken = Lens.lens (\GetResourceMetricsResponse' {nextToken} -> nextToken) (\s@GetResourceMetricsResponse' {} a -> s {nextToken = a} :: GetResourceMetricsResponse)
+
+-- | The response's http status code.
+getResourceMetricsResponse_httpStatus :: Lens.Lens' GetResourceMetricsResponse Prelude.Int
+getResourceMetricsResponse_httpStatus = Lens.lens (\GetResourceMetricsResponse' {httpStatus} -> httpStatus) (\s@GetResourceMetricsResponse' {} a -> s {httpStatus = a} :: GetResourceMetricsResponse)
+
+instance Prelude.NFData GetResourceMetricsResponse where
+  rnf GetResourceMetricsResponse' {..} =
+    Prelude.rnf alignedEndTime
+      `Prelude.seq` Prelude.rnf alignedStartTime
+      `Prelude.seq` Prelude.rnf identifier
+      `Prelude.seq` Prelude.rnf metricList
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Pi/Lens.hs b/gen/Amazonka/Pi/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Lens.hs
@@ -0,0 +1,166 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Lens
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Lens
+  ( -- * Operations
+
+    -- ** DescribeDimensionKeys
+    describeDimensionKeys_additionalMetrics,
+    describeDimensionKeys_filter,
+    describeDimensionKeys_maxResults,
+    describeDimensionKeys_nextToken,
+    describeDimensionKeys_partitionBy,
+    describeDimensionKeys_periodInSeconds,
+    describeDimensionKeys_serviceType,
+    describeDimensionKeys_identifier,
+    describeDimensionKeys_startTime,
+    describeDimensionKeys_endTime,
+    describeDimensionKeys_metric,
+    describeDimensionKeys_groupBy,
+    describeDimensionKeysResponse_alignedEndTime,
+    describeDimensionKeysResponse_alignedStartTime,
+    describeDimensionKeysResponse_keys,
+    describeDimensionKeysResponse_nextToken,
+    describeDimensionKeysResponse_partitionKeys,
+    describeDimensionKeysResponse_httpStatus,
+
+    -- ** GetDimensionKeyDetails
+    getDimensionKeyDetails_requestedDimensions,
+    getDimensionKeyDetails_serviceType,
+    getDimensionKeyDetails_identifier,
+    getDimensionKeyDetails_group,
+    getDimensionKeyDetails_groupIdentifier,
+    getDimensionKeyDetailsResponse_dimensions,
+    getDimensionKeyDetailsResponse_httpStatus,
+
+    -- ** GetResourceMetadata
+    getResourceMetadata_serviceType,
+    getResourceMetadata_identifier,
+    getResourceMetadataResponse_features,
+    getResourceMetadataResponse_identifier,
+    getResourceMetadataResponse_httpStatus,
+
+    -- ** GetResourceMetrics
+    getResourceMetrics_maxResults,
+    getResourceMetrics_nextToken,
+    getResourceMetrics_periodInSeconds,
+    getResourceMetrics_serviceType,
+    getResourceMetrics_identifier,
+    getResourceMetrics_metricQueries,
+    getResourceMetrics_startTime,
+    getResourceMetrics_endTime,
+    getResourceMetricsResponse_alignedEndTime,
+    getResourceMetricsResponse_alignedStartTime,
+    getResourceMetricsResponse_identifier,
+    getResourceMetricsResponse_metricList,
+    getResourceMetricsResponse_nextToken,
+    getResourceMetricsResponse_httpStatus,
+
+    -- ** ListAvailableResourceDimensions
+    listAvailableResourceDimensions_maxResults,
+    listAvailableResourceDimensions_nextToken,
+    listAvailableResourceDimensions_serviceType,
+    listAvailableResourceDimensions_identifier,
+    listAvailableResourceDimensions_metrics,
+    listAvailableResourceDimensionsResponse_metricDimensions,
+    listAvailableResourceDimensionsResponse_nextToken,
+    listAvailableResourceDimensionsResponse_httpStatus,
+
+    -- ** ListAvailableResourceMetrics
+    listAvailableResourceMetrics_maxResults,
+    listAvailableResourceMetrics_nextToken,
+    listAvailableResourceMetrics_serviceType,
+    listAvailableResourceMetrics_identifier,
+    listAvailableResourceMetrics_metricTypes,
+    listAvailableResourceMetricsResponse_metrics,
+    listAvailableResourceMetricsResponse_nextToken,
+    listAvailableResourceMetricsResponse_httpStatus,
+
+    -- * Types
+
+    -- ** DataPoint
+    dataPoint_timestamp,
+    dataPoint_value,
+
+    -- ** DimensionDetail
+    dimensionDetail_identifier,
+
+    -- ** DimensionGroup
+    dimensionGroup_dimensions,
+    dimensionGroup_limit,
+    dimensionGroup_group,
+
+    -- ** DimensionGroupDetail
+    dimensionGroupDetail_dimensions,
+    dimensionGroupDetail_group,
+
+    -- ** DimensionKeyDescription
+    dimensionKeyDescription_additionalMetrics,
+    dimensionKeyDescription_dimensions,
+    dimensionKeyDescription_partitions,
+    dimensionKeyDescription_total,
+
+    -- ** DimensionKeyDetail
+    dimensionKeyDetail_dimension,
+    dimensionKeyDetail_status,
+    dimensionKeyDetail_value,
+
+    -- ** FeatureMetadata
+    featureMetadata_status,
+
+    -- ** MetricDimensionGroups
+    metricDimensionGroups_groups,
+    metricDimensionGroups_metric,
+
+    -- ** MetricKeyDataPoints
+    metricKeyDataPoints_dataPoints,
+    metricKeyDataPoints_key,
+
+    -- ** MetricQuery
+    metricQuery_filter,
+    metricQuery_groupBy,
+    metricQuery_metric,
+
+    -- ** ResponsePartitionKey
+    responsePartitionKey_dimensions,
+
+    -- ** ResponseResourceMetric
+    responseResourceMetric_description,
+    responseResourceMetric_metric,
+    responseResourceMetric_unit,
+
+    -- ** ResponseResourceMetricKey
+    responseResourceMetricKey_dimensions,
+    responseResourceMetricKey_metric,
+  )
+where
+
+import Amazonka.Pi.DescribeDimensionKeys
+import Amazonka.Pi.GetDimensionKeyDetails
+import Amazonka.Pi.GetResourceMetadata
+import Amazonka.Pi.GetResourceMetrics
+import Amazonka.Pi.ListAvailableResourceDimensions
+import Amazonka.Pi.ListAvailableResourceMetrics
+import Amazonka.Pi.Types.DataPoint
+import Amazonka.Pi.Types.DimensionDetail
+import Amazonka.Pi.Types.DimensionGroup
+import Amazonka.Pi.Types.DimensionGroupDetail
+import Amazonka.Pi.Types.DimensionKeyDescription
+import Amazonka.Pi.Types.DimensionKeyDetail
+import Amazonka.Pi.Types.FeatureMetadata
+import Amazonka.Pi.Types.MetricDimensionGroups
+import Amazonka.Pi.Types.MetricKeyDataPoints
+import Amazonka.Pi.Types.MetricQuery
+import Amazonka.Pi.Types.ResponsePartitionKey
+import Amazonka.Pi.Types.ResponseResourceMetric
+import Amazonka.Pi.Types.ResponseResourceMetricKey
diff --git a/gen/Amazonka/Pi/ListAvailableResourceDimensions.hs b/gen/Amazonka/Pi/ListAvailableResourceDimensions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/ListAvailableResourceDimensions.hs
@@ -0,0 +1,303 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.ListAvailableResourceDimensions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieve the dimensions that can be queried for each specified metric
+-- type on a specified DB instance.
+module Amazonka.Pi.ListAvailableResourceDimensions
+  ( -- * Creating a Request
+    ListAvailableResourceDimensions (..),
+    newListAvailableResourceDimensions,
+
+    -- * Request Lenses
+    listAvailableResourceDimensions_maxResults,
+    listAvailableResourceDimensions_nextToken,
+    listAvailableResourceDimensions_serviceType,
+    listAvailableResourceDimensions_identifier,
+    listAvailableResourceDimensions_metrics,
+
+    -- * Destructuring the Response
+    ListAvailableResourceDimensionsResponse (..),
+    newListAvailableResourceDimensionsResponse,
+
+    -- * Response Lenses
+    listAvailableResourceDimensionsResponse_metricDimensions,
+    listAvailableResourceDimensionsResponse_nextToken,
+    listAvailableResourceDimensionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListAvailableResourceDimensions' smart constructor.
+data ListAvailableResourceDimensions = ListAvailableResourceDimensions'
+  { -- | The maximum number of items to return in the response. If more items
+    -- exist than the specified @MaxRecords@ value, a pagination token is
+    -- included in the response so that the remaining results can be retrieved.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | An optional pagination token provided by a previous request. If this
+    -- parameter is specified, the response includes only records beyond the
+    -- token, up to the value specified by @MaxRecords@.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services service for which Performance Insights returns
+    -- metrics.
+    serviceType :: ServiceType,
+    -- | An immutable identifier for a data source that is unique within an
+    -- Amazon Web Services Region. Performance Insights gathers metrics from
+    -- this data source. To use an Amazon RDS DB instance as a data source,
+    -- specify its @DbiResourceId@ value. For example, specify
+    -- @db-ABCDEFGHIJKLMNOPQRSTU1VWZ@.
+    identifier :: Prelude.Text,
+    -- | The types of metrics for which to retrieve dimensions. Valid values
+    -- include @db.load@.
+    metrics :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAvailableResourceDimensions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listAvailableResourceDimensions_maxResults' - The maximum number of items to return in the response. If more items
+-- exist than the specified @MaxRecords@ value, a pagination token is
+-- included in the response so that the remaining results can be retrieved.
+--
+-- 'nextToken', 'listAvailableResourceDimensions_nextToken' - An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+--
+-- 'serviceType', 'listAvailableResourceDimensions_serviceType' - The Amazon Web Services service for which Performance Insights returns
+-- metrics.
+--
+-- 'identifier', 'listAvailableResourceDimensions_identifier' - An immutable identifier for a data source that is unique within an
+-- Amazon Web Services Region. Performance Insights gathers metrics from
+-- this data source. To use an Amazon RDS DB instance as a data source,
+-- specify its @DbiResourceId@ value. For example, specify
+-- @db-ABCDEFGHIJKLMNOPQRSTU1VWZ@.
+--
+-- 'metrics', 'listAvailableResourceDimensions_metrics' - The types of metrics for which to retrieve dimensions. Valid values
+-- include @db.load@.
+newListAvailableResourceDimensions ::
+  -- | 'serviceType'
+  ServiceType ->
+  -- | 'identifier'
+  Prelude.Text ->
+  -- | 'metrics'
+  Prelude.NonEmpty Prelude.Text ->
+  ListAvailableResourceDimensions
+newListAvailableResourceDimensions
+  pServiceType_
+  pIdentifier_
+  pMetrics_ =
+    ListAvailableResourceDimensions'
+      { maxResults =
+          Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        serviceType = pServiceType_,
+        identifier = pIdentifier_,
+        metrics = Lens.coerced Lens.# pMetrics_
+      }
+
+-- | The maximum number of items to return in the response. If more items
+-- exist than the specified @MaxRecords@ value, a pagination token is
+-- included in the response so that the remaining results can be retrieved.
+listAvailableResourceDimensions_maxResults :: Lens.Lens' ListAvailableResourceDimensions (Prelude.Maybe Prelude.Natural)
+listAvailableResourceDimensions_maxResults = Lens.lens (\ListAvailableResourceDimensions' {maxResults} -> maxResults) (\s@ListAvailableResourceDimensions' {} a -> s {maxResults = a} :: ListAvailableResourceDimensions)
+
+-- | An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+listAvailableResourceDimensions_nextToken :: Lens.Lens' ListAvailableResourceDimensions (Prelude.Maybe Prelude.Text)
+listAvailableResourceDimensions_nextToken = Lens.lens (\ListAvailableResourceDimensions' {nextToken} -> nextToken) (\s@ListAvailableResourceDimensions' {} a -> s {nextToken = a} :: ListAvailableResourceDimensions)
+
+-- | The Amazon Web Services service for which Performance Insights returns
+-- metrics.
+listAvailableResourceDimensions_serviceType :: Lens.Lens' ListAvailableResourceDimensions ServiceType
+listAvailableResourceDimensions_serviceType = Lens.lens (\ListAvailableResourceDimensions' {serviceType} -> serviceType) (\s@ListAvailableResourceDimensions' {} a -> s {serviceType = a} :: ListAvailableResourceDimensions)
+
+-- | An immutable identifier for a data source that is unique within an
+-- Amazon Web Services Region. Performance Insights gathers metrics from
+-- this data source. To use an Amazon RDS DB instance as a data source,
+-- specify its @DbiResourceId@ value. For example, specify
+-- @db-ABCDEFGHIJKLMNOPQRSTU1VWZ@.
+listAvailableResourceDimensions_identifier :: Lens.Lens' ListAvailableResourceDimensions Prelude.Text
+listAvailableResourceDimensions_identifier = Lens.lens (\ListAvailableResourceDimensions' {identifier} -> identifier) (\s@ListAvailableResourceDimensions' {} a -> s {identifier = a} :: ListAvailableResourceDimensions)
+
+-- | The types of metrics for which to retrieve dimensions. Valid values
+-- include @db.load@.
+listAvailableResourceDimensions_metrics :: Lens.Lens' ListAvailableResourceDimensions (Prelude.NonEmpty Prelude.Text)
+listAvailableResourceDimensions_metrics = Lens.lens (\ListAvailableResourceDimensions' {metrics} -> metrics) (\s@ListAvailableResourceDimensions' {} a -> s {metrics = a} :: ListAvailableResourceDimensions) Prelude.. Lens.coerced
+
+instance
+  Core.AWSRequest
+    ListAvailableResourceDimensions
+  where
+  type
+    AWSResponse ListAvailableResourceDimensions =
+      ListAvailableResourceDimensionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAvailableResourceDimensionsResponse'
+            Prelude.<$> ( x
+                            Data..?> "MetricDimensions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    ListAvailableResourceDimensions
+  where
+  hashWithSalt
+    _salt
+    ListAvailableResourceDimensions' {..} =
+      _salt
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+        `Prelude.hashWithSalt` serviceType
+        `Prelude.hashWithSalt` identifier
+        `Prelude.hashWithSalt` metrics
+
+instance
+  Prelude.NFData
+    ListAvailableResourceDimensions
+  where
+  rnf ListAvailableResourceDimensions' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf serviceType
+      `Prelude.seq` Prelude.rnf identifier
+      `Prelude.seq` Prelude.rnf metrics
+
+instance
+  Data.ToHeaders
+    ListAvailableResourceDimensions
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PerformanceInsightsv20180227.ListAvailableResourceDimensions" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListAvailableResourceDimensions where
+  toJSON ListAvailableResourceDimensions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("ServiceType" Data..= serviceType),
+            Prelude.Just ("Identifier" Data..= identifier),
+            Prelude.Just ("Metrics" Data..= metrics)
+          ]
+      )
+
+instance Data.ToPath ListAvailableResourceDimensions where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListAvailableResourceDimensions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListAvailableResourceDimensionsResponse' smart constructor.
+data ListAvailableResourceDimensionsResponse = ListAvailableResourceDimensionsResponse'
+  { -- | The dimension information returned for requested metric types.
+    metricDimensions :: Prelude.Maybe [MetricDimensionGroups],
+    -- | An optional pagination token provided by a previous request. If this
+    -- parameter is specified, the response includes only records beyond the
+    -- token, up to the value specified by @MaxRecords@.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAvailableResourceDimensionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metricDimensions', 'listAvailableResourceDimensionsResponse_metricDimensions' - The dimension information returned for requested metric types.
+--
+-- 'nextToken', 'listAvailableResourceDimensionsResponse_nextToken' - An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+--
+-- 'httpStatus', 'listAvailableResourceDimensionsResponse_httpStatus' - The response's http status code.
+newListAvailableResourceDimensionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAvailableResourceDimensionsResponse
+newListAvailableResourceDimensionsResponse
+  pHttpStatus_ =
+    ListAvailableResourceDimensionsResponse'
+      { metricDimensions =
+          Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | The dimension information returned for requested metric types.
+listAvailableResourceDimensionsResponse_metricDimensions :: Lens.Lens' ListAvailableResourceDimensionsResponse (Prelude.Maybe [MetricDimensionGroups])
+listAvailableResourceDimensionsResponse_metricDimensions = Lens.lens (\ListAvailableResourceDimensionsResponse' {metricDimensions} -> metricDimensions) (\s@ListAvailableResourceDimensionsResponse' {} a -> s {metricDimensions = a} :: ListAvailableResourceDimensionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+listAvailableResourceDimensionsResponse_nextToken :: Lens.Lens' ListAvailableResourceDimensionsResponse (Prelude.Maybe Prelude.Text)
+listAvailableResourceDimensionsResponse_nextToken = Lens.lens (\ListAvailableResourceDimensionsResponse' {nextToken} -> nextToken) (\s@ListAvailableResourceDimensionsResponse' {} a -> s {nextToken = a} :: ListAvailableResourceDimensionsResponse)
+
+-- | The response's http status code.
+listAvailableResourceDimensionsResponse_httpStatus :: Lens.Lens' ListAvailableResourceDimensionsResponse Prelude.Int
+listAvailableResourceDimensionsResponse_httpStatus = Lens.lens (\ListAvailableResourceDimensionsResponse' {httpStatus} -> httpStatus) (\s@ListAvailableResourceDimensionsResponse' {} a -> s {httpStatus = a} :: ListAvailableResourceDimensionsResponse)
+
+instance
+  Prelude.NFData
+    ListAvailableResourceDimensionsResponse
+  where
+  rnf ListAvailableResourceDimensionsResponse' {..} =
+    Prelude.rnf metricDimensions
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Pi/ListAvailableResourceMetrics.hs b/gen/Amazonka/Pi/ListAvailableResourceMetrics.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/ListAvailableResourceMetrics.hs
@@ -0,0 +1,321 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.ListAvailableResourceMetrics
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieve metrics of the specified types that can be queried for a
+-- specified DB instance.
+module Amazonka.Pi.ListAvailableResourceMetrics
+  ( -- * Creating a Request
+    ListAvailableResourceMetrics (..),
+    newListAvailableResourceMetrics,
+
+    -- * Request Lenses
+    listAvailableResourceMetrics_maxResults,
+    listAvailableResourceMetrics_nextToken,
+    listAvailableResourceMetrics_serviceType,
+    listAvailableResourceMetrics_identifier,
+    listAvailableResourceMetrics_metricTypes,
+
+    -- * Destructuring the Response
+    ListAvailableResourceMetricsResponse (..),
+    newListAvailableResourceMetricsResponse,
+
+    -- * Response Lenses
+    listAvailableResourceMetricsResponse_metrics,
+    listAvailableResourceMetricsResponse_nextToken,
+    listAvailableResourceMetricsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListAvailableResourceMetrics' smart constructor.
+data ListAvailableResourceMetrics = ListAvailableResourceMetrics'
+  { -- | The maximum number of items to return. If the @MaxRecords@ value is less
+    -- than the number of existing items, the response includes a pagination
+    -- token.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | An optional pagination token provided by a previous request. If this
+    -- parameter is specified, the response includes only records beyond the
+    -- token, up to the value specified by @MaxRecords@.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Web Services service for which Performance Insights returns
+    -- metrics.
+    serviceType :: ServiceType,
+    -- | An immutable identifier for a data source that is unique within an
+    -- Amazon Web Services Region. Performance Insights gathers metrics from
+    -- this data source. To use an Amazon RDS DB instance as a data source,
+    -- specify its @DbiResourceId@ value. For example, specify
+    -- @db-ABCDEFGHIJKLMNOPQRSTU1VWZ@.
+    identifier :: Prelude.Text,
+    -- | The types of metrics to return in the response. Valid values in the
+    -- array include the following:
+    --
+    -- -   @os@ (OS counter metrics) - All engines
+    --
+    -- -   @db@ (DB load metrics) - All engines except for Amazon DocumentDB
+    --
+    -- -   @db.sql.stats@ (per-SQL metrics) - All engines except for Amazon
+    --     DocumentDB
+    --
+    -- -   @db.sql_tokenized.stats@ (per-SQL digest metrics) - All engines
+    --     except for Amazon DocumentDB
+    metricTypes :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAvailableResourceMetrics' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listAvailableResourceMetrics_maxResults' - The maximum number of items to return. If the @MaxRecords@ value is less
+-- than the number of existing items, the response includes a pagination
+-- token.
+--
+-- 'nextToken', 'listAvailableResourceMetrics_nextToken' - An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+--
+-- 'serviceType', 'listAvailableResourceMetrics_serviceType' - The Amazon Web Services service for which Performance Insights returns
+-- metrics.
+--
+-- 'identifier', 'listAvailableResourceMetrics_identifier' - An immutable identifier for a data source that is unique within an
+-- Amazon Web Services Region. Performance Insights gathers metrics from
+-- this data source. To use an Amazon RDS DB instance as a data source,
+-- specify its @DbiResourceId@ value. For example, specify
+-- @db-ABCDEFGHIJKLMNOPQRSTU1VWZ@.
+--
+-- 'metricTypes', 'listAvailableResourceMetrics_metricTypes' - The types of metrics to return in the response. Valid values in the
+-- array include the following:
+--
+-- -   @os@ (OS counter metrics) - All engines
+--
+-- -   @db@ (DB load metrics) - All engines except for Amazon DocumentDB
+--
+-- -   @db.sql.stats@ (per-SQL metrics) - All engines except for Amazon
+--     DocumentDB
+--
+-- -   @db.sql_tokenized.stats@ (per-SQL digest metrics) - All engines
+--     except for Amazon DocumentDB
+newListAvailableResourceMetrics ::
+  -- | 'serviceType'
+  ServiceType ->
+  -- | 'identifier'
+  Prelude.Text ->
+  ListAvailableResourceMetrics
+newListAvailableResourceMetrics
+  pServiceType_
+  pIdentifier_ =
+    ListAvailableResourceMetrics'
+      { maxResults =
+          Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        serviceType = pServiceType_,
+        identifier = pIdentifier_,
+        metricTypes = Prelude.mempty
+      }
+
+-- | The maximum number of items to return. If the @MaxRecords@ value is less
+-- than the number of existing items, the response includes a pagination
+-- token.
+listAvailableResourceMetrics_maxResults :: Lens.Lens' ListAvailableResourceMetrics (Prelude.Maybe Prelude.Natural)
+listAvailableResourceMetrics_maxResults = Lens.lens (\ListAvailableResourceMetrics' {maxResults} -> maxResults) (\s@ListAvailableResourceMetrics' {} a -> s {maxResults = a} :: ListAvailableResourceMetrics)
+
+-- | An optional pagination token provided by a previous request. If this
+-- parameter is specified, the response includes only records beyond the
+-- token, up to the value specified by @MaxRecords@.
+listAvailableResourceMetrics_nextToken :: Lens.Lens' ListAvailableResourceMetrics (Prelude.Maybe Prelude.Text)
+listAvailableResourceMetrics_nextToken = Lens.lens (\ListAvailableResourceMetrics' {nextToken} -> nextToken) (\s@ListAvailableResourceMetrics' {} a -> s {nextToken = a} :: ListAvailableResourceMetrics)
+
+-- | The Amazon Web Services service for which Performance Insights returns
+-- metrics.
+listAvailableResourceMetrics_serviceType :: Lens.Lens' ListAvailableResourceMetrics ServiceType
+listAvailableResourceMetrics_serviceType = Lens.lens (\ListAvailableResourceMetrics' {serviceType} -> serviceType) (\s@ListAvailableResourceMetrics' {} a -> s {serviceType = a} :: ListAvailableResourceMetrics)
+
+-- | An immutable identifier for a data source that is unique within an
+-- Amazon Web Services Region. Performance Insights gathers metrics from
+-- this data source. To use an Amazon RDS DB instance as a data source,
+-- specify its @DbiResourceId@ value. For example, specify
+-- @db-ABCDEFGHIJKLMNOPQRSTU1VWZ@.
+listAvailableResourceMetrics_identifier :: Lens.Lens' ListAvailableResourceMetrics Prelude.Text
+listAvailableResourceMetrics_identifier = Lens.lens (\ListAvailableResourceMetrics' {identifier} -> identifier) (\s@ListAvailableResourceMetrics' {} a -> s {identifier = a} :: ListAvailableResourceMetrics)
+
+-- | The types of metrics to return in the response. Valid values in the
+-- array include the following:
+--
+-- -   @os@ (OS counter metrics) - All engines
+--
+-- -   @db@ (DB load metrics) - All engines except for Amazon DocumentDB
+--
+-- -   @db.sql.stats@ (per-SQL metrics) - All engines except for Amazon
+--     DocumentDB
+--
+-- -   @db.sql_tokenized.stats@ (per-SQL digest metrics) - All engines
+--     except for Amazon DocumentDB
+listAvailableResourceMetrics_metricTypes :: Lens.Lens' ListAvailableResourceMetrics [Prelude.Text]
+listAvailableResourceMetrics_metricTypes = Lens.lens (\ListAvailableResourceMetrics' {metricTypes} -> metricTypes) (\s@ListAvailableResourceMetrics' {} a -> s {metricTypes = a} :: ListAvailableResourceMetrics) Prelude.. Lens.coerced
+
+instance Core.AWSRequest ListAvailableResourceMetrics where
+  type
+    AWSResponse ListAvailableResourceMetrics =
+      ListAvailableResourceMetricsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAvailableResourceMetricsResponse'
+            Prelude.<$> (x Data..?> "Metrics" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    ListAvailableResourceMetrics
+  where
+  hashWithSalt _salt ListAvailableResourceMetrics' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` serviceType
+      `Prelude.hashWithSalt` identifier
+      `Prelude.hashWithSalt` metricTypes
+
+instance Prelude.NFData ListAvailableResourceMetrics where
+  rnf ListAvailableResourceMetrics' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf serviceType
+      `Prelude.seq` Prelude.rnf identifier
+      `Prelude.seq` Prelude.rnf metricTypes
+
+instance Data.ToHeaders ListAvailableResourceMetrics where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "PerformanceInsightsv20180227.ListAvailableResourceMetrics" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListAvailableResourceMetrics where
+  toJSON ListAvailableResourceMetrics' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("ServiceType" Data..= serviceType),
+            Prelude.Just ("Identifier" Data..= identifier),
+            Prelude.Just ("MetricTypes" Data..= metricTypes)
+          ]
+      )
+
+instance Data.ToPath ListAvailableResourceMetrics where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListAvailableResourceMetrics where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListAvailableResourceMetricsResponse' smart constructor.
+data ListAvailableResourceMetricsResponse = ListAvailableResourceMetricsResponse'
+  { -- | An array of metrics available to query. Each array element contains the
+    -- full name, description, and unit of the metric.
+    metrics :: Prelude.Maybe [ResponseResourceMetric],
+    -- | A pagination token that indicates the response didn’t return all
+    -- available records because @MaxRecords@ was specified in the previous
+    -- request. To get the remaining records, specify @NextToken@ in a separate
+    -- request with this value.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAvailableResourceMetricsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metrics', 'listAvailableResourceMetricsResponse_metrics' - An array of metrics available to query. Each array element contains the
+-- full name, description, and unit of the metric.
+--
+-- 'nextToken', 'listAvailableResourceMetricsResponse_nextToken' - A pagination token that indicates the response didn’t return all
+-- available records because @MaxRecords@ was specified in the previous
+-- request. To get the remaining records, specify @NextToken@ in a separate
+-- request with this value.
+--
+-- 'httpStatus', 'listAvailableResourceMetricsResponse_httpStatus' - The response's http status code.
+newListAvailableResourceMetricsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAvailableResourceMetricsResponse
+newListAvailableResourceMetricsResponse pHttpStatus_ =
+  ListAvailableResourceMetricsResponse'
+    { metrics =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of metrics available to query. Each array element contains the
+-- full name, description, and unit of the metric.
+listAvailableResourceMetricsResponse_metrics :: Lens.Lens' ListAvailableResourceMetricsResponse (Prelude.Maybe [ResponseResourceMetric])
+listAvailableResourceMetricsResponse_metrics = Lens.lens (\ListAvailableResourceMetricsResponse' {metrics} -> metrics) (\s@ListAvailableResourceMetricsResponse' {} a -> s {metrics = a} :: ListAvailableResourceMetricsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A pagination token that indicates the response didn’t return all
+-- available records because @MaxRecords@ was specified in the previous
+-- request. To get the remaining records, specify @NextToken@ in a separate
+-- request with this value.
+listAvailableResourceMetricsResponse_nextToken :: Lens.Lens' ListAvailableResourceMetricsResponse (Prelude.Maybe Prelude.Text)
+listAvailableResourceMetricsResponse_nextToken = Lens.lens (\ListAvailableResourceMetricsResponse' {nextToken} -> nextToken) (\s@ListAvailableResourceMetricsResponse' {} a -> s {nextToken = a} :: ListAvailableResourceMetricsResponse)
+
+-- | The response's http status code.
+listAvailableResourceMetricsResponse_httpStatus :: Lens.Lens' ListAvailableResourceMetricsResponse Prelude.Int
+listAvailableResourceMetricsResponse_httpStatus = Lens.lens (\ListAvailableResourceMetricsResponse' {httpStatus} -> httpStatus) (\s@ListAvailableResourceMetricsResponse' {} a -> s {httpStatus = a} :: ListAvailableResourceMetricsResponse)
+
+instance
+  Prelude.NFData
+    ListAvailableResourceMetricsResponse
+  where
+  rnf ListAvailableResourceMetricsResponse' {..} =
+    Prelude.rnf metrics
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Pi/Types.hs b/gen/Amazonka/Pi/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types.hs
@@ -0,0 +1,227 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _InternalServiceError,
+    _InvalidArgumentException,
+    _NotAuthorizedException,
+
+    -- * DetailStatus
+    DetailStatus (..),
+
+    -- * FeatureStatus
+    FeatureStatus (..),
+
+    -- * ServiceType
+    ServiceType (..),
+
+    -- * DataPoint
+    DataPoint (..),
+    newDataPoint,
+    dataPoint_timestamp,
+    dataPoint_value,
+
+    -- * DimensionDetail
+    DimensionDetail (..),
+    newDimensionDetail,
+    dimensionDetail_identifier,
+
+    -- * DimensionGroup
+    DimensionGroup (..),
+    newDimensionGroup,
+    dimensionGroup_dimensions,
+    dimensionGroup_limit,
+    dimensionGroup_group,
+
+    -- * DimensionGroupDetail
+    DimensionGroupDetail (..),
+    newDimensionGroupDetail,
+    dimensionGroupDetail_dimensions,
+    dimensionGroupDetail_group,
+
+    -- * DimensionKeyDescription
+    DimensionKeyDescription (..),
+    newDimensionKeyDescription,
+    dimensionKeyDescription_additionalMetrics,
+    dimensionKeyDescription_dimensions,
+    dimensionKeyDescription_partitions,
+    dimensionKeyDescription_total,
+
+    -- * DimensionKeyDetail
+    DimensionKeyDetail (..),
+    newDimensionKeyDetail,
+    dimensionKeyDetail_dimension,
+    dimensionKeyDetail_status,
+    dimensionKeyDetail_value,
+
+    -- * FeatureMetadata
+    FeatureMetadata (..),
+    newFeatureMetadata,
+    featureMetadata_status,
+
+    -- * MetricDimensionGroups
+    MetricDimensionGroups (..),
+    newMetricDimensionGroups,
+    metricDimensionGroups_groups,
+    metricDimensionGroups_metric,
+
+    -- * MetricKeyDataPoints
+    MetricKeyDataPoints (..),
+    newMetricKeyDataPoints,
+    metricKeyDataPoints_dataPoints,
+    metricKeyDataPoints_key,
+
+    -- * MetricQuery
+    MetricQuery (..),
+    newMetricQuery,
+    metricQuery_filter,
+    metricQuery_groupBy,
+    metricQuery_metric,
+
+    -- * ResponsePartitionKey
+    ResponsePartitionKey (..),
+    newResponsePartitionKey,
+    responsePartitionKey_dimensions,
+
+    -- * ResponseResourceMetric
+    ResponseResourceMetric (..),
+    newResponseResourceMetric,
+    responseResourceMetric_description,
+    responseResourceMetric_metric,
+    responseResourceMetric_unit,
+
+    -- * ResponseResourceMetricKey
+    ResponseResourceMetricKey (..),
+    newResponseResourceMetricKey,
+    responseResourceMetricKey_dimensions,
+    responseResourceMetricKey_metric,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.Pi.Types.DataPoint
+import Amazonka.Pi.Types.DetailStatus
+import Amazonka.Pi.Types.DimensionDetail
+import Amazonka.Pi.Types.DimensionGroup
+import Amazonka.Pi.Types.DimensionGroupDetail
+import Amazonka.Pi.Types.DimensionKeyDescription
+import Amazonka.Pi.Types.DimensionKeyDetail
+import Amazonka.Pi.Types.FeatureMetadata
+import Amazonka.Pi.Types.FeatureStatus
+import Amazonka.Pi.Types.MetricDimensionGroups
+import Amazonka.Pi.Types.MetricKeyDataPoints
+import Amazonka.Pi.Types.MetricQuery
+import Amazonka.Pi.Types.ResponsePartitionKey
+import Amazonka.Pi.Types.ResponseResourceMetric
+import Amazonka.Pi.Types.ResponseResourceMetricKey
+import Amazonka.Pi.Types.ServiceType
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2018-02-27@ of the Amazon Performance Insights SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "Pi",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "pi",
+      Core.signingName = "pi",
+      Core.version = "2018-02-27",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "Pi",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | The request failed due to an unknown error.
+_InternalServiceError :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServiceError =
+  Core._MatchServiceError
+    defaultService
+    "InternalServiceError"
+
+-- | One of the arguments provided is invalid for this request.
+_InvalidArgumentException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidArgumentException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidArgumentException"
+
+-- | The user is not authorized to perform this request.
+_NotAuthorizedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_NotAuthorizedException =
+  Core._MatchServiceError
+    defaultService
+    "NotAuthorizedException"
diff --git a/gen/Amazonka/Pi/Types/DataPoint.hs b/gen/Amazonka/Pi/Types/DataPoint.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/DataPoint.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.DataPoint
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.DataPoint where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A timestamp, and a single numerical value, which together represent a
+-- measurement at a particular point in time.
+--
+-- /See:/ 'newDataPoint' smart constructor.
+data DataPoint = DataPoint'
+  { -- | The time, in epoch format, associated with a particular @Value@.
+    timestamp :: Data.POSIX,
+    -- | The actual value associated with a particular @Timestamp@.
+    value :: Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataPoint' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'timestamp', 'dataPoint_timestamp' - The time, in epoch format, associated with a particular @Value@.
+--
+-- 'value', 'dataPoint_value' - The actual value associated with a particular @Timestamp@.
+newDataPoint ::
+  -- | 'timestamp'
+  Prelude.UTCTime ->
+  -- | 'value'
+  Prelude.Double ->
+  DataPoint
+newDataPoint pTimestamp_ pValue_ =
+  DataPoint'
+    { timestamp =
+        Data._Time Lens.# pTimestamp_,
+      value = pValue_
+    }
+
+-- | The time, in epoch format, associated with a particular @Value@.
+dataPoint_timestamp :: Lens.Lens' DataPoint Prelude.UTCTime
+dataPoint_timestamp = Lens.lens (\DataPoint' {timestamp} -> timestamp) (\s@DataPoint' {} a -> s {timestamp = a} :: DataPoint) Prelude.. Data._Time
+
+-- | The actual value associated with a particular @Timestamp@.
+dataPoint_value :: Lens.Lens' DataPoint Prelude.Double
+dataPoint_value = Lens.lens (\DataPoint' {value} -> value) (\s@DataPoint' {} a -> s {value = a} :: DataPoint)
+
+instance Data.FromJSON DataPoint where
+  parseJSON =
+    Data.withObject
+      "DataPoint"
+      ( \x ->
+          DataPoint'
+            Prelude.<$> (x Data..: "Timestamp")
+            Prelude.<*> (x Data..: "Value")
+      )
+
+instance Prelude.Hashable DataPoint where
+  hashWithSalt _salt DataPoint' {..} =
+    _salt
+      `Prelude.hashWithSalt` timestamp
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData DataPoint where
+  rnf DataPoint' {..} =
+    Prelude.rnf timestamp
+      `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/Pi/Types/DetailStatus.hs b/gen/Amazonka/Pi/Types/DetailStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/DetailStatus.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.DetailStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.DetailStatus
+  ( DetailStatus
+      ( ..,
+        DetailStatus_AVAILABLE,
+        DetailStatus_PROCESSING,
+        DetailStatus_UNAVAILABLE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DetailStatus = DetailStatus'
+  { fromDetailStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DetailStatus_AVAILABLE :: DetailStatus
+pattern DetailStatus_AVAILABLE = DetailStatus' "AVAILABLE"
+
+pattern DetailStatus_PROCESSING :: DetailStatus
+pattern DetailStatus_PROCESSING = DetailStatus' "PROCESSING"
+
+pattern DetailStatus_UNAVAILABLE :: DetailStatus
+pattern DetailStatus_UNAVAILABLE = DetailStatus' "UNAVAILABLE"
+
+{-# COMPLETE
+  DetailStatus_AVAILABLE,
+  DetailStatus_PROCESSING,
+  DetailStatus_UNAVAILABLE,
+  DetailStatus'
+  #-}
diff --git a/gen/Amazonka/Pi/Types/DimensionDetail.hs b/gen/Amazonka/Pi/Types/DimensionDetail.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/DimensionDetail.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.DimensionDetail
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.DimensionDetail where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The information about a dimension.
+--
+-- /See:/ 'newDimensionDetail' smart constructor.
+data DimensionDetail = DimensionDetail'
+  { -- | The identifier of a dimension.
+    identifier :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DimensionDetail' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'identifier', 'dimensionDetail_identifier' - The identifier of a dimension.
+newDimensionDetail ::
+  DimensionDetail
+newDimensionDetail =
+  DimensionDetail' {identifier = Prelude.Nothing}
+
+-- | The identifier of a dimension.
+dimensionDetail_identifier :: Lens.Lens' DimensionDetail (Prelude.Maybe Prelude.Text)
+dimensionDetail_identifier = Lens.lens (\DimensionDetail' {identifier} -> identifier) (\s@DimensionDetail' {} a -> s {identifier = a} :: DimensionDetail)
+
+instance Data.FromJSON DimensionDetail where
+  parseJSON =
+    Data.withObject
+      "DimensionDetail"
+      ( \x ->
+          DimensionDetail'
+            Prelude.<$> (x Data..:? "Identifier")
+      )
+
+instance Prelude.Hashable DimensionDetail where
+  hashWithSalt _salt DimensionDetail' {..} =
+    _salt `Prelude.hashWithSalt` identifier
+
+instance Prelude.NFData DimensionDetail where
+  rnf DimensionDetail' {..} = Prelude.rnf identifier
diff --git a/gen/Amazonka/Pi/Types/DimensionGroup.hs b/gen/Amazonka/Pi/Types/DimensionGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/DimensionGroup.hs
@@ -0,0 +1,579 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.DimensionGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.DimensionGroup where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A logical grouping of Performance Insights metrics for a related subject
+-- area. For example, the @db.sql@ dimension group consists of the
+-- following dimensions:
+--
+-- -   @db.sql.id@ - The hash of a running SQL statement, generated by
+--     Performance Insights.
+--
+-- -   @db.sql.db_id@ - Either the SQL ID generated by the database engine,
+--     or a value generated by Performance Insights that begins with @pi-@.
+--
+-- -   @db.sql.statement@ - The full text of the SQL statement that is
+--     running, for example, @SELECT * FROM employees@.
+--
+-- -   @db.sql_tokenized.id@ - The hash of the SQL digest generated by
+--     Performance Insights.
+--
+-- Each response element returns a maximum of 500 bytes. For larger
+-- elements, such as SQL statements, only the first 500 bytes are returned.
+--
+-- /See:/ 'newDimensionGroup' smart constructor.
+data DimensionGroup = DimensionGroup'
+  { -- | A list of specific dimensions from a dimension group. If this parameter
+    -- is not present, then it signifies that all of the dimensions in the
+    -- group were requested, or are present in the response.
+    --
+    -- Valid values for elements in the @Dimensions@ array are:
+    --
+    -- -   @db.application.name@ - The name of the application that is
+    --     connected to the database. Valid values are as follows:
+    --
+    --     -   Aurora PostgreSQL
+    --
+    --     -   Amazon RDS PostgreSQL
+    --
+    --     -   Amazon DocumentDB
+    --
+    -- -   @db.host.id@ - The host ID of the connected client (all engines).
+    --
+    -- -   @db.host.name@ - The host name of the connected client (all
+    --     engines).
+    --
+    -- -   @db.name@ - The name of the database to which the client is
+    --     connected. Valid values are as follows:
+    --
+    --     -   Aurora PostgreSQL
+    --
+    --     -   Amazon RDS PostgreSQL
+    --
+    --     -   Aurora MySQL
+    --
+    --     -   Amazon RDS MySQL
+    --
+    --     -   Amazon RDS MariaDB
+    --
+    --     -   Amazon DocumentDB
+    --
+    -- -   @db.query.id@ - The query ID generated by Performance Insights (only
+    --     Amazon DocumentDB).
+    --
+    -- -   @db.query.db_id@ - The query ID generated by the database (only
+    --     Amazon DocumentDB).
+    --
+    -- -   @db.query.statement@ - The text of the query that is being run (only
+    --     Amazon DocumentDB).
+    --
+    -- -   @db.query.tokenized_id@
+    --
+    -- -   @db.query.tokenized.id@ - The query digest ID generated by
+    --     Performance Insights (only Amazon DocumentDB).
+    --
+    -- -   @db.query.tokenized.db_id@ - The query digest ID generated by
+    --     Performance Insights (only Amazon DocumentDB).
+    --
+    -- -   @db.query.tokenized.statement@ - The text of the query digest (only
+    --     Amazon DocumentDB).
+    --
+    -- -   @db.session_type.name@ - The type of the current session (only
+    --     Amazon DocumentDB).
+    --
+    -- -   @db.sql.id@ - The hash of the full, non-tokenized SQL statement
+    --     generated by Performance Insights (all engines except Amazon
+    --     DocumentDB).
+    --
+    -- -   @db.sql.db_id@ - Either the SQL ID generated by the database engine,
+    --     or a value generated by Performance Insights that begins with @pi-@
+    --     (all engines except Amazon DocumentDB).
+    --
+    -- -   @db.sql.statement@ - The full text of the SQL statement that is
+    --     running, as in @SELECT * FROM employees@ (all engines except Amazon
+    --     DocumentDB)
+    --
+    -- -   @db.sql.tokenized_id@
+    --
+    -- -   @db.sql_tokenized.id@ - The hash of the SQL digest generated by
+    --     Performance Insights (all engines except Amazon DocumentDB). In the
+    --     console, @db.sql_tokenized.id@ is called the Support ID because
+    --     Amazon Web Services Support can look at this data to help you
+    --     troubleshoot database issues.
+    --
+    -- -   @db.sql_tokenized.db_id@ - Either the native database ID used to
+    --     refer to the SQL statement, or a synthetic ID such as
+    --     @pi-2372568224@ that Performance Insights generates if the native
+    --     database ID isn\'t available (all engines except Amazon DocumentDB).
+    --
+    -- -   @db.sql_tokenized.statement@ - The text of the SQL digest, as in
+    --     @SELECT * FROM employees WHERE employee_id = ?@ (all engines except
+    --     Amazon DocumentDB)
+    --
+    -- -   @db.user.id@ - The ID of the user logged in to the database (all
+    --     engines except Amazon DocumentDB).
+    --
+    -- -   @db.user.name@ - The name of the user logged in to the database (all
+    --     engines except Amazon DocumentDB).
+    --
+    -- -   @db.wait_event.name@ - The event for which the backend is waiting
+    --     (all engines except Amazon DocumentDB).
+    --
+    -- -   @db.wait_event.type@ - The type of event for which the backend is
+    --     waiting (all engines except Amazon DocumentDB).
+    --
+    -- -   @db.wait_event_type.name@ - The name of the event type for which the
+    --     backend is waiting (all engines except Amazon DocumentDB).
+    --
+    -- -   @db.wait_state.name@ - The event for which the backend is waiting
+    --     (only Amazon DocumentDB).
+    dimensions :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The maximum number of items to fetch for this dimension group.
+    limit :: Prelude.Maybe Prelude.Natural,
+    -- | The name of the dimension group. Valid values are as follows:
+    --
+    -- -   @db@ - The name of the database to which the client is connected.
+    --     The following values are permitted:
+    --
+    --     -   Aurora PostgreSQL
+    --
+    --     -   Amazon RDS PostgreSQL
+    --
+    --     -   Aurora MySQL
+    --
+    --     -   Amazon RDS MySQL
+    --
+    --     -   Amazon RDS MariaDB
+    --
+    --     -   Amazon DocumentDB
+    --
+    -- -   @db.application@ - The name of the application that is connected to
+    --     the database. The following values are permitted:
+    --
+    --     -   Aurora PostgreSQL
+    --
+    --     -   Amazon RDS PostgreSQL
+    --
+    --     -   Amazon DocumentDB
+    --
+    -- -   @db.host@ - The host name of the connected client (all engines).
+    --
+    -- -   @db.query@ - The query that is currently running (only Amazon
+    --     DocumentDB).
+    --
+    -- -   @db.query_tokenized@ - The digest query (only Amazon DocumentDB).
+    --
+    -- -   @db.session_type@ - The type of the current session (only Aurora
+    --     PostgreSQL and RDS PostgreSQL).
+    --
+    -- -   @db.sql@ - The text of the SQL statement that is currently running
+    --     (all engines except Amazon DocumentDB).
+    --
+    -- -   @db.sql_tokenized@ - The SQL digest (all engines except Amazon
+    --     DocumentDB).
+    --
+    -- -   @db.user@ - The user logged in to the database (all engines except
+    --     Amazon DocumentDB).
+    --
+    -- -   @db.wait_event@ - The event for which the database backend is
+    --     waiting (all engines except Amazon DocumentDB).
+    --
+    -- -   @db.wait_event_type@ - The type of event for which the database
+    --     backend is waiting (all engines except Amazon DocumentDB).
+    --
+    -- -   @db.wait_state@ - The event for which the database backend is
+    --     waiting (only Amazon DocumentDB).
+    group' :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DimensionGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dimensions', 'dimensionGroup_dimensions' - A list of specific dimensions from a dimension group. If this parameter
+-- is not present, then it signifies that all of the dimensions in the
+-- group were requested, or are present in the response.
+--
+-- Valid values for elements in the @Dimensions@ array are:
+--
+-- -   @db.application.name@ - The name of the application that is
+--     connected to the database. Valid values are as follows:
+--
+--     -   Aurora PostgreSQL
+--
+--     -   Amazon RDS PostgreSQL
+--
+--     -   Amazon DocumentDB
+--
+-- -   @db.host.id@ - The host ID of the connected client (all engines).
+--
+-- -   @db.host.name@ - The host name of the connected client (all
+--     engines).
+--
+-- -   @db.name@ - The name of the database to which the client is
+--     connected. Valid values are as follows:
+--
+--     -   Aurora PostgreSQL
+--
+--     -   Amazon RDS PostgreSQL
+--
+--     -   Aurora MySQL
+--
+--     -   Amazon RDS MySQL
+--
+--     -   Amazon RDS MariaDB
+--
+--     -   Amazon DocumentDB
+--
+-- -   @db.query.id@ - The query ID generated by Performance Insights (only
+--     Amazon DocumentDB).
+--
+-- -   @db.query.db_id@ - The query ID generated by the database (only
+--     Amazon DocumentDB).
+--
+-- -   @db.query.statement@ - The text of the query that is being run (only
+--     Amazon DocumentDB).
+--
+-- -   @db.query.tokenized_id@
+--
+-- -   @db.query.tokenized.id@ - The query digest ID generated by
+--     Performance Insights (only Amazon DocumentDB).
+--
+-- -   @db.query.tokenized.db_id@ - The query digest ID generated by
+--     Performance Insights (only Amazon DocumentDB).
+--
+-- -   @db.query.tokenized.statement@ - The text of the query digest (only
+--     Amazon DocumentDB).
+--
+-- -   @db.session_type.name@ - The type of the current session (only
+--     Amazon DocumentDB).
+--
+-- -   @db.sql.id@ - The hash of the full, non-tokenized SQL statement
+--     generated by Performance Insights (all engines except Amazon
+--     DocumentDB).
+--
+-- -   @db.sql.db_id@ - Either the SQL ID generated by the database engine,
+--     or a value generated by Performance Insights that begins with @pi-@
+--     (all engines except Amazon DocumentDB).
+--
+-- -   @db.sql.statement@ - The full text of the SQL statement that is
+--     running, as in @SELECT * FROM employees@ (all engines except Amazon
+--     DocumentDB)
+--
+-- -   @db.sql.tokenized_id@
+--
+-- -   @db.sql_tokenized.id@ - The hash of the SQL digest generated by
+--     Performance Insights (all engines except Amazon DocumentDB). In the
+--     console, @db.sql_tokenized.id@ is called the Support ID because
+--     Amazon Web Services Support can look at this data to help you
+--     troubleshoot database issues.
+--
+-- -   @db.sql_tokenized.db_id@ - Either the native database ID used to
+--     refer to the SQL statement, or a synthetic ID such as
+--     @pi-2372568224@ that Performance Insights generates if the native
+--     database ID isn\'t available (all engines except Amazon DocumentDB).
+--
+-- -   @db.sql_tokenized.statement@ - The text of the SQL digest, as in
+--     @SELECT * FROM employees WHERE employee_id = ?@ (all engines except
+--     Amazon DocumentDB)
+--
+-- -   @db.user.id@ - The ID of the user logged in to the database (all
+--     engines except Amazon DocumentDB).
+--
+-- -   @db.user.name@ - The name of the user logged in to the database (all
+--     engines except Amazon DocumentDB).
+--
+-- -   @db.wait_event.name@ - The event for which the backend is waiting
+--     (all engines except Amazon DocumentDB).
+--
+-- -   @db.wait_event.type@ - The type of event for which the backend is
+--     waiting (all engines except Amazon DocumentDB).
+--
+-- -   @db.wait_event_type.name@ - The name of the event type for which the
+--     backend is waiting (all engines except Amazon DocumentDB).
+--
+-- -   @db.wait_state.name@ - The event for which the backend is waiting
+--     (only Amazon DocumentDB).
+--
+-- 'limit', 'dimensionGroup_limit' - The maximum number of items to fetch for this dimension group.
+--
+-- 'group'', 'dimensionGroup_group' - The name of the dimension group. Valid values are as follows:
+--
+-- -   @db@ - The name of the database to which the client is connected.
+--     The following values are permitted:
+--
+--     -   Aurora PostgreSQL
+--
+--     -   Amazon RDS PostgreSQL
+--
+--     -   Aurora MySQL
+--
+--     -   Amazon RDS MySQL
+--
+--     -   Amazon RDS MariaDB
+--
+--     -   Amazon DocumentDB
+--
+-- -   @db.application@ - The name of the application that is connected to
+--     the database. The following values are permitted:
+--
+--     -   Aurora PostgreSQL
+--
+--     -   Amazon RDS PostgreSQL
+--
+--     -   Amazon DocumentDB
+--
+-- -   @db.host@ - The host name of the connected client (all engines).
+--
+-- -   @db.query@ - The query that is currently running (only Amazon
+--     DocumentDB).
+--
+-- -   @db.query_tokenized@ - The digest query (only Amazon DocumentDB).
+--
+-- -   @db.session_type@ - The type of the current session (only Aurora
+--     PostgreSQL and RDS PostgreSQL).
+--
+-- -   @db.sql@ - The text of the SQL statement that is currently running
+--     (all engines except Amazon DocumentDB).
+--
+-- -   @db.sql_tokenized@ - The SQL digest (all engines except Amazon
+--     DocumentDB).
+--
+-- -   @db.user@ - The user logged in to the database (all engines except
+--     Amazon DocumentDB).
+--
+-- -   @db.wait_event@ - The event for which the database backend is
+--     waiting (all engines except Amazon DocumentDB).
+--
+-- -   @db.wait_event_type@ - The type of event for which the database
+--     backend is waiting (all engines except Amazon DocumentDB).
+--
+-- -   @db.wait_state@ - The event for which the database backend is
+--     waiting (only Amazon DocumentDB).
+newDimensionGroup ::
+  -- | 'group''
+  Prelude.Text ->
+  DimensionGroup
+newDimensionGroup pGroup_ =
+  DimensionGroup'
+    { dimensions = Prelude.Nothing,
+      limit = Prelude.Nothing,
+      group' = pGroup_
+    }
+
+-- | A list of specific dimensions from a dimension group. If this parameter
+-- is not present, then it signifies that all of the dimensions in the
+-- group were requested, or are present in the response.
+--
+-- Valid values for elements in the @Dimensions@ array are:
+--
+-- -   @db.application.name@ - The name of the application that is
+--     connected to the database. Valid values are as follows:
+--
+--     -   Aurora PostgreSQL
+--
+--     -   Amazon RDS PostgreSQL
+--
+--     -   Amazon DocumentDB
+--
+-- -   @db.host.id@ - The host ID of the connected client (all engines).
+--
+-- -   @db.host.name@ - The host name of the connected client (all
+--     engines).
+--
+-- -   @db.name@ - The name of the database to which the client is
+--     connected. Valid values are as follows:
+--
+--     -   Aurora PostgreSQL
+--
+--     -   Amazon RDS PostgreSQL
+--
+--     -   Aurora MySQL
+--
+--     -   Amazon RDS MySQL
+--
+--     -   Amazon RDS MariaDB
+--
+--     -   Amazon DocumentDB
+--
+-- -   @db.query.id@ - The query ID generated by Performance Insights (only
+--     Amazon DocumentDB).
+--
+-- -   @db.query.db_id@ - The query ID generated by the database (only
+--     Amazon DocumentDB).
+--
+-- -   @db.query.statement@ - The text of the query that is being run (only
+--     Amazon DocumentDB).
+--
+-- -   @db.query.tokenized_id@
+--
+-- -   @db.query.tokenized.id@ - The query digest ID generated by
+--     Performance Insights (only Amazon DocumentDB).
+--
+-- -   @db.query.tokenized.db_id@ - The query digest ID generated by
+--     Performance Insights (only Amazon DocumentDB).
+--
+-- -   @db.query.tokenized.statement@ - The text of the query digest (only
+--     Amazon DocumentDB).
+--
+-- -   @db.session_type.name@ - The type of the current session (only
+--     Amazon DocumentDB).
+--
+-- -   @db.sql.id@ - The hash of the full, non-tokenized SQL statement
+--     generated by Performance Insights (all engines except Amazon
+--     DocumentDB).
+--
+-- -   @db.sql.db_id@ - Either the SQL ID generated by the database engine,
+--     or a value generated by Performance Insights that begins with @pi-@
+--     (all engines except Amazon DocumentDB).
+--
+-- -   @db.sql.statement@ - The full text of the SQL statement that is
+--     running, as in @SELECT * FROM employees@ (all engines except Amazon
+--     DocumentDB)
+--
+-- -   @db.sql.tokenized_id@
+--
+-- -   @db.sql_tokenized.id@ - The hash of the SQL digest generated by
+--     Performance Insights (all engines except Amazon DocumentDB). In the
+--     console, @db.sql_tokenized.id@ is called the Support ID because
+--     Amazon Web Services Support can look at this data to help you
+--     troubleshoot database issues.
+--
+-- -   @db.sql_tokenized.db_id@ - Either the native database ID used to
+--     refer to the SQL statement, or a synthetic ID such as
+--     @pi-2372568224@ that Performance Insights generates if the native
+--     database ID isn\'t available (all engines except Amazon DocumentDB).
+--
+-- -   @db.sql_tokenized.statement@ - The text of the SQL digest, as in
+--     @SELECT * FROM employees WHERE employee_id = ?@ (all engines except
+--     Amazon DocumentDB)
+--
+-- -   @db.user.id@ - The ID of the user logged in to the database (all
+--     engines except Amazon DocumentDB).
+--
+-- -   @db.user.name@ - The name of the user logged in to the database (all
+--     engines except Amazon DocumentDB).
+--
+-- -   @db.wait_event.name@ - The event for which the backend is waiting
+--     (all engines except Amazon DocumentDB).
+--
+-- -   @db.wait_event.type@ - The type of event for which the backend is
+--     waiting (all engines except Amazon DocumentDB).
+--
+-- -   @db.wait_event_type.name@ - The name of the event type for which the
+--     backend is waiting (all engines except Amazon DocumentDB).
+--
+-- -   @db.wait_state.name@ - The event for which the backend is waiting
+--     (only Amazon DocumentDB).
+dimensionGroup_dimensions :: Lens.Lens' DimensionGroup (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+dimensionGroup_dimensions = Lens.lens (\DimensionGroup' {dimensions} -> dimensions) (\s@DimensionGroup' {} a -> s {dimensions = a} :: DimensionGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of items to fetch for this dimension group.
+dimensionGroup_limit :: Lens.Lens' DimensionGroup (Prelude.Maybe Prelude.Natural)
+dimensionGroup_limit = Lens.lens (\DimensionGroup' {limit} -> limit) (\s@DimensionGroup' {} a -> s {limit = a} :: DimensionGroup)
+
+-- | The name of the dimension group. Valid values are as follows:
+--
+-- -   @db@ - The name of the database to which the client is connected.
+--     The following values are permitted:
+--
+--     -   Aurora PostgreSQL
+--
+--     -   Amazon RDS PostgreSQL
+--
+--     -   Aurora MySQL
+--
+--     -   Amazon RDS MySQL
+--
+--     -   Amazon RDS MariaDB
+--
+--     -   Amazon DocumentDB
+--
+-- -   @db.application@ - The name of the application that is connected to
+--     the database. The following values are permitted:
+--
+--     -   Aurora PostgreSQL
+--
+--     -   Amazon RDS PostgreSQL
+--
+--     -   Amazon DocumentDB
+--
+-- -   @db.host@ - The host name of the connected client (all engines).
+--
+-- -   @db.query@ - The query that is currently running (only Amazon
+--     DocumentDB).
+--
+-- -   @db.query_tokenized@ - The digest query (only Amazon DocumentDB).
+--
+-- -   @db.session_type@ - The type of the current session (only Aurora
+--     PostgreSQL and RDS PostgreSQL).
+--
+-- -   @db.sql@ - The text of the SQL statement that is currently running
+--     (all engines except Amazon DocumentDB).
+--
+-- -   @db.sql_tokenized@ - The SQL digest (all engines except Amazon
+--     DocumentDB).
+--
+-- -   @db.user@ - The user logged in to the database (all engines except
+--     Amazon DocumentDB).
+--
+-- -   @db.wait_event@ - The event for which the database backend is
+--     waiting (all engines except Amazon DocumentDB).
+--
+-- -   @db.wait_event_type@ - The type of event for which the database
+--     backend is waiting (all engines except Amazon DocumentDB).
+--
+-- -   @db.wait_state@ - The event for which the database backend is
+--     waiting (only Amazon DocumentDB).
+dimensionGroup_group :: Lens.Lens' DimensionGroup Prelude.Text
+dimensionGroup_group = Lens.lens (\DimensionGroup' {group'} -> group') (\s@DimensionGroup' {} a -> s {group' = a} :: DimensionGroup)
+
+instance Prelude.Hashable DimensionGroup where
+  hashWithSalt _salt DimensionGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` dimensions
+      `Prelude.hashWithSalt` limit
+      `Prelude.hashWithSalt` group'
+
+instance Prelude.NFData DimensionGroup where
+  rnf DimensionGroup' {..} =
+    Prelude.rnf dimensions
+      `Prelude.seq` Prelude.rnf limit
+      `Prelude.seq` Prelude.rnf group'
+
+instance Data.ToJSON DimensionGroup where
+  toJSON DimensionGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Dimensions" Data..=) Prelude.<$> dimensions,
+            ("Limit" Data..=) Prelude.<$> limit,
+            Prelude.Just ("Group" Data..= group')
+          ]
+      )
diff --git a/gen/Amazonka/Pi/Types/DimensionGroupDetail.hs b/gen/Amazonka/Pi/Types/DimensionGroupDetail.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/DimensionGroupDetail.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.DimensionGroupDetail
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.DimensionGroupDetail where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types.DimensionDetail
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about dimensions within a dimension group.
+--
+-- /See:/ 'newDimensionGroupDetail' smart constructor.
+data DimensionGroupDetail = DimensionGroupDetail'
+  { -- | The dimensions within a dimension group.
+    dimensions :: Prelude.Maybe [DimensionDetail],
+    -- | The name of the dimension group.
+    group' :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DimensionGroupDetail' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dimensions', 'dimensionGroupDetail_dimensions' - The dimensions within a dimension group.
+--
+-- 'group'', 'dimensionGroupDetail_group' - The name of the dimension group.
+newDimensionGroupDetail ::
+  DimensionGroupDetail
+newDimensionGroupDetail =
+  DimensionGroupDetail'
+    { dimensions = Prelude.Nothing,
+      group' = Prelude.Nothing
+    }
+
+-- | The dimensions within a dimension group.
+dimensionGroupDetail_dimensions :: Lens.Lens' DimensionGroupDetail (Prelude.Maybe [DimensionDetail])
+dimensionGroupDetail_dimensions = Lens.lens (\DimensionGroupDetail' {dimensions} -> dimensions) (\s@DimensionGroupDetail' {} a -> s {dimensions = a} :: DimensionGroupDetail) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the dimension group.
+dimensionGroupDetail_group :: Lens.Lens' DimensionGroupDetail (Prelude.Maybe Prelude.Text)
+dimensionGroupDetail_group = Lens.lens (\DimensionGroupDetail' {group'} -> group') (\s@DimensionGroupDetail' {} a -> s {group' = a} :: DimensionGroupDetail)
+
+instance Data.FromJSON DimensionGroupDetail where
+  parseJSON =
+    Data.withObject
+      "DimensionGroupDetail"
+      ( \x ->
+          DimensionGroupDetail'
+            Prelude.<$> (x Data..:? "Dimensions" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Group")
+      )
+
+instance Prelude.Hashable DimensionGroupDetail where
+  hashWithSalt _salt DimensionGroupDetail' {..} =
+    _salt
+      `Prelude.hashWithSalt` dimensions
+      `Prelude.hashWithSalt` group'
+
+instance Prelude.NFData DimensionGroupDetail where
+  rnf DimensionGroupDetail' {..} =
+    Prelude.rnf dimensions
+      `Prelude.seq` Prelude.rnf group'
diff --git a/gen/Amazonka/Pi/Types/DimensionKeyDescription.hs b/gen/Amazonka/Pi/Types/DimensionKeyDescription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/DimensionKeyDescription.hs
@@ -0,0 +1,119 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.DimensionKeyDescription
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.DimensionKeyDescription where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that includes the requested dimension key values and
+-- aggregated metric values within a dimension group.
+--
+-- /See:/ 'newDimensionKeyDescription' smart constructor.
+data DimensionKeyDescription = DimensionKeyDescription'
+  { -- | A map that contains the value for each additional metric.
+    additionalMetrics :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Double),
+    -- | A map of name-value pairs for the dimensions in the group.
+    dimensions :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | If @PartitionBy@ was specified, @PartitionKeys@ contains the dimensions
+    -- that were.
+    partitions :: Prelude.Maybe [Prelude.Double],
+    -- | The aggregated metric value for the dimensions, over the requested time
+    -- range.
+    total :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DimensionKeyDescription' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'additionalMetrics', 'dimensionKeyDescription_additionalMetrics' - A map that contains the value for each additional metric.
+--
+-- 'dimensions', 'dimensionKeyDescription_dimensions' - A map of name-value pairs for the dimensions in the group.
+--
+-- 'partitions', 'dimensionKeyDescription_partitions' - If @PartitionBy@ was specified, @PartitionKeys@ contains the dimensions
+-- that were.
+--
+-- 'total', 'dimensionKeyDescription_total' - The aggregated metric value for the dimensions, over the requested time
+-- range.
+newDimensionKeyDescription ::
+  DimensionKeyDescription
+newDimensionKeyDescription =
+  DimensionKeyDescription'
+    { additionalMetrics =
+        Prelude.Nothing,
+      dimensions = Prelude.Nothing,
+      partitions = Prelude.Nothing,
+      total = Prelude.Nothing
+    }
+
+-- | A map that contains the value for each additional metric.
+dimensionKeyDescription_additionalMetrics :: Lens.Lens' DimensionKeyDescription (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Double))
+dimensionKeyDescription_additionalMetrics = Lens.lens (\DimensionKeyDescription' {additionalMetrics} -> additionalMetrics) (\s@DimensionKeyDescription' {} a -> s {additionalMetrics = a} :: DimensionKeyDescription) Prelude.. Lens.mapping Lens.coerced
+
+-- | A map of name-value pairs for the dimensions in the group.
+dimensionKeyDescription_dimensions :: Lens.Lens' DimensionKeyDescription (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+dimensionKeyDescription_dimensions = Lens.lens (\DimensionKeyDescription' {dimensions} -> dimensions) (\s@DimensionKeyDescription' {} a -> s {dimensions = a} :: DimensionKeyDescription) Prelude.. Lens.mapping Lens.coerced
+
+-- | If @PartitionBy@ was specified, @PartitionKeys@ contains the dimensions
+-- that were.
+dimensionKeyDescription_partitions :: Lens.Lens' DimensionKeyDescription (Prelude.Maybe [Prelude.Double])
+dimensionKeyDescription_partitions = Lens.lens (\DimensionKeyDescription' {partitions} -> partitions) (\s@DimensionKeyDescription' {} a -> s {partitions = a} :: DimensionKeyDescription) Prelude.. Lens.mapping Lens.coerced
+
+-- | The aggregated metric value for the dimensions, over the requested time
+-- range.
+dimensionKeyDescription_total :: Lens.Lens' DimensionKeyDescription (Prelude.Maybe Prelude.Double)
+dimensionKeyDescription_total = Lens.lens (\DimensionKeyDescription' {total} -> total) (\s@DimensionKeyDescription' {} a -> s {total = a} :: DimensionKeyDescription)
+
+instance Data.FromJSON DimensionKeyDescription where
+  parseJSON =
+    Data.withObject
+      "DimensionKeyDescription"
+      ( \x ->
+          DimensionKeyDescription'
+            Prelude.<$> ( x
+                            Data..:? "AdditionalMetrics"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "Dimensions" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Partitions" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Total")
+      )
+
+instance Prelude.Hashable DimensionKeyDescription where
+  hashWithSalt _salt DimensionKeyDescription' {..} =
+    _salt
+      `Prelude.hashWithSalt` additionalMetrics
+      `Prelude.hashWithSalt` dimensions
+      `Prelude.hashWithSalt` partitions
+      `Prelude.hashWithSalt` total
+
+instance Prelude.NFData DimensionKeyDescription where
+  rnf DimensionKeyDescription' {..} =
+    Prelude.rnf additionalMetrics
+      `Prelude.seq` Prelude.rnf dimensions
+      `Prelude.seq` Prelude.rnf partitions
+      `Prelude.seq` Prelude.rnf total
diff --git a/gen/Amazonka/Pi/Types/DimensionKeyDetail.hs b/gen/Amazonka/Pi/Types/DimensionKeyDetail.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/DimensionKeyDetail.hs
@@ -0,0 +1,163 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.DimensionKeyDetail
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.DimensionKeyDetail where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types.DetailStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that describes the details for a specified dimension.
+--
+-- /See:/ 'newDimensionKeyDetail' smart constructor.
+data DimensionKeyDetail = DimensionKeyDetail'
+  { -- | The full name of the dimension. The full name includes the group name
+    -- and key name. The following values are valid:
+    --
+    -- -   @db.query.statement@ (Amazon DocumentDB)
+    --
+    -- -   @db.sql.statement@ (Amazon RDS and Aurora)
+    dimension :: Prelude.Maybe Prelude.Text,
+    -- | The status of the dimension detail data. Possible values include the
+    -- following:
+    --
+    -- -   @AVAILABLE@ - The dimension detail data is ready to be retrieved.
+    --
+    -- -   @PROCESSING@ - The dimension detail data isn\'t ready to be
+    --     retrieved because more processing time is required. If the requested
+    --     detail data has the status @PROCESSING@, Performance Insights
+    --     returns the truncated query.
+    --
+    -- -   @UNAVAILABLE@ - The dimension detail data could not be collected
+    --     successfully.
+    status :: Prelude.Maybe DetailStatus,
+    -- | The value of the dimension detail data. Depending on the return status,
+    -- this value is either the full or truncated SQL query for the following
+    -- dimensions:
+    --
+    -- -   @db.query.statement@ (Amazon DocumentDB)
+    --
+    -- -   @db.sql.statement@ (Amazon RDS and Aurora)
+    value :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DimensionKeyDetail' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dimension', 'dimensionKeyDetail_dimension' - The full name of the dimension. The full name includes the group name
+-- and key name. The following values are valid:
+--
+-- -   @db.query.statement@ (Amazon DocumentDB)
+--
+-- -   @db.sql.statement@ (Amazon RDS and Aurora)
+--
+-- 'status', 'dimensionKeyDetail_status' - The status of the dimension detail data. Possible values include the
+-- following:
+--
+-- -   @AVAILABLE@ - The dimension detail data is ready to be retrieved.
+--
+-- -   @PROCESSING@ - The dimension detail data isn\'t ready to be
+--     retrieved because more processing time is required. If the requested
+--     detail data has the status @PROCESSING@, Performance Insights
+--     returns the truncated query.
+--
+-- -   @UNAVAILABLE@ - The dimension detail data could not be collected
+--     successfully.
+--
+-- 'value', 'dimensionKeyDetail_value' - The value of the dimension detail data. Depending on the return status,
+-- this value is either the full or truncated SQL query for the following
+-- dimensions:
+--
+-- -   @db.query.statement@ (Amazon DocumentDB)
+--
+-- -   @db.sql.statement@ (Amazon RDS and Aurora)
+newDimensionKeyDetail ::
+  DimensionKeyDetail
+newDimensionKeyDetail =
+  DimensionKeyDetail'
+    { dimension = Prelude.Nothing,
+      status = Prelude.Nothing,
+      value = Prelude.Nothing
+    }
+
+-- | The full name of the dimension. The full name includes the group name
+-- and key name. The following values are valid:
+--
+-- -   @db.query.statement@ (Amazon DocumentDB)
+--
+-- -   @db.sql.statement@ (Amazon RDS and Aurora)
+dimensionKeyDetail_dimension :: Lens.Lens' DimensionKeyDetail (Prelude.Maybe Prelude.Text)
+dimensionKeyDetail_dimension = Lens.lens (\DimensionKeyDetail' {dimension} -> dimension) (\s@DimensionKeyDetail' {} a -> s {dimension = a} :: DimensionKeyDetail)
+
+-- | The status of the dimension detail data. Possible values include the
+-- following:
+--
+-- -   @AVAILABLE@ - The dimension detail data is ready to be retrieved.
+--
+-- -   @PROCESSING@ - The dimension detail data isn\'t ready to be
+--     retrieved because more processing time is required. If the requested
+--     detail data has the status @PROCESSING@, Performance Insights
+--     returns the truncated query.
+--
+-- -   @UNAVAILABLE@ - The dimension detail data could not be collected
+--     successfully.
+dimensionKeyDetail_status :: Lens.Lens' DimensionKeyDetail (Prelude.Maybe DetailStatus)
+dimensionKeyDetail_status = Lens.lens (\DimensionKeyDetail' {status} -> status) (\s@DimensionKeyDetail' {} a -> s {status = a} :: DimensionKeyDetail)
+
+-- | The value of the dimension detail data. Depending on the return status,
+-- this value is either the full or truncated SQL query for the following
+-- dimensions:
+--
+-- -   @db.query.statement@ (Amazon DocumentDB)
+--
+-- -   @db.sql.statement@ (Amazon RDS and Aurora)
+dimensionKeyDetail_value :: Lens.Lens' DimensionKeyDetail (Prelude.Maybe Prelude.Text)
+dimensionKeyDetail_value = Lens.lens (\DimensionKeyDetail' {value} -> value) (\s@DimensionKeyDetail' {} a -> s {value = a} :: DimensionKeyDetail)
+
+instance Data.FromJSON DimensionKeyDetail where
+  parseJSON =
+    Data.withObject
+      "DimensionKeyDetail"
+      ( \x ->
+          DimensionKeyDetail'
+            Prelude.<$> (x Data..:? "Dimension")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "Value")
+      )
+
+instance Prelude.Hashable DimensionKeyDetail where
+  hashWithSalt _salt DimensionKeyDetail' {..} =
+    _salt
+      `Prelude.hashWithSalt` dimension
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData DimensionKeyDetail where
+  rnf DimensionKeyDetail' {..} =
+    Prelude.rnf dimension
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf value
diff --git a/gen/Amazonka/Pi/Types/FeatureMetadata.hs b/gen/Amazonka/Pi/Types/FeatureMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/FeatureMetadata.hs
@@ -0,0 +1,114 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.FeatureMetadata
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.FeatureMetadata where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types.FeatureStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The metadata for a feature. For example, the metadata might indicate
+-- that a feature is turned on or off on a specific DB instance.
+--
+-- /See:/ 'newFeatureMetadata' smart constructor.
+data FeatureMetadata = FeatureMetadata'
+  { -- | The status of the feature on the DB instance. Possible values include
+    -- the following:
+    --
+    -- -   @ENABLED@ - The feature is enabled on the instance.
+    --
+    -- -   @DISABLED@ - The feature is disabled on the instance.
+    --
+    -- -   @UNSUPPORTED@ - The feature isn\'t supported on the instance.
+    --
+    -- -   @ENABLED_PENDING_REBOOT@ - The feature is enabled on the instance
+    --     but requires a reboot to take effect.
+    --
+    -- -   @DISABLED_PENDING_REBOOT@ - The feature is disabled on the instance
+    --     but requires a reboot to take effect.
+    --
+    -- -   @UNKNOWN@ - The feature status couldn\'t be determined.
+    status :: Prelude.Maybe FeatureStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FeatureMetadata' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'status', 'featureMetadata_status' - The status of the feature on the DB instance. Possible values include
+-- the following:
+--
+-- -   @ENABLED@ - The feature is enabled on the instance.
+--
+-- -   @DISABLED@ - The feature is disabled on the instance.
+--
+-- -   @UNSUPPORTED@ - The feature isn\'t supported on the instance.
+--
+-- -   @ENABLED_PENDING_REBOOT@ - The feature is enabled on the instance
+--     but requires a reboot to take effect.
+--
+-- -   @DISABLED_PENDING_REBOOT@ - The feature is disabled on the instance
+--     but requires a reboot to take effect.
+--
+-- -   @UNKNOWN@ - The feature status couldn\'t be determined.
+newFeatureMetadata ::
+  FeatureMetadata
+newFeatureMetadata =
+  FeatureMetadata' {status = Prelude.Nothing}
+
+-- | The status of the feature on the DB instance. Possible values include
+-- the following:
+--
+-- -   @ENABLED@ - The feature is enabled on the instance.
+--
+-- -   @DISABLED@ - The feature is disabled on the instance.
+--
+-- -   @UNSUPPORTED@ - The feature isn\'t supported on the instance.
+--
+-- -   @ENABLED_PENDING_REBOOT@ - The feature is enabled on the instance
+--     but requires a reboot to take effect.
+--
+-- -   @DISABLED_PENDING_REBOOT@ - The feature is disabled on the instance
+--     but requires a reboot to take effect.
+--
+-- -   @UNKNOWN@ - The feature status couldn\'t be determined.
+featureMetadata_status :: Lens.Lens' FeatureMetadata (Prelude.Maybe FeatureStatus)
+featureMetadata_status = Lens.lens (\FeatureMetadata' {status} -> status) (\s@FeatureMetadata' {} a -> s {status = a} :: FeatureMetadata)
+
+instance Data.FromJSON FeatureMetadata where
+  parseJSON =
+    Data.withObject
+      "FeatureMetadata"
+      ( \x ->
+          FeatureMetadata' Prelude.<$> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable FeatureMetadata where
+  hashWithSalt _salt FeatureMetadata' {..} =
+    _salt `Prelude.hashWithSalt` status
+
+instance Prelude.NFData FeatureMetadata where
+  rnf FeatureMetadata' {..} = Prelude.rnf status
diff --git a/gen/Amazonka/Pi/Types/FeatureStatus.hs b/gen/Amazonka/Pi/Types/FeatureStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/FeatureStatus.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.FeatureStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.FeatureStatus
+  ( FeatureStatus
+      ( ..,
+        FeatureStatus_DISABLED,
+        FeatureStatus_DISABLED_PENDING_REBOOT,
+        FeatureStatus_ENABLED,
+        FeatureStatus_ENABLED_PENDING_REBOOT,
+        FeatureStatus_UNKNOWN,
+        FeatureStatus_UNSUPPORTED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FeatureStatus = FeatureStatus'
+  { fromFeatureStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern FeatureStatus_DISABLED :: FeatureStatus
+pattern FeatureStatus_DISABLED = FeatureStatus' "DISABLED"
+
+pattern FeatureStatus_DISABLED_PENDING_REBOOT :: FeatureStatus
+pattern FeatureStatus_DISABLED_PENDING_REBOOT = FeatureStatus' "DISABLED_PENDING_REBOOT"
+
+pattern FeatureStatus_ENABLED :: FeatureStatus
+pattern FeatureStatus_ENABLED = FeatureStatus' "ENABLED"
+
+pattern FeatureStatus_ENABLED_PENDING_REBOOT :: FeatureStatus
+pattern FeatureStatus_ENABLED_PENDING_REBOOT = FeatureStatus' "ENABLED_PENDING_REBOOT"
+
+pattern FeatureStatus_UNKNOWN :: FeatureStatus
+pattern FeatureStatus_UNKNOWN = FeatureStatus' "UNKNOWN"
+
+pattern FeatureStatus_UNSUPPORTED :: FeatureStatus
+pattern FeatureStatus_UNSUPPORTED = FeatureStatus' "UNSUPPORTED"
+
+{-# COMPLETE
+  FeatureStatus_DISABLED,
+  FeatureStatus_DISABLED_PENDING_REBOOT,
+  FeatureStatus_ENABLED,
+  FeatureStatus_ENABLED_PENDING_REBOOT,
+  FeatureStatus_UNKNOWN,
+  FeatureStatus_UNSUPPORTED,
+  FeatureStatus'
+  #-}
diff --git a/gen/Amazonka/Pi/Types/MetricDimensionGroups.hs b/gen/Amazonka/Pi/Types/MetricDimensionGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/MetricDimensionGroups.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.MetricDimensionGroups
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.MetricDimensionGroups where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types.DimensionGroupDetail
+import qualified Amazonka.Prelude as Prelude
+
+-- | The available dimension information for a metric type.
+--
+-- /See:/ 'newMetricDimensionGroups' smart constructor.
+data MetricDimensionGroups = MetricDimensionGroups'
+  { -- | The available dimension groups for a metric type.
+    groups :: Prelude.Maybe [DimensionGroupDetail],
+    -- | The metric type to which the dimension information belongs.
+    metric :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricDimensionGroups' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'groups', 'metricDimensionGroups_groups' - The available dimension groups for a metric type.
+--
+-- 'metric', 'metricDimensionGroups_metric' - The metric type to which the dimension information belongs.
+newMetricDimensionGroups ::
+  MetricDimensionGroups
+newMetricDimensionGroups =
+  MetricDimensionGroups'
+    { groups = Prelude.Nothing,
+      metric = Prelude.Nothing
+    }
+
+-- | The available dimension groups for a metric type.
+metricDimensionGroups_groups :: Lens.Lens' MetricDimensionGroups (Prelude.Maybe [DimensionGroupDetail])
+metricDimensionGroups_groups = Lens.lens (\MetricDimensionGroups' {groups} -> groups) (\s@MetricDimensionGroups' {} a -> s {groups = a} :: MetricDimensionGroups) Prelude.. Lens.mapping Lens.coerced
+
+-- | The metric type to which the dimension information belongs.
+metricDimensionGroups_metric :: Lens.Lens' MetricDimensionGroups (Prelude.Maybe Prelude.Text)
+metricDimensionGroups_metric = Lens.lens (\MetricDimensionGroups' {metric} -> metric) (\s@MetricDimensionGroups' {} a -> s {metric = a} :: MetricDimensionGroups)
+
+instance Data.FromJSON MetricDimensionGroups where
+  parseJSON =
+    Data.withObject
+      "MetricDimensionGroups"
+      ( \x ->
+          MetricDimensionGroups'
+            Prelude.<$> (x Data..:? "Groups" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Metric")
+      )
+
+instance Prelude.Hashable MetricDimensionGroups where
+  hashWithSalt _salt MetricDimensionGroups' {..} =
+    _salt
+      `Prelude.hashWithSalt` groups
+      `Prelude.hashWithSalt` metric
+
+instance Prelude.NFData MetricDimensionGroups where
+  rnf MetricDimensionGroups' {..} =
+    Prelude.rnf groups `Prelude.seq` Prelude.rnf metric
diff --git a/gen/Amazonka/Pi/Types/MetricKeyDataPoints.hs b/gen/Amazonka/Pi/Types/MetricKeyDataPoints.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/MetricKeyDataPoints.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.MetricKeyDataPoints
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.MetricKeyDataPoints where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types.DataPoint
+import Amazonka.Pi.Types.ResponseResourceMetricKey
+import qualified Amazonka.Prelude as Prelude
+
+-- | A time-ordered series of data points, corresponding to a dimension of a
+-- Performance Insights metric.
+--
+-- /See:/ 'newMetricKeyDataPoints' smart constructor.
+data MetricKeyDataPoints = MetricKeyDataPoints'
+  { -- | An array of timestamp-value pairs, representing measurements over a
+    -- period of time.
+    dataPoints :: Prelude.Maybe [DataPoint],
+    -- | The dimensions to which the data points apply.
+    key :: Prelude.Maybe ResponseResourceMetricKey
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricKeyDataPoints' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dataPoints', 'metricKeyDataPoints_dataPoints' - An array of timestamp-value pairs, representing measurements over a
+-- period of time.
+--
+-- 'key', 'metricKeyDataPoints_key' - The dimensions to which the data points apply.
+newMetricKeyDataPoints ::
+  MetricKeyDataPoints
+newMetricKeyDataPoints =
+  MetricKeyDataPoints'
+    { dataPoints = Prelude.Nothing,
+      key = Prelude.Nothing
+    }
+
+-- | An array of timestamp-value pairs, representing measurements over a
+-- period of time.
+metricKeyDataPoints_dataPoints :: Lens.Lens' MetricKeyDataPoints (Prelude.Maybe [DataPoint])
+metricKeyDataPoints_dataPoints = Lens.lens (\MetricKeyDataPoints' {dataPoints} -> dataPoints) (\s@MetricKeyDataPoints' {} a -> s {dataPoints = a} :: MetricKeyDataPoints) Prelude.. Lens.mapping Lens.coerced
+
+-- | The dimensions to which the data points apply.
+metricKeyDataPoints_key :: Lens.Lens' MetricKeyDataPoints (Prelude.Maybe ResponseResourceMetricKey)
+metricKeyDataPoints_key = Lens.lens (\MetricKeyDataPoints' {key} -> key) (\s@MetricKeyDataPoints' {} a -> s {key = a} :: MetricKeyDataPoints)
+
+instance Data.FromJSON MetricKeyDataPoints where
+  parseJSON =
+    Data.withObject
+      "MetricKeyDataPoints"
+      ( \x ->
+          MetricKeyDataPoints'
+            Prelude.<$> (x Data..:? "DataPoints" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "Key")
+      )
+
+instance Prelude.Hashable MetricKeyDataPoints where
+  hashWithSalt _salt MetricKeyDataPoints' {..} =
+    _salt
+      `Prelude.hashWithSalt` dataPoints
+      `Prelude.hashWithSalt` key
+
+instance Prelude.NFData MetricKeyDataPoints where
+  rnf MetricKeyDataPoints' {..} =
+    Prelude.rnf dataPoints
+      `Prelude.seq` Prelude.rnf key
diff --git a/gen/Amazonka/Pi/Types/MetricQuery.hs b/gen/Amazonka/Pi/Types/MetricQuery.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/MetricQuery.hs
@@ -0,0 +1,192 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.MetricQuery
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.MetricQuery where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Types.DimensionGroup
+import qualified Amazonka.Prelude as Prelude
+
+-- | A single query to be processed. You must provide the metric to query. If
+-- no other parameters are specified, Performance Insights returns all data
+-- points for the specified metric. Optionally, you can request that the
+-- data points be aggregated by dimension group (@GroupBy@), and return
+-- only those data points that match your criteria (@Filter@).
+--
+-- /See:/ 'newMetricQuery' smart constructor.
+data MetricQuery = MetricQuery'
+  { -- | One or more filters to apply in the request. Restrictions:
+    --
+    -- -   Any number of filters by the same dimension, as specified in the
+    --     @GroupBy@ parameter.
+    --
+    -- -   A single filter for any other dimension in this dimension group.
+    filter' :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | A specification for how to aggregate the data points from a query
+    -- result. You must specify a valid dimension group. Performance Insights
+    -- will return all of the dimensions within that group, unless you provide
+    -- the names of specific dimensions within that group. You can also request
+    -- that Performance Insights return a limited number of values for a
+    -- dimension.
+    groupBy :: Prelude.Maybe DimensionGroup,
+    -- | The name of a Performance Insights metric to be measured.
+    --
+    -- Valid values for @Metric@ are:
+    --
+    -- -   @db.load.avg@ - A scaled representation of the number of active
+    --     sessions for the database engine.
+    --
+    -- -   @db.sampledload.avg@ - The raw number of active sessions for the
+    --     database engine.
+    --
+    -- -   The counter metrics listed in
+    --     <https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_PerfInsights_Counters.html#USER_PerfInsights_Counters.OS Performance Insights operating system counters>
+    --     in the /Amazon Aurora User Guide/.
+    --
+    -- If the number of active sessions is less than an internal Performance
+    -- Insights threshold, @db.load.avg@ and @db.sampledload.avg@ are the same
+    -- value. If the number of active sessions is greater than the internal
+    -- threshold, Performance Insights samples the active sessions, with
+    -- @db.load.avg@ showing the scaled values, @db.sampledload.avg@ showing
+    -- the raw values, and @db.sampledload.avg@ less than @db.load.avg@. For
+    -- most use cases, you can query @db.load.avg@ only.
+    metric :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricQuery' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filter'', 'metricQuery_filter' - One or more filters to apply in the request. Restrictions:
+--
+-- -   Any number of filters by the same dimension, as specified in the
+--     @GroupBy@ parameter.
+--
+-- -   A single filter for any other dimension in this dimension group.
+--
+-- 'groupBy', 'metricQuery_groupBy' - A specification for how to aggregate the data points from a query
+-- result. You must specify a valid dimension group. Performance Insights
+-- will return all of the dimensions within that group, unless you provide
+-- the names of specific dimensions within that group. You can also request
+-- that Performance Insights return a limited number of values for a
+-- dimension.
+--
+-- 'metric', 'metricQuery_metric' - The name of a Performance Insights metric to be measured.
+--
+-- Valid values for @Metric@ are:
+--
+-- -   @db.load.avg@ - A scaled representation of the number of active
+--     sessions for the database engine.
+--
+-- -   @db.sampledload.avg@ - The raw number of active sessions for the
+--     database engine.
+--
+-- -   The counter metrics listed in
+--     <https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_PerfInsights_Counters.html#USER_PerfInsights_Counters.OS Performance Insights operating system counters>
+--     in the /Amazon Aurora User Guide/.
+--
+-- If the number of active sessions is less than an internal Performance
+-- Insights threshold, @db.load.avg@ and @db.sampledload.avg@ are the same
+-- value. If the number of active sessions is greater than the internal
+-- threshold, Performance Insights samples the active sessions, with
+-- @db.load.avg@ showing the scaled values, @db.sampledload.avg@ showing
+-- the raw values, and @db.sampledload.avg@ less than @db.load.avg@. For
+-- most use cases, you can query @db.load.avg@ only.
+newMetricQuery ::
+  -- | 'metric'
+  Prelude.Text ->
+  MetricQuery
+newMetricQuery pMetric_ =
+  MetricQuery'
+    { filter' = Prelude.Nothing,
+      groupBy = Prelude.Nothing,
+      metric = pMetric_
+    }
+
+-- | One or more filters to apply in the request. Restrictions:
+--
+-- -   Any number of filters by the same dimension, as specified in the
+--     @GroupBy@ parameter.
+--
+-- -   A single filter for any other dimension in this dimension group.
+metricQuery_filter :: Lens.Lens' MetricQuery (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+metricQuery_filter = Lens.lens (\MetricQuery' {filter'} -> filter') (\s@MetricQuery' {} a -> s {filter' = a} :: MetricQuery) Prelude.. Lens.mapping Lens.coerced
+
+-- | A specification for how to aggregate the data points from a query
+-- result. You must specify a valid dimension group. Performance Insights
+-- will return all of the dimensions within that group, unless you provide
+-- the names of specific dimensions within that group. You can also request
+-- that Performance Insights return a limited number of values for a
+-- dimension.
+metricQuery_groupBy :: Lens.Lens' MetricQuery (Prelude.Maybe DimensionGroup)
+metricQuery_groupBy = Lens.lens (\MetricQuery' {groupBy} -> groupBy) (\s@MetricQuery' {} a -> s {groupBy = a} :: MetricQuery)
+
+-- | The name of a Performance Insights metric to be measured.
+--
+-- Valid values for @Metric@ are:
+--
+-- -   @db.load.avg@ - A scaled representation of the number of active
+--     sessions for the database engine.
+--
+-- -   @db.sampledload.avg@ - The raw number of active sessions for the
+--     database engine.
+--
+-- -   The counter metrics listed in
+--     <https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_PerfInsights_Counters.html#USER_PerfInsights_Counters.OS Performance Insights operating system counters>
+--     in the /Amazon Aurora User Guide/.
+--
+-- If the number of active sessions is less than an internal Performance
+-- Insights threshold, @db.load.avg@ and @db.sampledload.avg@ are the same
+-- value. If the number of active sessions is greater than the internal
+-- threshold, Performance Insights samples the active sessions, with
+-- @db.load.avg@ showing the scaled values, @db.sampledload.avg@ showing
+-- the raw values, and @db.sampledload.avg@ less than @db.load.avg@. For
+-- most use cases, you can query @db.load.avg@ only.
+metricQuery_metric :: Lens.Lens' MetricQuery Prelude.Text
+metricQuery_metric = Lens.lens (\MetricQuery' {metric} -> metric) (\s@MetricQuery' {} a -> s {metric = a} :: MetricQuery)
+
+instance Prelude.Hashable MetricQuery where
+  hashWithSalt _salt MetricQuery' {..} =
+    _salt
+      `Prelude.hashWithSalt` filter'
+      `Prelude.hashWithSalt` groupBy
+      `Prelude.hashWithSalt` metric
+
+instance Prelude.NFData MetricQuery where
+  rnf MetricQuery' {..} =
+    Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf groupBy
+      `Prelude.seq` Prelude.rnf metric
+
+instance Data.ToJSON MetricQuery where
+  toJSON MetricQuery' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filter" Data..=) Prelude.<$> filter',
+            ("GroupBy" Data..=) Prelude.<$> groupBy,
+            Prelude.Just ("Metric" Data..= metric)
+          ]
+      )
diff --git a/gen/Amazonka/Pi/Types/ResponsePartitionKey.hs b/gen/Amazonka/Pi/Types/ResponsePartitionKey.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/ResponsePartitionKey.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.ResponsePartitionKey
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.ResponsePartitionKey where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | If @PartitionBy@ was specified in a @DescribeDimensionKeys@ request, the
+-- dimensions are returned in an array. Each element in the array specifies
+-- one dimension.
+--
+-- /See:/ 'newResponsePartitionKey' smart constructor.
+data ResponsePartitionKey = ResponsePartitionKey'
+  { -- | A dimension map that contains the dimensions for this partition.
+    dimensions :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResponsePartitionKey' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dimensions', 'responsePartitionKey_dimensions' - A dimension map that contains the dimensions for this partition.
+newResponsePartitionKey ::
+  ResponsePartitionKey
+newResponsePartitionKey =
+  ResponsePartitionKey' {dimensions = Prelude.mempty}
+
+-- | A dimension map that contains the dimensions for this partition.
+responsePartitionKey_dimensions :: Lens.Lens' ResponsePartitionKey (Prelude.HashMap Prelude.Text Prelude.Text)
+responsePartitionKey_dimensions = Lens.lens (\ResponsePartitionKey' {dimensions} -> dimensions) (\s@ResponsePartitionKey' {} a -> s {dimensions = a} :: ResponsePartitionKey) Prelude.. Lens.coerced
+
+instance Data.FromJSON ResponsePartitionKey where
+  parseJSON =
+    Data.withObject
+      "ResponsePartitionKey"
+      ( \x ->
+          ResponsePartitionKey'
+            Prelude.<$> (x Data..:? "Dimensions" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable ResponsePartitionKey where
+  hashWithSalt _salt ResponsePartitionKey' {..} =
+    _salt `Prelude.hashWithSalt` dimensions
+
+instance Prelude.NFData ResponsePartitionKey where
+  rnf ResponsePartitionKey' {..} =
+    Prelude.rnf dimensions
diff --git a/gen/Amazonka/Pi/Types/ResponseResourceMetric.hs b/gen/Amazonka/Pi/Types/ResponseResourceMetric.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/ResponseResourceMetric.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.ResponseResourceMetric
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.ResponseResourceMetric where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that contains the full name, description, and unit of a
+-- metric.
+--
+-- /See:/ 'newResponseResourceMetric' smart constructor.
+data ResponseResourceMetric = ResponseResourceMetric'
+  { -- | The description of the metric.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The full name of the metric.
+    metric :: Prelude.Maybe Prelude.Text,
+    -- | The unit of the metric.
+    unit :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResponseResourceMetric' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'responseResourceMetric_description' - The description of the metric.
+--
+-- 'metric', 'responseResourceMetric_metric' - The full name of the metric.
+--
+-- 'unit', 'responseResourceMetric_unit' - The unit of the metric.
+newResponseResourceMetric ::
+  ResponseResourceMetric
+newResponseResourceMetric =
+  ResponseResourceMetric'
+    { description =
+        Prelude.Nothing,
+      metric = Prelude.Nothing,
+      unit = Prelude.Nothing
+    }
+
+-- | The description of the metric.
+responseResourceMetric_description :: Lens.Lens' ResponseResourceMetric (Prelude.Maybe Prelude.Text)
+responseResourceMetric_description = Lens.lens (\ResponseResourceMetric' {description} -> description) (\s@ResponseResourceMetric' {} a -> s {description = a} :: ResponseResourceMetric)
+
+-- | The full name of the metric.
+responseResourceMetric_metric :: Lens.Lens' ResponseResourceMetric (Prelude.Maybe Prelude.Text)
+responseResourceMetric_metric = Lens.lens (\ResponseResourceMetric' {metric} -> metric) (\s@ResponseResourceMetric' {} a -> s {metric = a} :: ResponseResourceMetric)
+
+-- | The unit of the metric.
+responseResourceMetric_unit :: Lens.Lens' ResponseResourceMetric (Prelude.Maybe Prelude.Text)
+responseResourceMetric_unit = Lens.lens (\ResponseResourceMetric' {unit} -> unit) (\s@ResponseResourceMetric' {} a -> s {unit = a} :: ResponseResourceMetric)
+
+instance Data.FromJSON ResponseResourceMetric where
+  parseJSON =
+    Data.withObject
+      "ResponseResourceMetric"
+      ( \x ->
+          ResponseResourceMetric'
+            Prelude.<$> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "Metric")
+            Prelude.<*> (x Data..:? "Unit")
+      )
+
+instance Prelude.Hashable ResponseResourceMetric where
+  hashWithSalt _salt ResponseResourceMetric' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` metric
+      `Prelude.hashWithSalt` unit
+
+instance Prelude.NFData ResponseResourceMetric where
+  rnf ResponseResourceMetric' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf metric
+      `Prelude.seq` Prelude.rnf unit
diff --git a/gen/Amazonka/Pi/Types/ResponseResourceMetricKey.hs b/gen/Amazonka/Pi/Types/ResponseResourceMetricKey.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/ResponseResourceMetricKey.hs
@@ -0,0 +1,148 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.ResponseResourceMetricKey
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.ResponseResourceMetricKey where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object describing a Performance Insights metric and one or more
+-- dimensions for that metric.
+--
+-- /See:/ 'newResponseResourceMetricKey' smart constructor.
+data ResponseResourceMetricKey = ResponseResourceMetricKey'
+  { -- | The valid dimensions for the metric.
+    dimensions :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The name of a Performance Insights metric to be measured.
+    --
+    -- Valid values for @Metric@ are:
+    --
+    -- -   @db.load.avg@ - A scaled representation of the number of active
+    --     sessions for the database engine.
+    --
+    -- -   @db.sampledload.avg@ - The raw number of active sessions for the
+    --     database engine.
+    --
+    -- -   The counter metrics listed in
+    --     <https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_PerfInsights_Counters.html#USER_PerfInsights_Counters.OS Performance Insights operating system counters>
+    --     in the /Amazon Aurora User Guide/.
+    --
+    -- If the number of active sessions is less than an internal Performance
+    -- Insights threshold, @db.load.avg@ and @db.sampledload.avg@ are the same
+    -- value. If the number of active sessions is greater than the internal
+    -- threshold, Performance Insights samples the active sessions, with
+    -- @db.load.avg@ showing the scaled values, @db.sampledload.avg@ showing
+    -- the raw values, and @db.sampledload.avg@ less than @db.load.avg@. For
+    -- most use cases, you can query @db.load.avg@ only.
+    metric :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ResponseResourceMetricKey' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dimensions', 'responseResourceMetricKey_dimensions' - The valid dimensions for the metric.
+--
+-- 'metric', 'responseResourceMetricKey_metric' - The name of a Performance Insights metric to be measured.
+--
+-- Valid values for @Metric@ are:
+--
+-- -   @db.load.avg@ - A scaled representation of the number of active
+--     sessions for the database engine.
+--
+-- -   @db.sampledload.avg@ - The raw number of active sessions for the
+--     database engine.
+--
+-- -   The counter metrics listed in
+--     <https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_PerfInsights_Counters.html#USER_PerfInsights_Counters.OS Performance Insights operating system counters>
+--     in the /Amazon Aurora User Guide/.
+--
+-- If the number of active sessions is less than an internal Performance
+-- Insights threshold, @db.load.avg@ and @db.sampledload.avg@ are the same
+-- value. If the number of active sessions is greater than the internal
+-- threshold, Performance Insights samples the active sessions, with
+-- @db.load.avg@ showing the scaled values, @db.sampledload.avg@ showing
+-- the raw values, and @db.sampledload.avg@ less than @db.load.avg@. For
+-- most use cases, you can query @db.load.avg@ only.
+newResponseResourceMetricKey ::
+  -- | 'metric'
+  Prelude.Text ->
+  ResponseResourceMetricKey
+newResponseResourceMetricKey pMetric_ =
+  ResponseResourceMetricKey'
+    { dimensions =
+        Prelude.Nothing,
+      metric = pMetric_
+    }
+
+-- | The valid dimensions for the metric.
+responseResourceMetricKey_dimensions :: Lens.Lens' ResponseResourceMetricKey (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+responseResourceMetricKey_dimensions = Lens.lens (\ResponseResourceMetricKey' {dimensions} -> dimensions) (\s@ResponseResourceMetricKey' {} a -> s {dimensions = a} :: ResponseResourceMetricKey) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of a Performance Insights metric to be measured.
+--
+-- Valid values for @Metric@ are:
+--
+-- -   @db.load.avg@ - A scaled representation of the number of active
+--     sessions for the database engine.
+--
+-- -   @db.sampledload.avg@ - The raw number of active sessions for the
+--     database engine.
+--
+-- -   The counter metrics listed in
+--     <https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_PerfInsights_Counters.html#USER_PerfInsights_Counters.OS Performance Insights operating system counters>
+--     in the /Amazon Aurora User Guide/.
+--
+-- If the number of active sessions is less than an internal Performance
+-- Insights threshold, @db.load.avg@ and @db.sampledload.avg@ are the same
+-- value. If the number of active sessions is greater than the internal
+-- threshold, Performance Insights samples the active sessions, with
+-- @db.load.avg@ showing the scaled values, @db.sampledload.avg@ showing
+-- the raw values, and @db.sampledload.avg@ less than @db.load.avg@. For
+-- most use cases, you can query @db.load.avg@ only.
+responseResourceMetricKey_metric :: Lens.Lens' ResponseResourceMetricKey Prelude.Text
+responseResourceMetricKey_metric = Lens.lens (\ResponseResourceMetricKey' {metric} -> metric) (\s@ResponseResourceMetricKey' {} a -> s {metric = a} :: ResponseResourceMetricKey)
+
+instance Data.FromJSON ResponseResourceMetricKey where
+  parseJSON =
+    Data.withObject
+      "ResponseResourceMetricKey"
+      ( \x ->
+          ResponseResourceMetricKey'
+            Prelude.<$> (x Data..:? "Dimensions" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "Metric")
+      )
+
+instance Prelude.Hashable ResponseResourceMetricKey where
+  hashWithSalt _salt ResponseResourceMetricKey' {..} =
+    _salt
+      `Prelude.hashWithSalt` dimensions
+      `Prelude.hashWithSalt` metric
+
+instance Prelude.NFData ResponseResourceMetricKey where
+  rnf ResponseResourceMetricKey' {..} =
+    Prelude.rnf dimensions
+      `Prelude.seq` Prelude.rnf metric
diff --git a/gen/Amazonka/Pi/Types/ServiceType.hs b/gen/Amazonka/Pi/Types/ServiceType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Types/ServiceType.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Types.ServiceType
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Types.ServiceType
+  ( ServiceType
+      ( ..,
+        ServiceType_DOCDB,
+        ServiceType_RDS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ServiceType = ServiceType'
+  { fromServiceType ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ServiceType_DOCDB :: ServiceType
+pattern ServiceType_DOCDB = ServiceType' "DOCDB"
+
+pattern ServiceType_RDS :: ServiceType
+pattern ServiceType_RDS = ServiceType' "RDS"
+
+{-# COMPLETE
+  ServiceType_DOCDB,
+  ServiceType_RDS,
+  ServiceType'
+  #-}
diff --git a/gen/Amazonka/Pi/Waiters.hs b/gen/Amazonka/Pi/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Pi/Waiters.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Pi.Waiters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Pi.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Pi.Lens
+import Amazonka.Pi.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.Pi
+import Test.Amazonka.Pi.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "Pi"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/Pi.hs b/test/Test/Amazonka/Gen/Pi.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/Pi.hs
@@ -0,0 +1,158 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.Amazonka.Gen.Pi
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Gen.Pi where
+
+import Amazonka.Pi
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.Pi.Internal
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestDescribeDimensionKeys $
+--             newDescribeDimensionKeys
+--
+--         , requestGetDimensionKeyDetails $
+--             newGetDimensionKeyDetails
+--
+--         , requestGetResourceMetadata $
+--             newGetResourceMetadata
+--
+--         , requestGetResourceMetrics $
+--             newGetResourceMetrics
+--
+--         , requestListAvailableResourceDimensions $
+--             newListAvailableResourceDimensions
+--
+--         , requestListAvailableResourceMetrics $
+--             newListAvailableResourceMetrics
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseDescribeDimensionKeys $
+--             newDescribeDimensionKeysResponse
+--
+--         , responseGetDimensionKeyDetails $
+--             newGetDimensionKeyDetailsResponse
+--
+--         , responseGetResourceMetadata $
+--             newGetResourceMetadataResponse
+--
+--         , responseGetResourceMetrics $
+--             newGetResourceMetricsResponse
+--
+--         , responseListAvailableResourceDimensions $
+--             newListAvailableResourceDimensionsResponse
+--
+--         , responseListAvailableResourceMetrics $
+--             newListAvailableResourceMetricsResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestDescribeDimensionKeys :: DescribeDimensionKeys -> TestTree
+requestDescribeDimensionKeys =
+  req
+    "DescribeDimensionKeys"
+    "fixture/DescribeDimensionKeys.yaml"
+
+requestGetDimensionKeyDetails :: GetDimensionKeyDetails -> TestTree
+requestGetDimensionKeyDetails =
+  req
+    "GetDimensionKeyDetails"
+    "fixture/GetDimensionKeyDetails.yaml"
+
+requestGetResourceMetadata :: GetResourceMetadata -> TestTree
+requestGetResourceMetadata =
+  req
+    "GetResourceMetadata"
+    "fixture/GetResourceMetadata.yaml"
+
+requestGetResourceMetrics :: GetResourceMetrics -> TestTree
+requestGetResourceMetrics =
+  req
+    "GetResourceMetrics"
+    "fixture/GetResourceMetrics.yaml"
+
+requestListAvailableResourceDimensions :: ListAvailableResourceDimensions -> TestTree
+requestListAvailableResourceDimensions =
+  req
+    "ListAvailableResourceDimensions"
+    "fixture/ListAvailableResourceDimensions.yaml"
+
+requestListAvailableResourceMetrics :: ListAvailableResourceMetrics -> TestTree
+requestListAvailableResourceMetrics =
+  req
+    "ListAvailableResourceMetrics"
+    "fixture/ListAvailableResourceMetrics.yaml"
+
+-- Responses
+
+responseDescribeDimensionKeys :: DescribeDimensionKeysResponse -> TestTree
+responseDescribeDimensionKeys =
+  res
+    "DescribeDimensionKeysResponse"
+    "fixture/DescribeDimensionKeysResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDimensionKeys)
+
+responseGetDimensionKeyDetails :: GetDimensionKeyDetailsResponse -> TestTree
+responseGetDimensionKeyDetails =
+  res
+    "GetDimensionKeyDetailsResponse"
+    "fixture/GetDimensionKeyDetailsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetDimensionKeyDetails)
+
+responseGetResourceMetadata :: GetResourceMetadataResponse -> TestTree
+responseGetResourceMetadata =
+  res
+    "GetResourceMetadataResponse"
+    "fixture/GetResourceMetadataResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetResourceMetadata)
+
+responseGetResourceMetrics :: GetResourceMetricsResponse -> TestTree
+responseGetResourceMetrics =
+  res
+    "GetResourceMetricsResponse"
+    "fixture/GetResourceMetricsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetResourceMetrics)
+
+responseListAvailableResourceDimensions :: ListAvailableResourceDimensionsResponse -> TestTree
+responseListAvailableResourceDimensions =
+  res
+    "ListAvailableResourceDimensionsResponse"
+    "fixture/ListAvailableResourceDimensionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAvailableResourceDimensions)
+
+responseListAvailableResourceMetrics :: ListAvailableResourceMetricsResponse -> TestTree
+responseListAvailableResourceMetrics =
+  res
+    "ListAvailableResourceMetricsResponse"
+    "fixture/ListAvailableResourceMetricsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAvailableResourceMetrics)
diff --git a/test/Test/Amazonka/Pi.hs b/test/Test/Amazonka/Pi.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Pi.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.Pi
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Pi
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/Pi/Internal.hs b/test/Test/Amazonka/Pi/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Pi/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.Pi.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Pi.Internal where
