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 CodeGuru Profiler SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2019-07-18@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-codeguruprofiler)
+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.CodeGuruProfiler](http://hackage.haskell.org/package/amazonka-codeguruprofiler/docs/Amazonka-CodeGuruProfiler.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-codeguruprofiler` 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-codeguruprofiler.cabal b/amazonka-codeguruprofiler.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-codeguruprofiler.cabal
@@ -0,0 +1,134 @@
+cabal-version:      2.2
+name:               amazonka-codeguruprofiler
+version:            2.0
+synopsis:           Amazon CodeGuru Profiler 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 @2019-07-18@ 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.CodeGuruProfiler.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.CodeGuruProfiler" 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-codeguruprofiler
+
+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.CodeGuruProfiler
+    Amazonka.CodeGuruProfiler.AddNotificationChannels
+    Amazonka.CodeGuruProfiler.BatchGetFrameMetricData
+    Amazonka.CodeGuruProfiler.ConfigureAgent
+    Amazonka.CodeGuruProfiler.CreateProfilingGroup
+    Amazonka.CodeGuruProfiler.DeleteProfilingGroup
+    Amazonka.CodeGuruProfiler.DescribeProfilingGroup
+    Amazonka.CodeGuruProfiler.GetFindingsReportAccountSummary
+    Amazonka.CodeGuruProfiler.GetNotificationConfiguration
+    Amazonka.CodeGuruProfiler.GetPolicy
+    Amazonka.CodeGuruProfiler.GetProfile
+    Amazonka.CodeGuruProfiler.GetRecommendations
+    Amazonka.CodeGuruProfiler.Lens
+    Amazonka.CodeGuruProfiler.ListFindingsReports
+    Amazonka.CodeGuruProfiler.ListProfileTimes
+    Amazonka.CodeGuruProfiler.ListProfilingGroups
+    Amazonka.CodeGuruProfiler.ListTagsForResource
+    Amazonka.CodeGuruProfiler.PostAgentProfile
+    Amazonka.CodeGuruProfiler.PutPermission
+    Amazonka.CodeGuruProfiler.RemoveNotificationChannel
+    Amazonka.CodeGuruProfiler.RemovePermission
+    Amazonka.CodeGuruProfiler.SubmitFeedback
+    Amazonka.CodeGuruProfiler.TagResource
+    Amazonka.CodeGuruProfiler.Types
+    Amazonka.CodeGuruProfiler.Types.ActionGroup
+    Amazonka.CodeGuruProfiler.Types.AgentConfiguration
+    Amazonka.CodeGuruProfiler.Types.AgentOrchestrationConfig
+    Amazonka.CodeGuruProfiler.Types.AgentParameterField
+    Amazonka.CodeGuruProfiler.Types.AggregatedProfileTime
+    Amazonka.CodeGuruProfiler.Types.AggregationPeriod
+    Amazonka.CodeGuruProfiler.Types.Anomaly
+    Amazonka.CodeGuruProfiler.Types.AnomalyInstance
+    Amazonka.CodeGuruProfiler.Types.Channel
+    Amazonka.CodeGuruProfiler.Types.ComputePlatform
+    Amazonka.CodeGuruProfiler.Types.EventPublisher
+    Amazonka.CodeGuruProfiler.Types.FeedbackType
+    Amazonka.CodeGuruProfiler.Types.FindingsReportSummary
+    Amazonka.CodeGuruProfiler.Types.FrameMetric
+    Amazonka.CodeGuruProfiler.Types.FrameMetricDatum
+    Amazonka.CodeGuruProfiler.Types.Match
+    Amazonka.CodeGuruProfiler.Types.MetadataField
+    Amazonka.CodeGuruProfiler.Types.Metric
+    Amazonka.CodeGuruProfiler.Types.MetricType
+    Amazonka.CodeGuruProfiler.Types.NotificationConfiguration
+    Amazonka.CodeGuruProfiler.Types.OrderBy
+    Amazonka.CodeGuruProfiler.Types.Pattern
+    Amazonka.CodeGuruProfiler.Types.ProfileTime
+    Amazonka.CodeGuruProfiler.Types.ProfilingGroupDescription
+    Amazonka.CodeGuruProfiler.Types.ProfilingStatus
+    Amazonka.CodeGuruProfiler.Types.Recommendation
+    Amazonka.CodeGuruProfiler.Types.TimestampStructure
+    Amazonka.CodeGuruProfiler.Types.UserFeedback
+    Amazonka.CodeGuruProfiler.UntagResource
+    Amazonka.CodeGuruProfiler.UpdateProfilingGroup
+    Amazonka.CodeGuruProfiler.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-codeguruprofiler-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.CodeGuruProfiler
+    Test.Amazonka.CodeGuruProfiler.Internal
+    Test.Amazonka.Gen.CodeGuruProfiler
+
+  build-depends:
+    , amazonka-codeguruprofiler
+    , amazonka-core              >=2.0 && <2.1
+    , amazonka-test              >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/AddNotificationChannels.yaml b/fixture/AddNotificationChannels.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/AddNotificationChannels.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/AddNotificationChannelsResponse.proto b/fixture/AddNotificationChannelsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/AddNotificationChannelsResponse.proto
diff --git a/fixture/BatchGetFrameMetricData.yaml b/fixture/BatchGetFrameMetricData.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetFrameMetricData.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/BatchGetFrameMetricDataResponse.proto b/fixture/BatchGetFrameMetricDataResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetFrameMetricDataResponse.proto
diff --git a/fixture/ConfigureAgent.yaml b/fixture/ConfigureAgent.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ConfigureAgent.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/ConfigureAgentResponse.proto b/fixture/ConfigureAgentResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ConfigureAgentResponse.proto
diff --git a/fixture/CreateProfilingGroup.yaml b/fixture/CreateProfilingGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateProfilingGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/CreateProfilingGroupResponse.proto b/fixture/CreateProfilingGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateProfilingGroupResponse.proto
diff --git a/fixture/DeleteProfilingGroup.yaml b/fixture/DeleteProfilingGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteProfilingGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/DeleteProfilingGroupResponse.proto b/fixture/DeleteProfilingGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteProfilingGroupResponse.proto
diff --git a/fixture/DescribeProfilingGroup.yaml b/fixture/DescribeProfilingGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeProfilingGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/DescribeProfilingGroupResponse.proto b/fixture/DescribeProfilingGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeProfilingGroupResponse.proto
diff --git a/fixture/GetFindingsReportAccountSummary.yaml b/fixture/GetFindingsReportAccountSummary.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetFindingsReportAccountSummary.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/GetFindingsReportAccountSummaryResponse.proto b/fixture/GetFindingsReportAccountSummaryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetFindingsReportAccountSummaryResponse.proto
diff --git a/fixture/GetNotificationConfiguration.yaml b/fixture/GetNotificationConfiguration.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetNotificationConfiguration.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/GetNotificationConfigurationResponse.proto b/fixture/GetNotificationConfigurationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetNotificationConfigurationResponse.proto
diff --git a/fixture/GetPolicy.yaml b/fixture/GetPolicy.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetPolicy.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/GetPolicyResponse.proto b/fixture/GetPolicyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetPolicyResponse.proto
diff --git a/fixture/GetProfile.yaml b/fixture/GetProfile.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetProfile.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/GetProfileResponse.proto b/fixture/GetProfileResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetProfileResponse.proto
diff --git a/fixture/GetRecommendations.yaml b/fixture/GetRecommendations.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetRecommendations.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/GetRecommendationsResponse.proto b/fixture/GetRecommendationsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetRecommendationsResponse.proto
diff --git a/fixture/ListFindingsReports.yaml b/fixture/ListFindingsReports.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListFindingsReports.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/ListFindingsReportsResponse.proto b/fixture/ListFindingsReportsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListFindingsReportsResponse.proto
diff --git a/fixture/ListProfileTimes.yaml b/fixture/ListProfileTimes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListProfileTimes.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/ListProfileTimesResponse.proto b/fixture/ListProfileTimesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListProfileTimesResponse.proto
diff --git a/fixture/ListProfilingGroups.yaml b/fixture/ListProfilingGroups.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListProfilingGroups.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/ListProfilingGroupsResponse.proto b/fixture/ListProfilingGroupsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListProfilingGroupsResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/PostAgentProfile.yaml b/fixture/PostAgentProfile.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PostAgentProfile.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/PostAgentProfileResponse.proto b/fixture/PostAgentProfileResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PostAgentProfileResponse.proto
diff --git a/fixture/PutPermission.yaml b/fixture/PutPermission.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutPermission.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/PutPermissionResponse.proto b/fixture/PutPermissionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutPermissionResponse.proto
diff --git a/fixture/RemoveNotificationChannel.yaml b/fixture/RemoveNotificationChannel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveNotificationChannel.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/RemoveNotificationChannelResponse.proto b/fixture/RemoveNotificationChannelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RemoveNotificationChannelResponse.proto
diff --git a/fixture/RemovePermission.yaml b/fixture/RemovePermission.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/RemovePermission.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/RemovePermissionResponse.proto b/fixture/RemovePermissionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/RemovePermissionResponse.proto
diff --git a/fixture/SubmitFeedback.yaml b/fixture/SubmitFeedback.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/SubmitFeedback.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/SubmitFeedbackResponse.proto b/fixture/SubmitFeedbackResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/SubmitFeedbackResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateProfilingGroup.yaml b/fixture/UpdateProfilingGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateProfilingGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: PUT
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/codeguru-profiler/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  codeguru-profiler.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/UpdateProfilingGroupResponse.proto b/fixture/UpdateProfilingGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateProfilingGroupResponse.proto
diff --git a/gen/Amazonka/CodeGuruProfiler.hs b/gen/Amazonka/CodeGuruProfiler.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler.hs
@@ -0,0 +1,366 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.CodeGuruProfiler
+-- 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 @2019-07-18@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- This section provides documentation for the Amazon CodeGuru Profiler API
+-- operations.
+--
+-- Amazon CodeGuru Profiler collects runtime performance data from your
+-- live applications, and provides recommendations that can help you
+-- fine-tune your application performance. Using machine learning
+-- algorithms, CodeGuru Profiler can help you find your most expensive
+-- lines of code and suggest ways you can improve efficiency and remove CPU
+-- bottlenecks.
+--
+-- Amazon CodeGuru Profiler provides different visualizations of profiling
+-- data to help you identify what code is running on the CPU, see how much
+-- time is consumed, and suggest ways to reduce CPU utilization.
+--
+-- Amazon CodeGuru Profiler currently supports applications written in all
+-- Java virtual machine (JVM) languages and Python. While CodeGuru Profiler
+-- supports both visualizations and recommendations for applications
+-- written in Java, it can also generate visualizations and a subset of
+-- recommendations for applications written in other JVM languages and
+-- Python.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-ug/what-is-codeguru-profiler.html What is Amazon CodeGuru Profiler>
+-- in the /Amazon CodeGuru Profiler User Guide/.
+module Amazonka.CodeGuruProfiler
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** AddNotificationChannels
+    AddNotificationChannels (AddNotificationChannels'),
+    newAddNotificationChannels,
+    AddNotificationChannelsResponse (AddNotificationChannelsResponse'),
+    newAddNotificationChannelsResponse,
+
+    -- ** BatchGetFrameMetricData
+    BatchGetFrameMetricData (BatchGetFrameMetricData'),
+    newBatchGetFrameMetricData,
+    BatchGetFrameMetricDataResponse (BatchGetFrameMetricDataResponse'),
+    newBatchGetFrameMetricDataResponse,
+
+    -- ** ConfigureAgent
+    ConfigureAgent (ConfigureAgent'),
+    newConfigureAgent,
+    ConfigureAgentResponse (ConfigureAgentResponse'),
+    newConfigureAgentResponse,
+
+    -- ** CreateProfilingGroup
+    CreateProfilingGroup (CreateProfilingGroup'),
+    newCreateProfilingGroup,
+    CreateProfilingGroupResponse (CreateProfilingGroupResponse'),
+    newCreateProfilingGroupResponse,
+
+    -- ** DeleteProfilingGroup
+    DeleteProfilingGroup (DeleteProfilingGroup'),
+    newDeleteProfilingGroup,
+    DeleteProfilingGroupResponse (DeleteProfilingGroupResponse'),
+    newDeleteProfilingGroupResponse,
+
+    -- ** DescribeProfilingGroup
+    DescribeProfilingGroup (DescribeProfilingGroup'),
+    newDescribeProfilingGroup,
+    DescribeProfilingGroupResponse (DescribeProfilingGroupResponse'),
+    newDescribeProfilingGroupResponse,
+
+    -- ** GetFindingsReportAccountSummary
+    GetFindingsReportAccountSummary (GetFindingsReportAccountSummary'),
+    newGetFindingsReportAccountSummary,
+    GetFindingsReportAccountSummaryResponse (GetFindingsReportAccountSummaryResponse'),
+    newGetFindingsReportAccountSummaryResponse,
+
+    -- ** GetNotificationConfiguration
+    GetNotificationConfiguration (GetNotificationConfiguration'),
+    newGetNotificationConfiguration,
+    GetNotificationConfigurationResponse (GetNotificationConfigurationResponse'),
+    newGetNotificationConfigurationResponse,
+
+    -- ** GetPolicy
+    GetPolicy (GetPolicy'),
+    newGetPolicy,
+    GetPolicyResponse (GetPolicyResponse'),
+    newGetPolicyResponse,
+
+    -- ** GetProfile
+    GetProfile (GetProfile'),
+    newGetProfile,
+    GetProfileResponse (GetProfileResponse'),
+    newGetProfileResponse,
+
+    -- ** GetRecommendations
+    GetRecommendations (GetRecommendations'),
+    newGetRecommendations,
+    GetRecommendationsResponse (GetRecommendationsResponse'),
+    newGetRecommendationsResponse,
+
+    -- ** ListFindingsReports
+    ListFindingsReports (ListFindingsReports'),
+    newListFindingsReports,
+    ListFindingsReportsResponse (ListFindingsReportsResponse'),
+    newListFindingsReportsResponse,
+
+    -- ** ListProfileTimes (Paginated)
+    ListProfileTimes (ListProfileTimes'),
+    newListProfileTimes,
+    ListProfileTimesResponse (ListProfileTimesResponse'),
+    newListProfileTimesResponse,
+
+    -- ** ListProfilingGroups
+    ListProfilingGroups (ListProfilingGroups'),
+    newListProfilingGroups,
+    ListProfilingGroupsResponse (ListProfilingGroupsResponse'),
+    newListProfilingGroupsResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** PostAgentProfile
+    PostAgentProfile (PostAgentProfile'),
+    newPostAgentProfile,
+    PostAgentProfileResponse (PostAgentProfileResponse'),
+    newPostAgentProfileResponse,
+
+    -- ** PutPermission
+    PutPermission (PutPermission'),
+    newPutPermission,
+    PutPermissionResponse (PutPermissionResponse'),
+    newPutPermissionResponse,
+
+    -- ** RemoveNotificationChannel
+    RemoveNotificationChannel (RemoveNotificationChannel'),
+    newRemoveNotificationChannel,
+    RemoveNotificationChannelResponse (RemoveNotificationChannelResponse'),
+    newRemoveNotificationChannelResponse,
+
+    -- ** RemovePermission
+    RemovePermission (RemovePermission'),
+    newRemovePermission,
+    RemovePermissionResponse (RemovePermissionResponse'),
+    newRemovePermissionResponse,
+
+    -- ** SubmitFeedback
+    SubmitFeedback (SubmitFeedback'),
+    newSubmitFeedback,
+    SubmitFeedbackResponse (SubmitFeedbackResponse'),
+    newSubmitFeedbackResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateProfilingGroup
+    UpdateProfilingGroup (UpdateProfilingGroup'),
+    newUpdateProfilingGroup,
+    UpdateProfilingGroupResponse (UpdateProfilingGroupResponse'),
+    newUpdateProfilingGroupResponse,
+
+    -- * Types
+
+    -- ** ActionGroup
+    ActionGroup (..),
+
+    -- ** AgentParameterField
+    AgentParameterField (..),
+
+    -- ** AggregationPeriod
+    AggregationPeriod (..),
+
+    -- ** ComputePlatform
+    ComputePlatform (..),
+
+    -- ** EventPublisher
+    EventPublisher (..),
+
+    -- ** FeedbackType
+    FeedbackType (..),
+
+    -- ** MetadataField
+    MetadataField (..),
+
+    -- ** MetricType
+    MetricType (..),
+
+    -- ** OrderBy
+    OrderBy (..),
+
+    -- ** AgentConfiguration
+    AgentConfiguration (AgentConfiguration'),
+    newAgentConfiguration,
+
+    -- ** AgentOrchestrationConfig
+    AgentOrchestrationConfig (AgentOrchestrationConfig'),
+    newAgentOrchestrationConfig,
+
+    -- ** AggregatedProfileTime
+    AggregatedProfileTime (AggregatedProfileTime'),
+    newAggregatedProfileTime,
+
+    -- ** Anomaly
+    Anomaly (Anomaly'),
+    newAnomaly,
+
+    -- ** AnomalyInstance
+    AnomalyInstance (AnomalyInstance'),
+    newAnomalyInstance,
+
+    -- ** Channel
+    Channel (Channel'),
+    newChannel,
+
+    -- ** FindingsReportSummary
+    FindingsReportSummary (FindingsReportSummary'),
+    newFindingsReportSummary,
+
+    -- ** FrameMetric
+    FrameMetric (FrameMetric'),
+    newFrameMetric,
+
+    -- ** FrameMetricDatum
+    FrameMetricDatum (FrameMetricDatum'),
+    newFrameMetricDatum,
+
+    -- ** Match
+    Match (Match'),
+    newMatch,
+
+    -- ** Metric
+    Metric (Metric'),
+    newMetric,
+
+    -- ** NotificationConfiguration
+    NotificationConfiguration (NotificationConfiguration'),
+    newNotificationConfiguration,
+
+    -- ** Pattern
+    Pattern (Pattern'),
+    newPattern,
+
+    -- ** ProfileTime
+    ProfileTime (ProfileTime'),
+    newProfileTime,
+
+    -- ** ProfilingGroupDescription
+    ProfilingGroupDescription (ProfilingGroupDescription'),
+    newProfilingGroupDescription,
+
+    -- ** ProfilingStatus
+    ProfilingStatus (ProfilingStatus'),
+    newProfilingStatus,
+
+    -- ** Recommendation
+    Recommendation (Recommendation'),
+    newRecommendation,
+
+    -- ** TimestampStructure
+    TimestampStructure (TimestampStructure'),
+    newTimestampStructure,
+
+    -- ** UserFeedback
+    UserFeedback (UserFeedback'),
+    newUserFeedback,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.AddNotificationChannels
+import Amazonka.CodeGuruProfiler.BatchGetFrameMetricData
+import Amazonka.CodeGuruProfiler.ConfigureAgent
+import Amazonka.CodeGuruProfiler.CreateProfilingGroup
+import Amazonka.CodeGuruProfiler.DeleteProfilingGroup
+import Amazonka.CodeGuruProfiler.DescribeProfilingGroup
+import Amazonka.CodeGuruProfiler.GetFindingsReportAccountSummary
+import Amazonka.CodeGuruProfiler.GetNotificationConfiguration
+import Amazonka.CodeGuruProfiler.GetPolicy
+import Amazonka.CodeGuruProfiler.GetProfile
+import Amazonka.CodeGuruProfiler.GetRecommendations
+import Amazonka.CodeGuruProfiler.Lens
+import Amazonka.CodeGuruProfiler.ListFindingsReports
+import Amazonka.CodeGuruProfiler.ListProfileTimes
+import Amazonka.CodeGuruProfiler.ListProfilingGroups
+import Amazonka.CodeGuruProfiler.ListTagsForResource
+import Amazonka.CodeGuruProfiler.PostAgentProfile
+import Amazonka.CodeGuruProfiler.PutPermission
+import Amazonka.CodeGuruProfiler.RemoveNotificationChannel
+import Amazonka.CodeGuruProfiler.RemovePermission
+import Amazonka.CodeGuruProfiler.SubmitFeedback
+import Amazonka.CodeGuruProfiler.TagResource
+import Amazonka.CodeGuruProfiler.Types
+import Amazonka.CodeGuruProfiler.UntagResource
+import Amazonka.CodeGuruProfiler.UpdateProfilingGroup
+import Amazonka.CodeGuruProfiler.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 'CodeGuruProfiler'.
+
+-- $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/CodeGuruProfiler/AddNotificationChannels.hs b/gen/Amazonka/CodeGuruProfiler/AddNotificationChannels.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/AddNotificationChannels.hs
@@ -0,0 +1,200 @@
+{-# 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.CodeGuruProfiler.AddNotificationChannels
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Add up to 2 anomaly notifications channels for a profiling group.
+module Amazonka.CodeGuruProfiler.AddNotificationChannels
+  ( -- * Creating a Request
+    AddNotificationChannels (..),
+    newAddNotificationChannels,
+
+    -- * Request Lenses
+    addNotificationChannels_channels,
+    addNotificationChannels_profilingGroupName,
+
+    -- * Destructuring the Response
+    AddNotificationChannelsResponse (..),
+    newAddNotificationChannelsResponse,
+
+    -- * Response Lenses
+    addNotificationChannelsResponse_notificationConfiguration,
+    addNotificationChannelsResponse_httpStatus,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the AddNotificationChannelsRequest.
+--
+-- /See:/ 'newAddNotificationChannels' smart constructor.
+data AddNotificationChannels = AddNotificationChannels'
+  { -- | One or 2 channels to report to when anomalies are detected.
+    channels :: Prelude.NonEmpty Channel,
+    -- | The name of the profiling group that we are setting up notifications
+    -- for.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AddNotificationChannels' 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:
+--
+-- 'channels', 'addNotificationChannels_channels' - One or 2 channels to report to when anomalies are detected.
+--
+-- 'profilingGroupName', 'addNotificationChannels_profilingGroupName' - The name of the profiling group that we are setting up notifications
+-- for.
+newAddNotificationChannels ::
+  -- | 'channels'
+  Prelude.NonEmpty Channel ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  AddNotificationChannels
+newAddNotificationChannels
+  pChannels_
+  pProfilingGroupName_ =
+    AddNotificationChannels'
+      { channels =
+          Lens.coerced Lens.# pChannels_,
+        profilingGroupName = pProfilingGroupName_
+      }
+
+-- | One or 2 channels to report to when anomalies are detected.
+addNotificationChannels_channels :: Lens.Lens' AddNotificationChannels (Prelude.NonEmpty Channel)
+addNotificationChannels_channels = Lens.lens (\AddNotificationChannels' {channels} -> channels) (\s@AddNotificationChannels' {} a -> s {channels = a} :: AddNotificationChannels) Prelude.. Lens.coerced
+
+-- | The name of the profiling group that we are setting up notifications
+-- for.
+addNotificationChannels_profilingGroupName :: Lens.Lens' AddNotificationChannels Prelude.Text
+addNotificationChannels_profilingGroupName = Lens.lens (\AddNotificationChannels' {profilingGroupName} -> profilingGroupName) (\s@AddNotificationChannels' {} a -> s {profilingGroupName = a} :: AddNotificationChannels)
+
+instance Core.AWSRequest AddNotificationChannels where
+  type
+    AWSResponse AddNotificationChannels =
+      AddNotificationChannelsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          AddNotificationChannelsResponse'
+            Prelude.<$> (x Data..?> "notificationConfiguration")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable AddNotificationChannels where
+  hashWithSalt _salt AddNotificationChannels' {..} =
+    _salt
+      `Prelude.hashWithSalt` channels
+      `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData AddNotificationChannels where
+  rnf AddNotificationChannels' {..} =
+    Prelude.rnf channels
+      `Prelude.seq` Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders AddNotificationChannels where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON AddNotificationChannels where
+  toJSON AddNotificationChannels' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("channels" Data..= channels)]
+      )
+
+instance Data.ToPath AddNotificationChannels where
+  toPath AddNotificationChannels' {..} =
+    Prelude.mconcat
+      [ "/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/notificationConfiguration"
+      ]
+
+instance Data.ToQuery AddNotificationChannels where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The structure representing the AddNotificationChannelsResponse.
+--
+-- /See:/ 'newAddNotificationChannelsResponse' smart constructor.
+data AddNotificationChannelsResponse = AddNotificationChannelsResponse'
+  { -- | The new notification configuration for this profiling group.
+    notificationConfiguration :: Prelude.Maybe NotificationConfiguration,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AddNotificationChannelsResponse' 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:
+--
+-- 'notificationConfiguration', 'addNotificationChannelsResponse_notificationConfiguration' - The new notification configuration for this profiling group.
+--
+-- 'httpStatus', 'addNotificationChannelsResponse_httpStatus' - The response's http status code.
+newAddNotificationChannelsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  AddNotificationChannelsResponse
+newAddNotificationChannelsResponse pHttpStatus_ =
+  AddNotificationChannelsResponse'
+    { notificationConfiguration =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The new notification configuration for this profiling group.
+addNotificationChannelsResponse_notificationConfiguration :: Lens.Lens' AddNotificationChannelsResponse (Prelude.Maybe NotificationConfiguration)
+addNotificationChannelsResponse_notificationConfiguration = Lens.lens (\AddNotificationChannelsResponse' {notificationConfiguration} -> notificationConfiguration) (\s@AddNotificationChannelsResponse' {} a -> s {notificationConfiguration = a} :: AddNotificationChannelsResponse)
+
+-- | The response's http status code.
+addNotificationChannelsResponse_httpStatus :: Lens.Lens' AddNotificationChannelsResponse Prelude.Int
+addNotificationChannelsResponse_httpStatus = Lens.lens (\AddNotificationChannelsResponse' {httpStatus} -> httpStatus) (\s@AddNotificationChannelsResponse' {} a -> s {httpStatus = a} :: AddNotificationChannelsResponse)
+
+instance
+  Prelude.NFData
+    AddNotificationChannelsResponse
+  where
+  rnf AddNotificationChannelsResponse' {..} =
+    Prelude.rnf notificationConfiguration
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/CodeGuruProfiler/BatchGetFrameMetricData.hs b/gen/Amazonka/CodeGuruProfiler/BatchGetFrameMetricData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/BatchGetFrameMetricData.hs
@@ -0,0 +1,452 @@
+{-# 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.CodeGuruProfiler.BatchGetFrameMetricData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the time series of values for a requested list of frame metrics
+-- from a time period.
+module Amazonka.CodeGuruProfiler.BatchGetFrameMetricData
+  ( -- * Creating a Request
+    BatchGetFrameMetricData (..),
+    newBatchGetFrameMetricData,
+
+    -- * Request Lenses
+    batchGetFrameMetricData_endTime,
+    batchGetFrameMetricData_frameMetrics,
+    batchGetFrameMetricData_period,
+    batchGetFrameMetricData_startTime,
+    batchGetFrameMetricData_targetResolution,
+    batchGetFrameMetricData_profilingGroupName,
+
+    -- * Destructuring the Response
+    BatchGetFrameMetricDataResponse (..),
+    newBatchGetFrameMetricDataResponse,
+
+    -- * Response Lenses
+    batchGetFrameMetricDataResponse_httpStatus,
+    batchGetFrameMetricDataResponse_endTime,
+    batchGetFrameMetricDataResponse_endTimes,
+    batchGetFrameMetricDataResponse_frameMetricData,
+    batchGetFrameMetricDataResponse_resolution,
+    batchGetFrameMetricDataResponse_startTime,
+    batchGetFrameMetricDataResponse_unprocessedEndTimes,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the BatchGetFrameMetricDataRequest.
+--
+-- /See:/ 'newBatchGetFrameMetricData' smart constructor.
+data BatchGetFrameMetricData = BatchGetFrameMetricData'
+  { -- | The end time of the time period for the returned time series values.
+    -- This is specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    endTime :: Prelude.Maybe Data.ISO8601,
+    -- | The details of the metrics that are used to request a time series of
+    -- values. The metric includes the name of the frame, the aggregation type
+    -- to calculate the metric value for the frame, and the thread states to
+    -- use to get the count for the metric value of the frame.
+    frameMetrics :: Prelude.Maybe [FrameMetric],
+    -- | The duration of the frame metrics used to return the time series values.
+    -- Specify using the ISO 8601 format. The maximum period duration is one
+    -- day (@PT24H@ or @P1D@).
+    period :: Prelude.Maybe Prelude.Text,
+    -- | The start time of the time period for the frame metrics used to return
+    -- the time series values. This is specified using the ISO 8601 format. For
+    -- example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1,
+    -- 2020 1:15:02 PM UTC.
+    startTime :: Prelude.Maybe Data.ISO8601,
+    -- | The requested resolution of time steps for the returned time series of
+    -- values. If the requested target resolution is not available due to data
+    -- not being retained we provide a best effort result by falling back to
+    -- the most granular available resolution after the target resolution.
+    -- There are 3 valid values.
+    --
+    -- -   @P1D@ — 1 day
+    --
+    -- -   @PT1H@ — 1 hour
+    --
+    -- -   @PT5M@ — 5 minutes
+    targetResolution :: Prelude.Maybe AggregationPeriod,
+    -- | The name of the profiling group associated with the the frame metrics
+    -- used to return the time series values.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetFrameMetricData' 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:
+--
+-- 'endTime', 'batchGetFrameMetricData_endTime' - The end time of the time period for the returned time series values.
+-- This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+--
+-- 'frameMetrics', 'batchGetFrameMetricData_frameMetrics' - The details of the metrics that are used to request a time series of
+-- values. The metric includes the name of the frame, the aggregation type
+-- to calculate the metric value for the frame, and the thread states to
+-- use to get the count for the metric value of the frame.
+--
+-- 'period', 'batchGetFrameMetricData_period' - The duration of the frame metrics used to return the time series values.
+-- Specify using the ISO 8601 format. The maximum period duration is one
+-- day (@PT24H@ or @P1D@).
+--
+-- 'startTime', 'batchGetFrameMetricData_startTime' - The start time of the time period for the frame metrics used to return
+-- the time series values. This is specified using the ISO 8601 format. For
+-- example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1,
+-- 2020 1:15:02 PM UTC.
+--
+-- 'targetResolution', 'batchGetFrameMetricData_targetResolution' - The requested resolution of time steps for the returned time series of
+-- values. If the requested target resolution is not available due to data
+-- not being retained we provide a best effort result by falling back to
+-- the most granular available resolution after the target resolution.
+-- There are 3 valid values.
+--
+-- -   @P1D@ — 1 day
+--
+-- -   @PT1H@ — 1 hour
+--
+-- -   @PT5M@ — 5 minutes
+--
+-- 'profilingGroupName', 'batchGetFrameMetricData_profilingGroupName' - The name of the profiling group associated with the the frame metrics
+-- used to return the time series values.
+newBatchGetFrameMetricData ::
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  BatchGetFrameMetricData
+newBatchGetFrameMetricData pProfilingGroupName_ =
+  BatchGetFrameMetricData'
+    { endTime = Prelude.Nothing,
+      frameMetrics = Prelude.Nothing,
+      period = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      targetResolution = Prelude.Nothing,
+      profilingGroupName = pProfilingGroupName_
+    }
+
+-- | The end time of the time period for the returned time series values.
+-- This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+batchGetFrameMetricData_endTime :: Lens.Lens' BatchGetFrameMetricData (Prelude.Maybe Prelude.UTCTime)
+batchGetFrameMetricData_endTime = Lens.lens (\BatchGetFrameMetricData' {endTime} -> endTime) (\s@BatchGetFrameMetricData' {} a -> s {endTime = a} :: BatchGetFrameMetricData) Prelude.. Lens.mapping Data._Time
+
+-- | The details of the metrics that are used to request a time series of
+-- values. The metric includes the name of the frame, the aggregation type
+-- to calculate the metric value for the frame, and the thread states to
+-- use to get the count for the metric value of the frame.
+batchGetFrameMetricData_frameMetrics :: Lens.Lens' BatchGetFrameMetricData (Prelude.Maybe [FrameMetric])
+batchGetFrameMetricData_frameMetrics = Lens.lens (\BatchGetFrameMetricData' {frameMetrics} -> frameMetrics) (\s@BatchGetFrameMetricData' {} a -> s {frameMetrics = a} :: BatchGetFrameMetricData) Prelude.. Lens.mapping Lens.coerced
+
+-- | The duration of the frame metrics used to return the time series values.
+-- Specify using the ISO 8601 format. The maximum period duration is one
+-- day (@PT24H@ or @P1D@).
+batchGetFrameMetricData_period :: Lens.Lens' BatchGetFrameMetricData (Prelude.Maybe Prelude.Text)
+batchGetFrameMetricData_period = Lens.lens (\BatchGetFrameMetricData' {period} -> period) (\s@BatchGetFrameMetricData' {} a -> s {period = a} :: BatchGetFrameMetricData)
+
+-- | The start time of the time period for the frame metrics used to return
+-- the time series values. This is specified using the ISO 8601 format. For
+-- example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1,
+-- 2020 1:15:02 PM UTC.
+batchGetFrameMetricData_startTime :: Lens.Lens' BatchGetFrameMetricData (Prelude.Maybe Prelude.UTCTime)
+batchGetFrameMetricData_startTime = Lens.lens (\BatchGetFrameMetricData' {startTime} -> startTime) (\s@BatchGetFrameMetricData' {} a -> s {startTime = a} :: BatchGetFrameMetricData) Prelude.. Lens.mapping Data._Time
+
+-- | The requested resolution of time steps for the returned time series of
+-- values. If the requested target resolution is not available due to data
+-- not being retained we provide a best effort result by falling back to
+-- the most granular available resolution after the target resolution.
+-- There are 3 valid values.
+--
+-- -   @P1D@ — 1 day
+--
+-- -   @PT1H@ — 1 hour
+--
+-- -   @PT5M@ — 5 minutes
+batchGetFrameMetricData_targetResolution :: Lens.Lens' BatchGetFrameMetricData (Prelude.Maybe AggregationPeriod)
+batchGetFrameMetricData_targetResolution = Lens.lens (\BatchGetFrameMetricData' {targetResolution} -> targetResolution) (\s@BatchGetFrameMetricData' {} a -> s {targetResolution = a} :: BatchGetFrameMetricData)
+
+-- | The name of the profiling group associated with the the frame metrics
+-- used to return the time series values.
+batchGetFrameMetricData_profilingGroupName :: Lens.Lens' BatchGetFrameMetricData Prelude.Text
+batchGetFrameMetricData_profilingGroupName = Lens.lens (\BatchGetFrameMetricData' {profilingGroupName} -> profilingGroupName) (\s@BatchGetFrameMetricData' {} a -> s {profilingGroupName = a} :: BatchGetFrameMetricData)
+
+instance Core.AWSRequest BatchGetFrameMetricData where
+  type
+    AWSResponse BatchGetFrameMetricData =
+      BatchGetFrameMetricDataResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchGetFrameMetricDataResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "endTime")
+            Prelude.<*> (x Data..?> "endTimes" Core..!@ Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..?> "frameMetricData"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:> "resolution")
+            Prelude.<*> (x Data..:> "startTime")
+            Prelude.<*> ( x
+                            Data..?> "unprocessedEndTimes"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable BatchGetFrameMetricData where
+  hashWithSalt _salt BatchGetFrameMetricData' {..} =
+    _salt
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` frameMetrics
+      `Prelude.hashWithSalt` period
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` targetResolution
+      `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData BatchGetFrameMetricData where
+  rnf BatchGetFrameMetricData' {..} =
+    Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf frameMetrics
+      `Prelude.seq` Prelude.rnf period
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf targetResolution
+      `Prelude.seq` Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders BatchGetFrameMetricData where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchGetFrameMetricData where
+  toJSON BatchGetFrameMetricData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("frameMetrics" Data..=) Prelude.<$> frameMetrics]
+      )
+
+instance Data.ToPath BatchGetFrameMetricData where
+  toPath BatchGetFrameMetricData' {..} =
+    Prelude.mconcat
+      [ "/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/frames/-/metrics"
+      ]
+
+instance Data.ToQuery BatchGetFrameMetricData where
+  toQuery BatchGetFrameMetricData' {..} =
+    Prelude.mconcat
+      [ "endTime" Data.=: endTime,
+        "period" Data.=: period,
+        "startTime" Data.=: startTime,
+        "targetResolution" Data.=: targetResolution
+      ]
+
+-- | The structure representing the BatchGetFrameMetricDataResponse.
+--
+-- /See:/ 'newBatchGetFrameMetricDataResponse' smart constructor.
+data BatchGetFrameMetricDataResponse = BatchGetFrameMetricDataResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The end time of the time period for the returned time series values.
+    -- This is specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    endTime :: Data.ISO8601,
+    -- | List of instances, or time steps, in the time series. For example, if
+    -- the @period@ is one day (@PT24H)@), and the @resolution@ is five minutes
+    -- (@PT5M@), then there are 288 @endTimes@ in the list that are each five
+    -- minutes appart.
+    endTimes :: [TimestampStructure],
+    -- | Details of the metrics to request a time series of values. The metric
+    -- includes the name of the frame, the aggregation type to calculate the
+    -- metric value for the frame, and the thread states to use to get the
+    -- count for the metric value of the frame.
+    frameMetricData :: [FrameMetricDatum],
+    -- | Resolution or granularity of the profile data used to generate the time
+    -- series. This is the value used to jump through time steps in a time
+    -- series. There are 3 valid values.
+    --
+    -- -   @P1D@ — 1 day
+    --
+    -- -   @PT1H@ — 1 hour
+    --
+    -- -   @PT5M@ — 5 minutes
+    resolution :: AggregationPeriod,
+    -- | The start time of the time period for the returned time series values.
+    -- This is specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    startTime :: Data.ISO8601,
+    -- | List of instances which remained unprocessed. This will create a missing
+    -- time step in the list of end times.
+    unprocessedEndTimes :: Prelude.HashMap Prelude.Text [TimestampStructure]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetFrameMetricDataResponse' 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:
+--
+-- 'httpStatus', 'batchGetFrameMetricDataResponse_httpStatus' - The response's http status code.
+--
+-- 'endTime', 'batchGetFrameMetricDataResponse_endTime' - The end time of the time period for the returned time series values.
+-- This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+--
+-- 'endTimes', 'batchGetFrameMetricDataResponse_endTimes' - List of instances, or time steps, in the time series. For example, if
+-- the @period@ is one day (@PT24H)@), and the @resolution@ is five minutes
+-- (@PT5M@), then there are 288 @endTimes@ in the list that are each five
+-- minutes appart.
+--
+-- 'frameMetricData', 'batchGetFrameMetricDataResponse_frameMetricData' - Details of the metrics to request a time series of values. The metric
+-- includes the name of the frame, the aggregation type to calculate the
+-- metric value for the frame, and the thread states to use to get the
+-- count for the metric value of the frame.
+--
+-- 'resolution', 'batchGetFrameMetricDataResponse_resolution' - Resolution or granularity of the profile data used to generate the time
+-- series. This is the value used to jump through time steps in a time
+-- series. There are 3 valid values.
+--
+-- -   @P1D@ — 1 day
+--
+-- -   @PT1H@ — 1 hour
+--
+-- -   @PT5M@ — 5 minutes
+--
+-- 'startTime', 'batchGetFrameMetricDataResponse_startTime' - The start time of the time period for the returned time series values.
+-- This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+--
+-- 'unprocessedEndTimes', 'batchGetFrameMetricDataResponse_unprocessedEndTimes' - List of instances which remained unprocessed. This will create a missing
+-- time step in the list of end times.
+newBatchGetFrameMetricDataResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'endTime'
+  Prelude.UTCTime ->
+  -- | 'resolution'
+  AggregationPeriod ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  BatchGetFrameMetricDataResponse
+newBatchGetFrameMetricDataResponse
+  pHttpStatus_
+  pEndTime_
+  pResolution_
+  pStartTime_ =
+    BatchGetFrameMetricDataResponse'
+      { httpStatus =
+          pHttpStatus_,
+        endTime = Data._Time Lens.# pEndTime_,
+        endTimes = Prelude.mempty,
+        frameMetricData = Prelude.mempty,
+        resolution = pResolution_,
+        startTime = Data._Time Lens.# pStartTime_,
+        unprocessedEndTimes = Prelude.mempty
+      }
+
+-- | The response's http status code.
+batchGetFrameMetricDataResponse_httpStatus :: Lens.Lens' BatchGetFrameMetricDataResponse Prelude.Int
+batchGetFrameMetricDataResponse_httpStatus = Lens.lens (\BatchGetFrameMetricDataResponse' {httpStatus} -> httpStatus) (\s@BatchGetFrameMetricDataResponse' {} a -> s {httpStatus = a} :: BatchGetFrameMetricDataResponse)
+
+-- | The end time of the time period for the returned time series values.
+-- This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+batchGetFrameMetricDataResponse_endTime :: Lens.Lens' BatchGetFrameMetricDataResponse Prelude.UTCTime
+batchGetFrameMetricDataResponse_endTime = Lens.lens (\BatchGetFrameMetricDataResponse' {endTime} -> endTime) (\s@BatchGetFrameMetricDataResponse' {} a -> s {endTime = a} :: BatchGetFrameMetricDataResponse) Prelude.. Data._Time
+
+-- | List of instances, or time steps, in the time series. For example, if
+-- the @period@ is one day (@PT24H)@), and the @resolution@ is five minutes
+-- (@PT5M@), then there are 288 @endTimes@ in the list that are each five
+-- minutes appart.
+batchGetFrameMetricDataResponse_endTimes :: Lens.Lens' BatchGetFrameMetricDataResponse [TimestampStructure]
+batchGetFrameMetricDataResponse_endTimes = Lens.lens (\BatchGetFrameMetricDataResponse' {endTimes} -> endTimes) (\s@BatchGetFrameMetricDataResponse' {} a -> s {endTimes = a} :: BatchGetFrameMetricDataResponse) Prelude.. Lens.coerced
+
+-- | Details of the metrics to request a time series of values. The metric
+-- includes the name of the frame, the aggregation type to calculate the
+-- metric value for the frame, and the thread states to use to get the
+-- count for the metric value of the frame.
+batchGetFrameMetricDataResponse_frameMetricData :: Lens.Lens' BatchGetFrameMetricDataResponse [FrameMetricDatum]
+batchGetFrameMetricDataResponse_frameMetricData = Lens.lens (\BatchGetFrameMetricDataResponse' {frameMetricData} -> frameMetricData) (\s@BatchGetFrameMetricDataResponse' {} a -> s {frameMetricData = a} :: BatchGetFrameMetricDataResponse) Prelude.. Lens.coerced
+
+-- | Resolution or granularity of the profile data used to generate the time
+-- series. This is the value used to jump through time steps in a time
+-- series. There are 3 valid values.
+--
+-- -   @P1D@ — 1 day
+--
+-- -   @PT1H@ — 1 hour
+--
+-- -   @PT5M@ — 5 minutes
+batchGetFrameMetricDataResponse_resolution :: Lens.Lens' BatchGetFrameMetricDataResponse AggregationPeriod
+batchGetFrameMetricDataResponse_resolution = Lens.lens (\BatchGetFrameMetricDataResponse' {resolution} -> resolution) (\s@BatchGetFrameMetricDataResponse' {} a -> s {resolution = a} :: BatchGetFrameMetricDataResponse)
+
+-- | The start time of the time period for the returned time series values.
+-- This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+batchGetFrameMetricDataResponse_startTime :: Lens.Lens' BatchGetFrameMetricDataResponse Prelude.UTCTime
+batchGetFrameMetricDataResponse_startTime = Lens.lens (\BatchGetFrameMetricDataResponse' {startTime} -> startTime) (\s@BatchGetFrameMetricDataResponse' {} a -> s {startTime = a} :: BatchGetFrameMetricDataResponse) Prelude.. Data._Time
+
+-- | List of instances which remained unprocessed. This will create a missing
+-- time step in the list of end times.
+batchGetFrameMetricDataResponse_unprocessedEndTimes :: Lens.Lens' BatchGetFrameMetricDataResponse (Prelude.HashMap Prelude.Text [TimestampStructure])
+batchGetFrameMetricDataResponse_unprocessedEndTimes = Lens.lens (\BatchGetFrameMetricDataResponse' {unprocessedEndTimes} -> unprocessedEndTimes) (\s@BatchGetFrameMetricDataResponse' {} a -> s {unprocessedEndTimes = a} :: BatchGetFrameMetricDataResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    BatchGetFrameMetricDataResponse
+  where
+  rnf BatchGetFrameMetricDataResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf endTimes
+      `Prelude.seq` Prelude.rnf frameMetricData
+      `Prelude.seq` Prelude.rnf resolution
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf unprocessedEndTimes
diff --git a/gen/Amazonka/CodeGuruProfiler/ConfigureAgent.hs b/gen/Amazonka/CodeGuruProfiler/ConfigureAgent.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/ConfigureAgent.hs
@@ -0,0 +1,309 @@
+{-# 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.CodeGuruProfiler.ConfigureAgent
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Used by profiler agents to report their current state and to receive
+-- remote configuration updates. For example, @ConfigureAgent@ can be used
+-- to tell an agent whether to profile or not and for how long to return
+-- profiling data.
+module Amazonka.CodeGuruProfiler.ConfigureAgent
+  ( -- * Creating a Request
+    ConfigureAgent (..),
+    newConfigureAgent,
+
+    -- * Request Lenses
+    configureAgent_fleetInstanceId,
+    configureAgent_metadata,
+    configureAgent_profilingGroupName,
+
+    -- * Destructuring the Response
+    ConfigureAgentResponse (..),
+    newConfigureAgentResponse,
+
+    -- * Response Lenses
+    configureAgentResponse_httpStatus,
+    configureAgentResponse_configuration,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the configureAgentRequest.
+--
+-- /See:/ 'newConfigureAgent' smart constructor.
+data ConfigureAgent = ConfigureAgent'
+  { -- | A universally unique identifier (UUID) for a profiling instance. For
+    -- example, if the profiling instance is an Amazon EC2 instance, it is the
+    -- instance ID. If it is an AWS Fargate container, it is the container\'s
+    -- task ID.
+    fleetInstanceId :: Prelude.Maybe Prelude.Text,
+    -- | Metadata captured about the compute platform the agent is running on. It
+    -- includes information about sampling and reporting. The valid fields are:
+    --
+    -- -   @COMPUTE_PLATFORM@ - The compute platform on which the agent is
+    --     running
+    --
+    -- -   @AGENT_ID@ - The ID for an agent instance.
+    --
+    -- -   @AWS_REQUEST_ID@ - The AWS request ID of a Lambda invocation.
+    --
+    -- -   @EXECUTION_ENVIRONMENT@ - The execution environment a Lambda
+    --     function is running on.
+    --
+    -- -   @LAMBDA_FUNCTION_ARN@ - The Amazon Resource Name (ARN) that is used
+    --     to invoke a Lambda function.
+    --
+    -- -   @LAMBDA_MEMORY_LIMIT_IN_MB@ - The memory allocated to a Lambda
+    --     function.
+    --
+    -- -   @LAMBDA_REMAINING_TIME_IN_MILLISECONDS@ - The time in milliseconds
+    --     before execution of a Lambda function times out.
+    --
+    -- -   @LAMBDA_TIME_GAP_BETWEEN_INVOKES_IN_MILLISECONDS@ - The time in
+    --     milliseconds between two invocations of a Lambda function.
+    --
+    -- -   @LAMBDA_PREVIOUS_EXECUTION_TIME_IN_MILLISECONDS@ - The time in
+    --     milliseconds for the previous Lambda invocation.
+    metadata :: Prelude.Maybe (Prelude.HashMap MetadataField Prelude.Text),
+    -- | The name of the profiling group for which the configured agent is
+    -- collecting profiling data.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigureAgent' 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:
+--
+-- 'fleetInstanceId', 'configureAgent_fleetInstanceId' - A universally unique identifier (UUID) for a profiling instance. For
+-- example, if the profiling instance is an Amazon EC2 instance, it is the
+-- instance ID. If it is an AWS Fargate container, it is the container\'s
+-- task ID.
+--
+-- 'metadata', 'configureAgent_metadata' - Metadata captured about the compute platform the agent is running on. It
+-- includes information about sampling and reporting. The valid fields are:
+--
+-- -   @COMPUTE_PLATFORM@ - The compute platform on which the agent is
+--     running
+--
+-- -   @AGENT_ID@ - The ID for an agent instance.
+--
+-- -   @AWS_REQUEST_ID@ - The AWS request ID of a Lambda invocation.
+--
+-- -   @EXECUTION_ENVIRONMENT@ - The execution environment a Lambda
+--     function is running on.
+--
+-- -   @LAMBDA_FUNCTION_ARN@ - The Amazon Resource Name (ARN) that is used
+--     to invoke a Lambda function.
+--
+-- -   @LAMBDA_MEMORY_LIMIT_IN_MB@ - The memory allocated to a Lambda
+--     function.
+--
+-- -   @LAMBDA_REMAINING_TIME_IN_MILLISECONDS@ - The time in milliseconds
+--     before execution of a Lambda function times out.
+--
+-- -   @LAMBDA_TIME_GAP_BETWEEN_INVOKES_IN_MILLISECONDS@ - The time in
+--     milliseconds between two invocations of a Lambda function.
+--
+-- -   @LAMBDA_PREVIOUS_EXECUTION_TIME_IN_MILLISECONDS@ - The time in
+--     milliseconds for the previous Lambda invocation.
+--
+-- 'profilingGroupName', 'configureAgent_profilingGroupName' - The name of the profiling group for which the configured agent is
+-- collecting profiling data.
+newConfigureAgent ::
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  ConfigureAgent
+newConfigureAgent pProfilingGroupName_ =
+  ConfigureAgent'
+    { fleetInstanceId = Prelude.Nothing,
+      metadata = Prelude.Nothing,
+      profilingGroupName = pProfilingGroupName_
+    }
+
+-- | A universally unique identifier (UUID) for a profiling instance. For
+-- example, if the profiling instance is an Amazon EC2 instance, it is the
+-- instance ID. If it is an AWS Fargate container, it is the container\'s
+-- task ID.
+configureAgent_fleetInstanceId :: Lens.Lens' ConfigureAgent (Prelude.Maybe Prelude.Text)
+configureAgent_fleetInstanceId = Lens.lens (\ConfigureAgent' {fleetInstanceId} -> fleetInstanceId) (\s@ConfigureAgent' {} a -> s {fleetInstanceId = a} :: ConfigureAgent)
+
+-- | Metadata captured about the compute platform the agent is running on. It
+-- includes information about sampling and reporting. The valid fields are:
+--
+-- -   @COMPUTE_PLATFORM@ - The compute platform on which the agent is
+--     running
+--
+-- -   @AGENT_ID@ - The ID for an agent instance.
+--
+-- -   @AWS_REQUEST_ID@ - The AWS request ID of a Lambda invocation.
+--
+-- -   @EXECUTION_ENVIRONMENT@ - The execution environment a Lambda
+--     function is running on.
+--
+-- -   @LAMBDA_FUNCTION_ARN@ - The Amazon Resource Name (ARN) that is used
+--     to invoke a Lambda function.
+--
+-- -   @LAMBDA_MEMORY_LIMIT_IN_MB@ - The memory allocated to a Lambda
+--     function.
+--
+-- -   @LAMBDA_REMAINING_TIME_IN_MILLISECONDS@ - The time in milliseconds
+--     before execution of a Lambda function times out.
+--
+-- -   @LAMBDA_TIME_GAP_BETWEEN_INVOKES_IN_MILLISECONDS@ - The time in
+--     milliseconds between two invocations of a Lambda function.
+--
+-- -   @LAMBDA_PREVIOUS_EXECUTION_TIME_IN_MILLISECONDS@ - The time in
+--     milliseconds for the previous Lambda invocation.
+configureAgent_metadata :: Lens.Lens' ConfigureAgent (Prelude.Maybe (Prelude.HashMap MetadataField Prelude.Text))
+configureAgent_metadata = Lens.lens (\ConfigureAgent' {metadata} -> metadata) (\s@ConfigureAgent' {} a -> s {metadata = a} :: ConfigureAgent) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the profiling group for which the configured agent is
+-- collecting profiling data.
+configureAgent_profilingGroupName :: Lens.Lens' ConfigureAgent Prelude.Text
+configureAgent_profilingGroupName = Lens.lens (\ConfigureAgent' {profilingGroupName} -> profilingGroupName) (\s@ConfigureAgent' {} a -> s {profilingGroupName = a} :: ConfigureAgent)
+
+instance Core.AWSRequest ConfigureAgent where
+  type
+    AWSResponse ConfigureAgent =
+      ConfigureAgentResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ConfigureAgentResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable ConfigureAgent where
+  hashWithSalt _salt ConfigureAgent' {..} =
+    _salt
+      `Prelude.hashWithSalt` fleetInstanceId
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData ConfigureAgent where
+  rnf ConfigureAgent' {..} =
+    Prelude.rnf fleetInstanceId
+      `Prelude.seq` Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders ConfigureAgent where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ConfigureAgent where
+  toJSON ConfigureAgent' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("fleetInstanceId" Data..=)
+              Prelude.<$> fleetInstanceId,
+            ("metadata" Data..=) Prelude.<$> metadata
+          ]
+      )
+
+instance Data.ToPath ConfigureAgent where
+  toPath ConfigureAgent' {..} =
+    Prelude.mconcat
+      [ "/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/configureAgent"
+      ]
+
+instance Data.ToQuery ConfigureAgent where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The structure representing the configureAgentResponse.
+--
+-- /See:/ 'newConfigureAgentResponse' smart constructor.
+data ConfigureAgentResponse = ConfigureAgentResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | An
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AgentConfiguration.html AgentConfiguration>
+    -- object that specifies if an agent profiles or not and for how long to
+    -- return profiling data.
+    configuration :: AgentConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ConfigureAgentResponse' 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:
+--
+-- 'httpStatus', 'configureAgentResponse_httpStatus' - The response's http status code.
+--
+-- 'configuration', 'configureAgentResponse_configuration' - An
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AgentConfiguration.html AgentConfiguration>
+-- object that specifies if an agent profiles or not and for how long to
+-- return profiling data.
+newConfigureAgentResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'configuration'
+  AgentConfiguration ->
+  ConfigureAgentResponse
+newConfigureAgentResponse
+  pHttpStatus_
+  pConfiguration_ =
+    ConfigureAgentResponse'
+      { httpStatus = pHttpStatus_,
+        configuration = pConfiguration_
+      }
+
+-- | The response's http status code.
+configureAgentResponse_httpStatus :: Lens.Lens' ConfigureAgentResponse Prelude.Int
+configureAgentResponse_httpStatus = Lens.lens (\ConfigureAgentResponse' {httpStatus} -> httpStatus) (\s@ConfigureAgentResponse' {} a -> s {httpStatus = a} :: ConfigureAgentResponse)
+
+-- | An
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AgentConfiguration.html AgentConfiguration>
+-- object that specifies if an agent profiles or not and for how long to
+-- return profiling data.
+configureAgentResponse_configuration :: Lens.Lens' ConfigureAgentResponse AgentConfiguration
+configureAgentResponse_configuration = Lens.lens (\ConfigureAgentResponse' {configuration} -> configuration) (\s@ConfigureAgentResponse' {} a -> s {configuration = a} :: ConfigureAgentResponse)
+
+instance Prelude.NFData ConfigureAgentResponse where
+  rnf ConfigureAgentResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf configuration
diff --git a/gen/Amazonka/CodeGuruProfiler/CreateProfilingGroup.hs b/gen/Amazonka/CodeGuruProfiler/CreateProfilingGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/CreateProfilingGroup.hs
@@ -0,0 +1,264 @@
+{-# 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.CodeGuruProfiler.CreateProfilingGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a profiling group.
+module Amazonka.CodeGuruProfiler.CreateProfilingGroup
+  ( -- * Creating a Request
+    CreateProfilingGroup (..),
+    newCreateProfilingGroup,
+
+    -- * Request Lenses
+    createProfilingGroup_agentOrchestrationConfig,
+    createProfilingGroup_computePlatform,
+    createProfilingGroup_tags,
+    createProfilingGroup_clientToken,
+    createProfilingGroup_profilingGroupName,
+
+    -- * Destructuring the Response
+    CreateProfilingGroupResponse (..),
+    newCreateProfilingGroupResponse,
+
+    -- * Response Lenses
+    createProfilingGroupResponse_httpStatus,
+    createProfilingGroupResponse_profilingGroup,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the createProfiliingGroupRequest.
+--
+-- /See:/ 'newCreateProfilingGroup' smart constructor.
+data CreateProfilingGroup = CreateProfilingGroup'
+  { -- | Specifies whether profiling is enabled or disabled for the created
+    -- profiling group.
+    agentOrchestrationConfig :: Prelude.Maybe AgentOrchestrationConfig,
+    -- | The compute platform of the profiling group. Use @AWSLambda@ if your
+    -- application runs on AWS Lambda. Use @Default@ if your application runs
+    -- on a compute platform that is not AWS Lambda, such an Amazon EC2
+    -- instance, an on-premises server, or a different platform. If not
+    -- specified, @Default@ is used.
+    computePlatform :: Prelude.Maybe ComputePlatform,
+    -- | A list of tags to add to the created profiling group.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Amazon CodeGuru Profiler uses this universally unique identifier (UUID)
+    -- to prevent the accidental creation of duplicate profiling groups if
+    -- there are failures and retries.
+    clientToken :: Prelude.Text,
+    -- | The name of the profiling group to create.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateProfilingGroup' 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:
+--
+-- 'agentOrchestrationConfig', 'createProfilingGroup_agentOrchestrationConfig' - Specifies whether profiling is enabled or disabled for the created
+-- profiling group.
+--
+-- 'computePlatform', 'createProfilingGroup_computePlatform' - The compute platform of the profiling group. Use @AWSLambda@ if your
+-- application runs on AWS Lambda. Use @Default@ if your application runs
+-- on a compute platform that is not AWS Lambda, such an Amazon EC2
+-- instance, an on-premises server, or a different platform. If not
+-- specified, @Default@ is used.
+--
+-- 'tags', 'createProfilingGroup_tags' - A list of tags to add to the created profiling group.
+--
+-- 'clientToken', 'createProfilingGroup_clientToken' - Amazon CodeGuru Profiler uses this universally unique identifier (UUID)
+-- to prevent the accidental creation of duplicate profiling groups if
+-- there are failures and retries.
+--
+-- 'profilingGroupName', 'createProfilingGroup_profilingGroupName' - The name of the profiling group to create.
+newCreateProfilingGroup ::
+  -- | 'clientToken'
+  Prelude.Text ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  CreateProfilingGroup
+newCreateProfilingGroup
+  pClientToken_
+  pProfilingGroupName_ =
+    CreateProfilingGroup'
+      { agentOrchestrationConfig =
+          Prelude.Nothing,
+        computePlatform = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        clientToken = pClientToken_,
+        profilingGroupName = pProfilingGroupName_
+      }
+
+-- | Specifies whether profiling is enabled or disabled for the created
+-- profiling group.
+createProfilingGroup_agentOrchestrationConfig :: Lens.Lens' CreateProfilingGroup (Prelude.Maybe AgentOrchestrationConfig)
+createProfilingGroup_agentOrchestrationConfig = Lens.lens (\CreateProfilingGroup' {agentOrchestrationConfig} -> agentOrchestrationConfig) (\s@CreateProfilingGroup' {} a -> s {agentOrchestrationConfig = a} :: CreateProfilingGroup)
+
+-- | The compute platform of the profiling group. Use @AWSLambda@ if your
+-- application runs on AWS Lambda. Use @Default@ if your application runs
+-- on a compute platform that is not AWS Lambda, such an Amazon EC2
+-- instance, an on-premises server, or a different platform. If not
+-- specified, @Default@ is used.
+createProfilingGroup_computePlatform :: Lens.Lens' CreateProfilingGroup (Prelude.Maybe ComputePlatform)
+createProfilingGroup_computePlatform = Lens.lens (\CreateProfilingGroup' {computePlatform} -> computePlatform) (\s@CreateProfilingGroup' {} a -> s {computePlatform = a} :: CreateProfilingGroup)
+
+-- | A list of tags to add to the created profiling group.
+createProfilingGroup_tags :: Lens.Lens' CreateProfilingGroup (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createProfilingGroup_tags = Lens.lens (\CreateProfilingGroup' {tags} -> tags) (\s@CreateProfilingGroup' {} a -> s {tags = a} :: CreateProfilingGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | Amazon CodeGuru Profiler uses this universally unique identifier (UUID)
+-- to prevent the accidental creation of duplicate profiling groups if
+-- there are failures and retries.
+createProfilingGroup_clientToken :: Lens.Lens' CreateProfilingGroup Prelude.Text
+createProfilingGroup_clientToken = Lens.lens (\CreateProfilingGroup' {clientToken} -> clientToken) (\s@CreateProfilingGroup' {} a -> s {clientToken = a} :: CreateProfilingGroup)
+
+-- | The name of the profiling group to create.
+createProfilingGroup_profilingGroupName :: Lens.Lens' CreateProfilingGroup Prelude.Text
+createProfilingGroup_profilingGroupName = Lens.lens (\CreateProfilingGroup' {profilingGroupName} -> profilingGroupName) (\s@CreateProfilingGroup' {} a -> s {profilingGroupName = a} :: CreateProfilingGroup)
+
+instance Core.AWSRequest CreateProfilingGroup where
+  type
+    AWSResponse CreateProfilingGroup =
+      CreateProfilingGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateProfilingGroupResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable CreateProfilingGroup where
+  hashWithSalt _salt CreateProfilingGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` agentOrchestrationConfig
+      `Prelude.hashWithSalt` computePlatform
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData CreateProfilingGroup where
+  rnf CreateProfilingGroup' {..} =
+    Prelude.rnf agentOrchestrationConfig
+      `Prelude.seq` Prelude.rnf computePlatform
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders CreateProfilingGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateProfilingGroup where
+  toJSON CreateProfilingGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("agentOrchestrationConfig" Data..=)
+              Prelude.<$> agentOrchestrationConfig,
+            ("computePlatform" Data..=)
+              Prelude.<$> computePlatform,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("profilingGroupName" Data..= profilingGroupName)
+          ]
+      )
+
+instance Data.ToPath CreateProfilingGroup where
+  toPath = Prelude.const "/profilingGroups"
+
+instance Data.ToQuery CreateProfilingGroup where
+  toQuery CreateProfilingGroup' {..} =
+    Prelude.mconcat ["clientToken" Data.=: clientToken]
+
+-- | The structure representing the createProfilingGroupResponse.
+--
+-- /See:/ 'newCreateProfilingGroupResponse' smart constructor.
+data CreateProfilingGroupResponse = CreateProfilingGroupResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The returned
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+    -- object that contains information about the created profiling group.
+    profilingGroup :: ProfilingGroupDescription
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateProfilingGroupResponse' 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:
+--
+-- 'httpStatus', 'createProfilingGroupResponse_httpStatus' - The response's http status code.
+--
+-- 'profilingGroup', 'createProfilingGroupResponse_profilingGroup' - The returned
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- object that contains information about the created profiling group.
+newCreateProfilingGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'profilingGroup'
+  ProfilingGroupDescription ->
+  CreateProfilingGroupResponse
+newCreateProfilingGroupResponse
+  pHttpStatus_
+  pProfilingGroup_ =
+    CreateProfilingGroupResponse'
+      { httpStatus =
+          pHttpStatus_,
+        profilingGroup = pProfilingGroup_
+      }
+
+-- | The response's http status code.
+createProfilingGroupResponse_httpStatus :: Lens.Lens' CreateProfilingGroupResponse Prelude.Int
+createProfilingGroupResponse_httpStatus = Lens.lens (\CreateProfilingGroupResponse' {httpStatus} -> httpStatus) (\s@CreateProfilingGroupResponse' {} a -> s {httpStatus = a} :: CreateProfilingGroupResponse)
+
+-- | The returned
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- object that contains information about the created profiling group.
+createProfilingGroupResponse_profilingGroup :: Lens.Lens' CreateProfilingGroupResponse ProfilingGroupDescription
+createProfilingGroupResponse_profilingGroup = Lens.lens (\CreateProfilingGroupResponse' {profilingGroup} -> profilingGroup) (\s@CreateProfilingGroupResponse' {} a -> s {profilingGroup = a} :: CreateProfilingGroupResponse)
+
+instance Prelude.NFData CreateProfilingGroupResponse where
+  rnf CreateProfilingGroupResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf profilingGroup
diff --git a/gen/Amazonka/CodeGuruProfiler/DeleteProfilingGroup.hs b/gen/Amazonka/CodeGuruProfiler/DeleteProfilingGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/DeleteProfilingGroup.hs
@@ -0,0 +1,155 @@
+{-# 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.CodeGuruProfiler.DeleteProfilingGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a profiling group.
+module Amazonka.CodeGuruProfiler.DeleteProfilingGroup
+  ( -- * Creating a Request
+    DeleteProfilingGroup (..),
+    newDeleteProfilingGroup,
+
+    -- * Request Lenses
+    deleteProfilingGroup_profilingGroupName,
+
+    -- * Destructuring the Response
+    DeleteProfilingGroupResponse (..),
+    newDeleteProfilingGroupResponse,
+
+    -- * Response Lenses
+    deleteProfilingGroupResponse_httpStatus,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the deleteProfilingGroupRequest.
+--
+-- /See:/ 'newDeleteProfilingGroup' smart constructor.
+data DeleteProfilingGroup = DeleteProfilingGroup'
+  { -- | The name of the profiling group to delete.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteProfilingGroup' 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:
+--
+-- 'profilingGroupName', 'deleteProfilingGroup_profilingGroupName' - The name of the profiling group to delete.
+newDeleteProfilingGroup ::
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  DeleteProfilingGroup
+newDeleteProfilingGroup pProfilingGroupName_ =
+  DeleteProfilingGroup'
+    { profilingGroupName =
+        pProfilingGroupName_
+    }
+
+-- | The name of the profiling group to delete.
+deleteProfilingGroup_profilingGroupName :: Lens.Lens' DeleteProfilingGroup Prelude.Text
+deleteProfilingGroup_profilingGroupName = Lens.lens (\DeleteProfilingGroup' {profilingGroupName} -> profilingGroupName) (\s@DeleteProfilingGroup' {} a -> s {profilingGroupName = a} :: DeleteProfilingGroup)
+
+instance Core.AWSRequest DeleteProfilingGroup where
+  type
+    AWSResponse DeleteProfilingGroup =
+      DeleteProfilingGroupResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteProfilingGroupResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteProfilingGroup where
+  hashWithSalt _salt DeleteProfilingGroup' {..} =
+    _salt `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData DeleteProfilingGroup where
+  rnf DeleteProfilingGroup' {..} =
+    Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders DeleteProfilingGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteProfilingGroup where
+  toPath DeleteProfilingGroup' {..} =
+    Prelude.mconcat
+      ["/profilingGroups/", Data.toBS profilingGroupName]
+
+instance Data.ToQuery DeleteProfilingGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The structure representing the deleteProfilingGroupResponse.
+--
+-- /See:/ 'newDeleteProfilingGroupResponse' smart constructor.
+data DeleteProfilingGroupResponse = DeleteProfilingGroupResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteProfilingGroupResponse' 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:
+--
+-- 'httpStatus', 'deleteProfilingGroupResponse_httpStatus' - The response's http status code.
+newDeleteProfilingGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteProfilingGroupResponse
+newDeleteProfilingGroupResponse pHttpStatus_ =
+  DeleteProfilingGroupResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteProfilingGroupResponse_httpStatus :: Lens.Lens' DeleteProfilingGroupResponse Prelude.Int
+deleteProfilingGroupResponse_httpStatus = Lens.lens (\DeleteProfilingGroupResponse' {httpStatus} -> httpStatus) (\s@DeleteProfilingGroupResponse' {} a -> s {httpStatus = a} :: DeleteProfilingGroupResponse)
+
+instance Prelude.NFData DeleteProfilingGroupResponse where
+  rnf DeleteProfilingGroupResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/CodeGuruProfiler/DescribeProfilingGroup.hs b/gen/Amazonka/CodeGuruProfiler/DescribeProfilingGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/DescribeProfilingGroup.hs
@@ -0,0 +1,182 @@
+{-# 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.CodeGuruProfiler.DescribeProfilingGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- object that contains information about the requested profiling group.
+module Amazonka.CodeGuruProfiler.DescribeProfilingGroup
+  ( -- * Creating a Request
+    DescribeProfilingGroup (..),
+    newDescribeProfilingGroup,
+
+    -- * Request Lenses
+    describeProfilingGroup_profilingGroupName,
+
+    -- * Destructuring the Response
+    DescribeProfilingGroupResponse (..),
+    newDescribeProfilingGroupResponse,
+
+    -- * Response Lenses
+    describeProfilingGroupResponse_httpStatus,
+    describeProfilingGroupResponse_profilingGroup,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the describeProfilingGroupRequest.
+--
+-- /See:/ 'newDescribeProfilingGroup' smart constructor.
+data DescribeProfilingGroup = DescribeProfilingGroup'
+  { -- | The name of the profiling group to get information about.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeProfilingGroup' 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:
+--
+-- 'profilingGroupName', 'describeProfilingGroup_profilingGroupName' - The name of the profiling group to get information about.
+newDescribeProfilingGroup ::
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  DescribeProfilingGroup
+newDescribeProfilingGroup pProfilingGroupName_ =
+  DescribeProfilingGroup'
+    { profilingGroupName =
+        pProfilingGroupName_
+    }
+
+-- | The name of the profiling group to get information about.
+describeProfilingGroup_profilingGroupName :: Lens.Lens' DescribeProfilingGroup Prelude.Text
+describeProfilingGroup_profilingGroupName = Lens.lens (\DescribeProfilingGroup' {profilingGroupName} -> profilingGroupName) (\s@DescribeProfilingGroup' {} a -> s {profilingGroupName = a} :: DescribeProfilingGroup)
+
+instance Core.AWSRequest DescribeProfilingGroup where
+  type
+    AWSResponse DescribeProfilingGroup =
+      DescribeProfilingGroupResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeProfilingGroupResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable DescribeProfilingGroup where
+  hashWithSalt _salt DescribeProfilingGroup' {..} =
+    _salt `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData DescribeProfilingGroup where
+  rnf DescribeProfilingGroup' {..} =
+    Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders DescribeProfilingGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeProfilingGroup where
+  toPath DescribeProfilingGroup' {..} =
+    Prelude.mconcat
+      ["/profilingGroups/", Data.toBS profilingGroupName]
+
+instance Data.ToQuery DescribeProfilingGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The structure representing the describeProfilingGroupResponse.
+--
+-- /See:/ 'newDescribeProfilingGroupResponse' smart constructor.
+data DescribeProfilingGroupResponse = DescribeProfilingGroupResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The returned
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+    -- object that contains information about the requested profiling group.
+    profilingGroup :: ProfilingGroupDescription
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeProfilingGroupResponse' 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:
+--
+-- 'httpStatus', 'describeProfilingGroupResponse_httpStatus' - The response's http status code.
+--
+-- 'profilingGroup', 'describeProfilingGroupResponse_profilingGroup' - The returned
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- object that contains information about the requested profiling group.
+newDescribeProfilingGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'profilingGroup'
+  ProfilingGroupDescription ->
+  DescribeProfilingGroupResponse
+newDescribeProfilingGroupResponse
+  pHttpStatus_
+  pProfilingGroup_ =
+    DescribeProfilingGroupResponse'
+      { httpStatus =
+          pHttpStatus_,
+        profilingGroup = pProfilingGroup_
+      }
+
+-- | The response's http status code.
+describeProfilingGroupResponse_httpStatus :: Lens.Lens' DescribeProfilingGroupResponse Prelude.Int
+describeProfilingGroupResponse_httpStatus = Lens.lens (\DescribeProfilingGroupResponse' {httpStatus} -> httpStatus) (\s@DescribeProfilingGroupResponse' {} a -> s {httpStatus = a} :: DescribeProfilingGroupResponse)
+
+-- | The returned
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- object that contains information about the requested profiling group.
+describeProfilingGroupResponse_profilingGroup :: Lens.Lens' DescribeProfilingGroupResponse ProfilingGroupDescription
+describeProfilingGroupResponse_profilingGroup = Lens.lens (\DescribeProfilingGroupResponse' {profilingGroup} -> profilingGroup) (\s@DescribeProfilingGroupResponse' {} a -> s {profilingGroup = a} :: DescribeProfilingGroupResponse)
+
+instance
+  Prelude.NFData
+    DescribeProfilingGroupResponse
+  where
+  rnf DescribeProfilingGroupResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf profilingGroup
diff --git a/gen/Amazonka/CodeGuruProfiler/GetFindingsReportAccountSummary.hs b/gen/Amazonka/CodeGuruProfiler/GetFindingsReportAccountSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/GetFindingsReportAccountSummary.hs
@@ -0,0 +1,301 @@
+{-# 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.CodeGuruProfiler.GetFindingsReportAccountSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_FindingsReportSummary.html FindingsReportSummary>
+-- objects that contain analysis results for all profiling groups in your
+-- AWS account.
+module Amazonka.CodeGuruProfiler.GetFindingsReportAccountSummary
+  ( -- * Creating a Request
+    GetFindingsReportAccountSummary (..),
+    newGetFindingsReportAccountSummary,
+
+    -- * Request Lenses
+    getFindingsReportAccountSummary_dailyReportsOnly,
+    getFindingsReportAccountSummary_maxResults,
+    getFindingsReportAccountSummary_nextToken,
+
+    -- * Destructuring the Response
+    GetFindingsReportAccountSummaryResponse (..),
+    newGetFindingsReportAccountSummaryResponse,
+
+    -- * Response Lenses
+    getFindingsReportAccountSummaryResponse_nextToken,
+    getFindingsReportAccountSummaryResponse_httpStatus,
+    getFindingsReportAccountSummaryResponse_reportSummaries,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the GetFindingsReportAccountSummaryRequest.
+--
+-- /See:/ 'newGetFindingsReportAccountSummary' smart constructor.
+data GetFindingsReportAccountSummary = GetFindingsReportAccountSummary'
+  { -- | A @Boolean@ value indicating whether to only return reports from daily
+    -- profiles. If set to @True@, only analysis data from daily profiles is
+    -- returned. If set to @False@, analysis data is returned from smaller time
+    -- windows (for example, one hour).
+    dailyReportsOnly :: Prelude.Maybe Prelude.Bool,
+    -- | The maximum number of results returned by
+    -- @ GetFindingsReportAccountSummary@ in paginated output. When this
+    -- parameter is used, @GetFindingsReportAccountSummary@ only returns
+    -- @maxResults@ results in a single page along with a @nextToken@ response
+    -- element. The remaining results of the initial request can be seen by
+    -- sending another @GetFindingsReportAccountSummary@ request with the
+    -- returned @nextToken@ value.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @GetFindingsReportAccountSummary@ request where @maxResults@ was used
+    -- and the results exceeded the value of that parameter. Pagination
+    -- continues from the end of the previous results that returned the
+    -- @nextToken@ value.
+    --
+    -- This token should be treated as an opaque identifier that is only used
+    -- to retrieve the next items in a list and not for other programmatic
+    -- purposes.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetFindingsReportAccountSummary' 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:
+--
+-- 'dailyReportsOnly', 'getFindingsReportAccountSummary_dailyReportsOnly' - A @Boolean@ value indicating whether to only return reports from daily
+-- profiles. If set to @True@, only analysis data from daily profiles is
+-- returned. If set to @False@, analysis data is returned from smaller time
+-- windows (for example, one hour).
+--
+-- 'maxResults', 'getFindingsReportAccountSummary_maxResults' - The maximum number of results returned by
+-- @ GetFindingsReportAccountSummary@ in paginated output. When this
+-- parameter is used, @GetFindingsReportAccountSummary@ only returns
+-- @maxResults@ results in a single page along with a @nextToken@ response
+-- element. The remaining results of the initial request can be seen by
+-- sending another @GetFindingsReportAccountSummary@ request with the
+-- returned @nextToken@ value.
+--
+-- 'nextToken', 'getFindingsReportAccountSummary_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @GetFindingsReportAccountSummary@ request where @maxResults@ was used
+-- and the results exceeded the value of that parameter. Pagination
+-- continues from the end of the previous results that returned the
+-- @nextToken@ value.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+newGetFindingsReportAccountSummary ::
+  GetFindingsReportAccountSummary
+newGetFindingsReportAccountSummary =
+  GetFindingsReportAccountSummary'
+    { dailyReportsOnly =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | A @Boolean@ value indicating whether to only return reports from daily
+-- profiles. If set to @True@, only analysis data from daily profiles is
+-- returned. If set to @False@, analysis data is returned from smaller time
+-- windows (for example, one hour).
+getFindingsReportAccountSummary_dailyReportsOnly :: Lens.Lens' GetFindingsReportAccountSummary (Prelude.Maybe Prelude.Bool)
+getFindingsReportAccountSummary_dailyReportsOnly = Lens.lens (\GetFindingsReportAccountSummary' {dailyReportsOnly} -> dailyReportsOnly) (\s@GetFindingsReportAccountSummary' {} a -> s {dailyReportsOnly = a} :: GetFindingsReportAccountSummary)
+
+-- | The maximum number of results returned by
+-- @ GetFindingsReportAccountSummary@ in paginated output. When this
+-- parameter is used, @GetFindingsReportAccountSummary@ only returns
+-- @maxResults@ results in a single page along with a @nextToken@ response
+-- element. The remaining results of the initial request can be seen by
+-- sending another @GetFindingsReportAccountSummary@ request with the
+-- returned @nextToken@ value.
+getFindingsReportAccountSummary_maxResults :: Lens.Lens' GetFindingsReportAccountSummary (Prelude.Maybe Prelude.Natural)
+getFindingsReportAccountSummary_maxResults = Lens.lens (\GetFindingsReportAccountSummary' {maxResults} -> maxResults) (\s@GetFindingsReportAccountSummary' {} a -> s {maxResults = a} :: GetFindingsReportAccountSummary)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @GetFindingsReportAccountSummary@ request where @maxResults@ was used
+-- and the results exceeded the value of that parameter. Pagination
+-- continues from the end of the previous results that returned the
+-- @nextToken@ value.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+getFindingsReportAccountSummary_nextToken :: Lens.Lens' GetFindingsReportAccountSummary (Prelude.Maybe Prelude.Text)
+getFindingsReportAccountSummary_nextToken = Lens.lens (\GetFindingsReportAccountSummary' {nextToken} -> nextToken) (\s@GetFindingsReportAccountSummary' {} a -> s {nextToken = a} :: GetFindingsReportAccountSummary)
+
+instance
+  Core.AWSRequest
+    GetFindingsReportAccountSummary
+  where
+  type
+    AWSResponse GetFindingsReportAccountSummary =
+      GetFindingsReportAccountSummaryResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetFindingsReportAccountSummaryResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "reportSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance
+  Prelude.Hashable
+    GetFindingsReportAccountSummary
+  where
+  hashWithSalt
+    _salt
+    GetFindingsReportAccountSummary' {..} =
+      _salt
+        `Prelude.hashWithSalt` dailyReportsOnly
+        `Prelude.hashWithSalt` maxResults
+        `Prelude.hashWithSalt` nextToken
+
+instance
+  Prelude.NFData
+    GetFindingsReportAccountSummary
+  where
+  rnf GetFindingsReportAccountSummary' {..} =
+    Prelude.rnf dailyReportsOnly
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance
+  Data.ToHeaders
+    GetFindingsReportAccountSummary
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetFindingsReportAccountSummary where
+  toPath = Prelude.const "/internal/findingsReports"
+
+instance Data.ToQuery GetFindingsReportAccountSummary where
+  toQuery GetFindingsReportAccountSummary' {..} =
+    Prelude.mconcat
+      [ "dailyReportsOnly" Data.=: dailyReportsOnly,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | The structure representing the GetFindingsReportAccountSummaryResponse.
+--
+-- /See:/ 'newGetFindingsReportAccountSummaryResponse' smart constructor.
+data GetFindingsReportAccountSummaryResponse = GetFindingsReportAccountSummaryResponse'
+  { -- | The @nextToken@ value to include in a future
+    -- @GetFindingsReportAccountSummary@ request. When the results of a
+    -- @GetFindingsReportAccountSummary@ request exceed @maxResults@, this
+    -- value can be used to retrieve the next page of results. This value is
+    -- @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The return list of
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_FindingsReportSummary.html FindingsReportSummary>
+    -- objects taht contain summaries of analysis results for all profiling
+    -- groups in your AWS account.
+    reportSummaries :: [FindingsReportSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetFindingsReportAccountSummaryResponse' 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:
+--
+-- 'nextToken', 'getFindingsReportAccountSummaryResponse_nextToken' - The @nextToken@ value to include in a future
+-- @GetFindingsReportAccountSummary@ request. When the results of a
+-- @GetFindingsReportAccountSummary@ request exceed @maxResults@, this
+-- value can be used to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'getFindingsReportAccountSummaryResponse_httpStatus' - The response's http status code.
+--
+-- 'reportSummaries', 'getFindingsReportAccountSummaryResponse_reportSummaries' - The return list of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_FindingsReportSummary.html FindingsReportSummary>
+-- objects taht contain summaries of analysis results for all profiling
+-- groups in your AWS account.
+newGetFindingsReportAccountSummaryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetFindingsReportAccountSummaryResponse
+newGetFindingsReportAccountSummaryResponse
+  pHttpStatus_ =
+    GetFindingsReportAccountSummaryResponse'
+      { nextToken =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        reportSummaries = Prelude.mempty
+      }
+
+-- | The @nextToken@ value to include in a future
+-- @GetFindingsReportAccountSummary@ request. When the results of a
+-- @GetFindingsReportAccountSummary@ request exceed @maxResults@, this
+-- value can be used to retrieve the next page of results. This value is
+-- @null@ when there are no more results to return.
+getFindingsReportAccountSummaryResponse_nextToken :: Lens.Lens' GetFindingsReportAccountSummaryResponse (Prelude.Maybe Prelude.Text)
+getFindingsReportAccountSummaryResponse_nextToken = Lens.lens (\GetFindingsReportAccountSummaryResponse' {nextToken} -> nextToken) (\s@GetFindingsReportAccountSummaryResponse' {} a -> s {nextToken = a} :: GetFindingsReportAccountSummaryResponse)
+
+-- | The response's http status code.
+getFindingsReportAccountSummaryResponse_httpStatus :: Lens.Lens' GetFindingsReportAccountSummaryResponse Prelude.Int
+getFindingsReportAccountSummaryResponse_httpStatus = Lens.lens (\GetFindingsReportAccountSummaryResponse' {httpStatus} -> httpStatus) (\s@GetFindingsReportAccountSummaryResponse' {} a -> s {httpStatus = a} :: GetFindingsReportAccountSummaryResponse)
+
+-- | The return list of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_FindingsReportSummary.html FindingsReportSummary>
+-- objects taht contain summaries of analysis results for all profiling
+-- groups in your AWS account.
+getFindingsReportAccountSummaryResponse_reportSummaries :: Lens.Lens' GetFindingsReportAccountSummaryResponse [FindingsReportSummary]
+getFindingsReportAccountSummaryResponse_reportSummaries = Lens.lens (\GetFindingsReportAccountSummaryResponse' {reportSummaries} -> reportSummaries) (\s@GetFindingsReportAccountSummaryResponse' {} a -> s {reportSummaries = a} :: GetFindingsReportAccountSummaryResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    GetFindingsReportAccountSummaryResponse
+  where
+  rnf GetFindingsReportAccountSummaryResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf reportSummaries
diff --git a/gen/Amazonka/CodeGuruProfiler/GetNotificationConfiguration.hs b/gen/Amazonka/CodeGuruProfiler/GetNotificationConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/GetNotificationConfiguration.hs
@@ -0,0 +1,185 @@
+{-# 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.CodeGuruProfiler.GetNotificationConfiguration
+-- 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 current configuration for anomaly notifications for a profiling
+-- group.
+module Amazonka.CodeGuruProfiler.GetNotificationConfiguration
+  ( -- * Creating a Request
+    GetNotificationConfiguration (..),
+    newGetNotificationConfiguration,
+
+    -- * Request Lenses
+    getNotificationConfiguration_profilingGroupName,
+
+    -- * Destructuring the Response
+    GetNotificationConfigurationResponse (..),
+    newGetNotificationConfigurationResponse,
+
+    -- * Response Lenses
+    getNotificationConfigurationResponse_httpStatus,
+    getNotificationConfigurationResponse_notificationConfiguration,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the GetNotificationConfigurationRequest.
+--
+-- /See:/ 'newGetNotificationConfiguration' smart constructor.
+data GetNotificationConfiguration = GetNotificationConfiguration'
+  { -- | The name of the profiling group we want to get the notification
+    -- configuration for.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetNotificationConfiguration' 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:
+--
+-- 'profilingGroupName', 'getNotificationConfiguration_profilingGroupName' - The name of the profiling group we want to get the notification
+-- configuration for.
+newGetNotificationConfiguration ::
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  GetNotificationConfiguration
+newGetNotificationConfiguration pProfilingGroupName_ =
+  GetNotificationConfiguration'
+    { profilingGroupName =
+        pProfilingGroupName_
+    }
+
+-- | The name of the profiling group we want to get the notification
+-- configuration for.
+getNotificationConfiguration_profilingGroupName :: Lens.Lens' GetNotificationConfiguration Prelude.Text
+getNotificationConfiguration_profilingGroupName = Lens.lens (\GetNotificationConfiguration' {profilingGroupName} -> profilingGroupName) (\s@GetNotificationConfiguration' {} a -> s {profilingGroupName = a} :: GetNotificationConfiguration)
+
+instance Core.AWSRequest GetNotificationConfiguration where
+  type
+    AWSResponse GetNotificationConfiguration =
+      GetNotificationConfigurationResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetNotificationConfigurationResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "notificationConfiguration")
+      )
+
+instance
+  Prelude.Hashable
+    GetNotificationConfiguration
+  where
+  hashWithSalt _salt GetNotificationConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData GetNotificationConfiguration where
+  rnf GetNotificationConfiguration' {..} =
+    Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders GetNotificationConfiguration where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetNotificationConfiguration where
+  toPath GetNotificationConfiguration' {..} =
+    Prelude.mconcat
+      [ "/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/notificationConfiguration"
+      ]
+
+instance Data.ToQuery GetNotificationConfiguration where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The structure representing the GetNotificationConfigurationResponse.
+--
+-- /See:/ 'newGetNotificationConfigurationResponse' smart constructor.
+data GetNotificationConfigurationResponse = GetNotificationConfigurationResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The current notification configuration for this profiling group.
+    notificationConfiguration :: NotificationConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetNotificationConfigurationResponse' 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:
+--
+-- 'httpStatus', 'getNotificationConfigurationResponse_httpStatus' - The response's http status code.
+--
+-- 'notificationConfiguration', 'getNotificationConfigurationResponse_notificationConfiguration' - The current notification configuration for this profiling group.
+newGetNotificationConfigurationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'notificationConfiguration'
+  NotificationConfiguration ->
+  GetNotificationConfigurationResponse
+newGetNotificationConfigurationResponse
+  pHttpStatus_
+  pNotificationConfiguration_ =
+    GetNotificationConfigurationResponse'
+      { httpStatus =
+          pHttpStatus_,
+        notificationConfiguration =
+          pNotificationConfiguration_
+      }
+
+-- | The response's http status code.
+getNotificationConfigurationResponse_httpStatus :: Lens.Lens' GetNotificationConfigurationResponse Prelude.Int
+getNotificationConfigurationResponse_httpStatus = Lens.lens (\GetNotificationConfigurationResponse' {httpStatus} -> httpStatus) (\s@GetNotificationConfigurationResponse' {} a -> s {httpStatus = a} :: GetNotificationConfigurationResponse)
+
+-- | The current notification configuration for this profiling group.
+getNotificationConfigurationResponse_notificationConfiguration :: Lens.Lens' GetNotificationConfigurationResponse NotificationConfiguration
+getNotificationConfigurationResponse_notificationConfiguration = Lens.lens (\GetNotificationConfigurationResponse' {notificationConfiguration} -> notificationConfiguration) (\s@GetNotificationConfigurationResponse' {} a -> s {notificationConfiguration = a} :: GetNotificationConfigurationResponse)
+
+instance
+  Prelude.NFData
+    GetNotificationConfigurationResponse
+  where
+  rnf GetNotificationConfigurationResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf notificationConfiguration
diff --git a/gen/Amazonka/CodeGuruProfiler/GetPolicy.hs b/gen/Amazonka/CodeGuruProfiler/GetPolicy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/GetPolicy.hs
@@ -0,0 +1,188 @@
+{-# 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.CodeGuruProfiler.GetPolicy
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the JSON-formatted resource-based policy on a profiling group.
+module Amazonka.CodeGuruProfiler.GetPolicy
+  ( -- * Creating a Request
+    GetPolicy (..),
+    newGetPolicy,
+
+    -- * Request Lenses
+    getPolicy_profilingGroupName,
+
+    -- * Destructuring the Response
+    GetPolicyResponse (..),
+    newGetPolicyResponse,
+
+    -- * Response Lenses
+    getPolicyResponse_httpStatus,
+    getPolicyResponse_policy,
+    getPolicyResponse_revisionId,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the @getPolicyRequest@.
+--
+-- /See:/ 'newGetPolicy' smart constructor.
+data GetPolicy = GetPolicy'
+  { -- | The name of the profiling group.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPolicy' 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:
+--
+-- 'profilingGroupName', 'getPolicy_profilingGroupName' - The name of the profiling group.
+newGetPolicy ::
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  GetPolicy
+newGetPolicy pProfilingGroupName_ =
+  GetPolicy'
+    { profilingGroupName =
+        pProfilingGroupName_
+    }
+
+-- | The name of the profiling group.
+getPolicy_profilingGroupName :: Lens.Lens' GetPolicy Prelude.Text
+getPolicy_profilingGroupName = Lens.lens (\GetPolicy' {profilingGroupName} -> profilingGroupName) (\s@GetPolicy' {} a -> s {profilingGroupName = a} :: GetPolicy)
+
+instance Core.AWSRequest GetPolicy where
+  type AWSResponse GetPolicy = GetPolicyResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetPolicyResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "policy")
+            Prelude.<*> (x Data..:> "revisionId")
+      )
+
+instance Prelude.Hashable GetPolicy where
+  hashWithSalt _salt GetPolicy' {..} =
+    _salt `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData GetPolicy where
+  rnf GetPolicy' {..} = Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders GetPolicy where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetPolicy where
+  toPath GetPolicy' {..} =
+    Prelude.mconcat
+      [ "/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/policy"
+      ]
+
+instance Data.ToQuery GetPolicy where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The structure representing the @getPolicyResponse@.
+--
+-- /See:/ 'newGetPolicyResponse' smart constructor.
+data GetPolicyResponse = GetPolicyResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The JSON-formatted resource-based policy attached to the
+    -- @ProfilingGroup@.
+    policy :: Prelude.Text,
+    -- | A unique identifier for the current revision of the returned policy.
+    revisionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetPolicyResponse' 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:
+--
+-- 'httpStatus', 'getPolicyResponse_httpStatus' - The response's http status code.
+--
+-- 'policy', 'getPolicyResponse_policy' - The JSON-formatted resource-based policy attached to the
+-- @ProfilingGroup@.
+--
+-- 'revisionId', 'getPolicyResponse_revisionId' - A unique identifier for the current revision of the returned policy.
+newGetPolicyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'policy'
+  Prelude.Text ->
+  -- | 'revisionId'
+  Prelude.Text ->
+  GetPolicyResponse
+newGetPolicyResponse
+  pHttpStatus_
+  pPolicy_
+  pRevisionId_ =
+    GetPolicyResponse'
+      { httpStatus = pHttpStatus_,
+        policy = pPolicy_,
+        revisionId = pRevisionId_
+      }
+
+-- | The response's http status code.
+getPolicyResponse_httpStatus :: Lens.Lens' GetPolicyResponse Prelude.Int
+getPolicyResponse_httpStatus = Lens.lens (\GetPolicyResponse' {httpStatus} -> httpStatus) (\s@GetPolicyResponse' {} a -> s {httpStatus = a} :: GetPolicyResponse)
+
+-- | The JSON-formatted resource-based policy attached to the
+-- @ProfilingGroup@.
+getPolicyResponse_policy :: Lens.Lens' GetPolicyResponse Prelude.Text
+getPolicyResponse_policy = Lens.lens (\GetPolicyResponse' {policy} -> policy) (\s@GetPolicyResponse' {} a -> s {policy = a} :: GetPolicyResponse)
+
+-- | A unique identifier for the current revision of the returned policy.
+getPolicyResponse_revisionId :: Lens.Lens' GetPolicyResponse Prelude.Text
+getPolicyResponse_revisionId = Lens.lens (\GetPolicyResponse' {revisionId} -> revisionId) (\s@GetPolicyResponse' {} a -> s {revisionId = a} :: GetPolicyResponse)
+
+instance Prelude.NFData GetPolicyResponse where
+  rnf GetPolicyResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf policy
+      `Prelude.seq` Prelude.rnf revisionId
diff --git a/gen/Amazonka/CodeGuruProfiler/GetProfile.hs b/gen/Amazonka/CodeGuruProfiler/GetProfile.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/GetProfile.hs
@@ -0,0 +1,332 @@
+{-# 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.CodeGuruProfiler.GetProfile
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the aggregated profile of a profiling group for a specified time
+-- range. Amazon CodeGuru Profiler collects posted agent profiles for a
+-- profiling group into aggregated profiles.
+--
+-- >  <note> <p> Because aggregated profiles expire over time <code>GetProfile</code> is not idempotent. </p> </note> <p> Specify the time range for the requested aggregated profile using 1 or 2 of the following parameters: <code>startTime</code>, <code>endTime</code>, <code>period</code>. The maximum time range allowed is 7 days. If you specify all 3 parameters, an exception is thrown. If you specify only <code>period</code>, the latest aggregated profile is returned. </p> <p> Aggregated profiles are available with aggregation periods of 5 minutes, 1 hour, and 1 day, aligned to UTC. The aggregation period of an aggregated profile determines how long it is retained. For more information, see <a href="https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AggregatedProfileTime.html"> <code>AggregatedProfileTime</code> </a>. The aggregated profile's aggregation period determines how long it is retained by CodeGuru Profiler. </p> <ul> <li> <p> If the aggregation period is 5 minutes, the aggregated profile is retained for 15 days. </p> </li> <li> <p> If the aggregation period is 1 hour, the aggregated profile is retained for 60 days. </p> </li> <li> <p> If the aggregation period is 1 day, the aggregated profile is retained for 3 years. </p> </li> </ul> <p>There are two use cases for calling <code>GetProfile</code>.</p> <ol> <li> <p> If you want to return an aggregated profile that already exists, use <a href="https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ListProfileTimes.html"> <code>ListProfileTimes</code> </a> to view the time ranges of existing aggregated profiles. Use them in a <code>GetProfile</code> request to return a specific, existing aggregated profile. </p> </li> <li> <p> If you want to return an aggregated profile for a time range that doesn't align with an existing aggregated profile, then CodeGuru Profiler makes a best effort to combine existing aggregated profiles from the requested time range and return them as one aggregated profile. </p> <p> If aggregated profiles do not exist for the full time range requested, then aggregated profiles for a smaller time range are returned. For example, if the requested time range is from 00:00 to 00:20, and the existing aggregated profiles are from 00:15 and 00:25, then the aggregated profiles from 00:15 to 00:20 are returned. </p> </li> </ol>
+module Amazonka.CodeGuruProfiler.GetProfile
+  ( -- * Creating a Request
+    GetProfile (..),
+    newGetProfile,
+
+    -- * Request Lenses
+    getProfile_accept,
+    getProfile_endTime,
+    getProfile_maxDepth,
+    getProfile_period,
+    getProfile_startTime,
+    getProfile_profilingGroupName,
+
+    -- * Destructuring the Response
+    GetProfileResponse (..),
+    newGetProfileResponse,
+
+    -- * Response Lenses
+    getProfileResponse_contentEncoding,
+    getProfileResponse_httpStatus,
+    getProfileResponse_contentType,
+    getProfileResponse_profile,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the getProfileRequest.
+--
+-- /See:/ 'newGetProfile' smart constructor.
+data GetProfile = GetProfile'
+  { -- | The format of the returned profiling data. The format maps to the
+    -- @Accept@ and @Content-Type@ headers of the HTTP request. You can specify
+    -- one of the following: or the default .
+    --
+    -- >  <ul> <li> <p> <code>application/json</code> — standard JSON format </p> </li> <li> <p> <code>application/x-amzn-ion</code> — the Amazon Ion data format. For more information, see <a href="http://amzn.github.io/ion-docs/">Amazon Ion</a>. </p> </li> </ul>
+    accept :: Prelude.Maybe Prelude.Text,
+    -- | The end time of the requested profile. Specify using the ISO 8601
+    -- format. For example, 2020-06-01T13:15:02.001Z represents 1 millisecond
+    -- past June 1, 2020 1:15:02 PM UTC.
+    --
+    -- If you specify @endTime@, then you must also specify @period@ or
+    -- @startTime@, but not both.
+    endTime :: Prelude.Maybe Data.ISO8601,
+    -- | The maximum depth of the stacks in the code that is represented in the
+    -- aggregated profile. For example, if CodeGuru Profiler finds a method
+    -- @A@, which calls method @B@, which calls method @C@, which calls method
+    -- @D@, then the depth is 4. If the @maxDepth@ is set to 2, then the
+    -- aggregated profile contains representations of methods @A@ and @B@.
+    maxDepth :: Prelude.Maybe Prelude.Natural,
+    -- | Used with @startTime@ or @endTime@ to specify the time range for the
+    -- returned aggregated profile. Specify using the ISO 8601 format. For
+    -- example, @P1DT1H1M1S@.
+    --
+    -- >  <p> To get the latest aggregated profile, specify only <code>period</code>. </p>
+    period :: Prelude.Maybe Prelude.Text,
+    -- | The start time of the profile to get. Specify using the ISO 8601 format.
+    -- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+    -- 1, 2020 1:15:02 PM UTC.
+    --
+    -- >  <p> If you specify <code>startTime</code>, then you must also specify <code>period</code> or <code>endTime</code>, but not both. </p>
+    startTime :: Prelude.Maybe Data.ISO8601,
+    -- | The name of the profiling group to get.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetProfile' 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:
+--
+-- 'accept', 'getProfile_accept' - The format of the returned profiling data. The format maps to the
+-- @Accept@ and @Content-Type@ headers of the HTTP request. You can specify
+-- one of the following: or the default .
+--
+-- >  <ul> <li> <p> <code>application/json</code> — standard JSON format </p> </li> <li> <p> <code>application/x-amzn-ion</code> — the Amazon Ion data format. For more information, see <a href="http://amzn.github.io/ion-docs/">Amazon Ion</a>. </p> </li> </ul>
+--
+-- 'endTime', 'getProfile_endTime' - The end time of the requested profile. Specify using the ISO 8601
+-- format. For example, 2020-06-01T13:15:02.001Z represents 1 millisecond
+-- past June 1, 2020 1:15:02 PM UTC.
+--
+-- If you specify @endTime@, then you must also specify @period@ or
+-- @startTime@, but not both.
+--
+-- 'maxDepth', 'getProfile_maxDepth' - The maximum depth of the stacks in the code that is represented in the
+-- aggregated profile. For example, if CodeGuru Profiler finds a method
+-- @A@, which calls method @B@, which calls method @C@, which calls method
+-- @D@, then the depth is 4. If the @maxDepth@ is set to 2, then the
+-- aggregated profile contains representations of methods @A@ and @B@.
+--
+-- 'period', 'getProfile_period' - Used with @startTime@ or @endTime@ to specify the time range for the
+-- returned aggregated profile. Specify using the ISO 8601 format. For
+-- example, @P1DT1H1M1S@.
+--
+-- >  <p> To get the latest aggregated profile, specify only <code>period</code>. </p>
+--
+-- 'startTime', 'getProfile_startTime' - The start time of the profile to get. Specify using the ISO 8601 format.
+-- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+-- 1, 2020 1:15:02 PM UTC.
+--
+-- >  <p> If you specify <code>startTime</code>, then you must also specify <code>period</code> or <code>endTime</code>, but not both. </p>
+--
+-- 'profilingGroupName', 'getProfile_profilingGroupName' - The name of the profiling group to get.
+newGetProfile ::
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  GetProfile
+newGetProfile pProfilingGroupName_ =
+  GetProfile'
+    { accept = Prelude.Nothing,
+      endTime = Prelude.Nothing,
+      maxDepth = Prelude.Nothing,
+      period = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      profilingGroupName = pProfilingGroupName_
+    }
+
+-- | The format of the returned profiling data. The format maps to the
+-- @Accept@ and @Content-Type@ headers of the HTTP request. You can specify
+-- one of the following: or the default .
+--
+-- >  <ul> <li> <p> <code>application/json</code> — standard JSON format </p> </li> <li> <p> <code>application/x-amzn-ion</code> — the Amazon Ion data format. For more information, see <a href="http://amzn.github.io/ion-docs/">Amazon Ion</a>. </p> </li> </ul>
+getProfile_accept :: Lens.Lens' GetProfile (Prelude.Maybe Prelude.Text)
+getProfile_accept = Lens.lens (\GetProfile' {accept} -> accept) (\s@GetProfile' {} a -> s {accept = a} :: GetProfile)
+
+-- | The end time of the requested profile. Specify using the ISO 8601
+-- format. For example, 2020-06-01T13:15:02.001Z represents 1 millisecond
+-- past June 1, 2020 1:15:02 PM UTC.
+--
+-- If you specify @endTime@, then you must also specify @period@ or
+-- @startTime@, but not both.
+getProfile_endTime :: Lens.Lens' GetProfile (Prelude.Maybe Prelude.UTCTime)
+getProfile_endTime = Lens.lens (\GetProfile' {endTime} -> endTime) (\s@GetProfile' {} a -> s {endTime = a} :: GetProfile) Prelude.. Lens.mapping Data._Time
+
+-- | The maximum depth of the stacks in the code that is represented in the
+-- aggregated profile. For example, if CodeGuru Profiler finds a method
+-- @A@, which calls method @B@, which calls method @C@, which calls method
+-- @D@, then the depth is 4. If the @maxDepth@ is set to 2, then the
+-- aggregated profile contains representations of methods @A@ and @B@.
+getProfile_maxDepth :: Lens.Lens' GetProfile (Prelude.Maybe Prelude.Natural)
+getProfile_maxDepth = Lens.lens (\GetProfile' {maxDepth} -> maxDepth) (\s@GetProfile' {} a -> s {maxDepth = a} :: GetProfile)
+
+-- | Used with @startTime@ or @endTime@ to specify the time range for the
+-- returned aggregated profile. Specify using the ISO 8601 format. For
+-- example, @P1DT1H1M1S@.
+--
+-- >  <p> To get the latest aggregated profile, specify only <code>period</code>. </p>
+getProfile_period :: Lens.Lens' GetProfile (Prelude.Maybe Prelude.Text)
+getProfile_period = Lens.lens (\GetProfile' {period} -> period) (\s@GetProfile' {} a -> s {period = a} :: GetProfile)
+
+-- | The start time of the profile to get. Specify using the ISO 8601 format.
+-- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+-- 1, 2020 1:15:02 PM UTC.
+--
+-- >  <p> If you specify <code>startTime</code>, then you must also specify <code>period</code> or <code>endTime</code>, but not both. </p>
+getProfile_startTime :: Lens.Lens' GetProfile (Prelude.Maybe Prelude.UTCTime)
+getProfile_startTime = Lens.lens (\GetProfile' {startTime} -> startTime) (\s@GetProfile' {} a -> s {startTime = a} :: GetProfile) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the profiling group to get.
+getProfile_profilingGroupName :: Lens.Lens' GetProfile Prelude.Text
+getProfile_profilingGroupName = Lens.lens (\GetProfile' {profilingGroupName} -> profilingGroupName) (\s@GetProfile' {} a -> s {profilingGroupName = a} :: GetProfile)
+
+instance Core.AWSRequest GetProfile where
+  type AWSResponse GetProfile = GetProfileResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveBytes
+      ( \s h x ->
+          GetProfileResponse'
+            Prelude.<$> (h Data..#? "Content-Encoding")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (h Data..# "Content-Type")
+            Prelude.<*> (Prelude.pure x)
+      )
+
+instance Prelude.Hashable GetProfile where
+  hashWithSalt _salt GetProfile' {..} =
+    _salt
+      `Prelude.hashWithSalt` accept
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` maxDepth
+      `Prelude.hashWithSalt` period
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData GetProfile where
+  rnf GetProfile' {..} =
+    Prelude.rnf accept
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf maxDepth
+      `Prelude.seq` Prelude.rnf period
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders GetProfile where
+  toHeaders GetProfile' {..} =
+    Prelude.mconcat
+      [ "Accept" Data.=# accept,
+        "Content-Type"
+          Data.=# ("application/x-amz-json-1.1" :: Prelude.ByteString)
+      ]
+
+instance Data.ToPath GetProfile where
+  toPath GetProfile' {..} =
+    Prelude.mconcat
+      [ "/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/profile"
+      ]
+
+instance Data.ToQuery GetProfile where
+  toQuery GetProfile' {..} =
+    Prelude.mconcat
+      [ "endTime" Data.=: endTime,
+        "maxDepth" Data.=: maxDepth,
+        "period" Data.=: period,
+        "startTime" Data.=: startTime
+      ]
+
+-- | The structure representing the getProfileResponse.
+--
+-- /See:/ 'newGetProfileResponse' smart constructor.
+data GetProfileResponse = GetProfileResponse'
+  { -- | The content encoding of the profile.
+    contentEncoding :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The content type of the profile in the payload. It is either
+    -- @application\/json@ or the default @application\/x-amzn-ion@.
+    contentType :: Prelude.Text,
+    -- | Information about the profile.
+    profile :: Prelude.ByteString
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetProfileResponse' 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:
+--
+-- 'contentEncoding', 'getProfileResponse_contentEncoding' - The content encoding of the profile.
+--
+-- 'httpStatus', 'getProfileResponse_httpStatus' - The response's http status code.
+--
+-- 'contentType', 'getProfileResponse_contentType' - The content type of the profile in the payload. It is either
+-- @application\/json@ or the default @application\/x-amzn-ion@.
+--
+-- 'profile', 'getProfileResponse_profile' - Information about the profile.
+newGetProfileResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'contentType'
+  Prelude.Text ->
+  -- | 'profile'
+  Prelude.ByteString ->
+  GetProfileResponse
+newGetProfileResponse
+  pHttpStatus_
+  pContentType_
+  pProfile_ =
+    GetProfileResponse'
+      { contentEncoding =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        contentType = pContentType_,
+        profile = pProfile_
+      }
+
+-- | The content encoding of the profile.
+getProfileResponse_contentEncoding :: Lens.Lens' GetProfileResponse (Prelude.Maybe Prelude.Text)
+getProfileResponse_contentEncoding = Lens.lens (\GetProfileResponse' {contentEncoding} -> contentEncoding) (\s@GetProfileResponse' {} a -> s {contentEncoding = a} :: GetProfileResponse)
+
+-- | The response's http status code.
+getProfileResponse_httpStatus :: Lens.Lens' GetProfileResponse Prelude.Int
+getProfileResponse_httpStatus = Lens.lens (\GetProfileResponse' {httpStatus} -> httpStatus) (\s@GetProfileResponse' {} a -> s {httpStatus = a} :: GetProfileResponse)
+
+-- | The content type of the profile in the payload. It is either
+-- @application\/json@ or the default @application\/x-amzn-ion@.
+getProfileResponse_contentType :: Lens.Lens' GetProfileResponse Prelude.Text
+getProfileResponse_contentType = Lens.lens (\GetProfileResponse' {contentType} -> contentType) (\s@GetProfileResponse' {} a -> s {contentType = a} :: GetProfileResponse)
+
+-- | Information about the profile.
+getProfileResponse_profile :: Lens.Lens' GetProfileResponse Prelude.ByteString
+getProfileResponse_profile = Lens.lens (\GetProfileResponse' {profile} -> profile) (\s@GetProfileResponse' {} a -> s {profile = a} :: GetProfileResponse)
+
+instance Prelude.NFData GetProfileResponse where
+  rnf GetProfileResponse' {..} =
+    Prelude.rnf contentEncoding
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf contentType
+      `Prelude.seq` Prelude.rnf profile
diff --git a/gen/Amazonka/CodeGuruProfiler/GetRecommendations.hs b/gen/Amazonka/CodeGuruProfiler/GetRecommendations.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/GetRecommendations.hs
@@ -0,0 +1,392 @@
+{-# 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.CodeGuruProfiler.GetRecommendations
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_Recommendation.html Recommendation>
+-- objects that contain recommendations for a profiling group for a given
+-- time period. A list of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_Anomaly.html Anomaly>
+-- objects that contains details about anomalies detected in the profiling
+-- group for the same time period is also returned.
+module Amazonka.CodeGuruProfiler.GetRecommendations
+  ( -- * Creating a Request
+    GetRecommendations (..),
+    newGetRecommendations,
+
+    -- * Request Lenses
+    getRecommendations_locale,
+    getRecommendations_endTime,
+    getRecommendations_profilingGroupName,
+    getRecommendations_startTime,
+
+    -- * Destructuring the Response
+    GetRecommendationsResponse (..),
+    newGetRecommendationsResponse,
+
+    -- * Response Lenses
+    getRecommendationsResponse_httpStatus,
+    getRecommendationsResponse_anomalies,
+    getRecommendationsResponse_profileEndTime,
+    getRecommendationsResponse_profileStartTime,
+    getRecommendationsResponse_profilingGroupName,
+    getRecommendationsResponse_recommendations,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the GetRecommendationsRequest.
+--
+-- /See:/ 'newGetRecommendations' smart constructor.
+data GetRecommendations = GetRecommendations'
+  { -- | The language used to provide analysis. Specify using a string that is
+    -- one of the following @BCP 47@ language codes.
+    --
+    -- -   @de-DE@ - German, Germany
+    --
+    -- -   @en-GB@ - English, United Kingdom
+    --
+    -- -   @en-US@ - English, United States
+    --
+    -- -   @es-ES@ - Spanish, Spain
+    --
+    -- -   @fr-FR@ - French, France
+    --
+    -- -   @it-IT@ - Italian, Italy
+    --
+    -- -   @ja-JP@ - Japanese, Japan
+    --
+    -- -   @ko-KR@ - Korean, Republic of Korea
+    --
+    -- -   @pt-BR@ - Portugese, Brazil
+    --
+    -- -   @zh-CN@ - Chinese, China
+    --
+    -- -   @zh-TW@ - Chinese, Taiwan
+    locale :: Prelude.Maybe Prelude.Text,
+    -- | The start time of the profile to get analysis data about. You must
+    -- specify @startTime@ and @endTime@. This is specified using the ISO 8601
+    -- format. For example, 2020-06-01T13:15:02.001Z represents 1 millisecond
+    -- past June 1, 2020 1:15:02 PM UTC.
+    endTime :: Data.ISO8601,
+    -- | The name of the profiling group to get analysis data about.
+    profilingGroupName :: Prelude.Text,
+    -- | The end time of the profile to get analysis data about. You must specify
+    -- @startTime@ and @endTime@. This is specified using the ISO 8601 format.
+    -- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+    -- 1, 2020 1:15:02 PM UTC.
+    startTime :: Data.ISO8601
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRecommendations' 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:
+--
+-- 'locale', 'getRecommendations_locale' - The language used to provide analysis. Specify using a string that is
+-- one of the following @BCP 47@ language codes.
+--
+-- -   @de-DE@ - German, Germany
+--
+-- -   @en-GB@ - English, United Kingdom
+--
+-- -   @en-US@ - English, United States
+--
+-- -   @es-ES@ - Spanish, Spain
+--
+-- -   @fr-FR@ - French, France
+--
+-- -   @it-IT@ - Italian, Italy
+--
+-- -   @ja-JP@ - Japanese, Japan
+--
+-- -   @ko-KR@ - Korean, Republic of Korea
+--
+-- -   @pt-BR@ - Portugese, Brazil
+--
+-- -   @zh-CN@ - Chinese, China
+--
+-- -   @zh-TW@ - Chinese, Taiwan
+--
+-- 'endTime', 'getRecommendations_endTime' - The start time of the profile to get analysis data about. You must
+-- specify @startTime@ and @endTime@. This is specified using the ISO 8601
+-- format. For example, 2020-06-01T13:15:02.001Z represents 1 millisecond
+-- past June 1, 2020 1:15:02 PM UTC.
+--
+-- 'profilingGroupName', 'getRecommendations_profilingGroupName' - The name of the profiling group to get analysis data about.
+--
+-- 'startTime', 'getRecommendations_startTime' - The end time of the profile to get analysis data about. You must specify
+-- @startTime@ and @endTime@. This is specified using the ISO 8601 format.
+-- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+-- 1, 2020 1:15:02 PM UTC.
+newGetRecommendations ::
+  -- | 'endTime'
+  Prelude.UTCTime ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  GetRecommendations
+newGetRecommendations
+  pEndTime_
+  pProfilingGroupName_
+  pStartTime_ =
+    GetRecommendations'
+      { locale = Prelude.Nothing,
+        endTime = Data._Time Lens.# pEndTime_,
+        profilingGroupName = pProfilingGroupName_,
+        startTime = Data._Time Lens.# pStartTime_
+      }
+
+-- | The language used to provide analysis. Specify using a string that is
+-- one of the following @BCP 47@ language codes.
+--
+-- -   @de-DE@ - German, Germany
+--
+-- -   @en-GB@ - English, United Kingdom
+--
+-- -   @en-US@ - English, United States
+--
+-- -   @es-ES@ - Spanish, Spain
+--
+-- -   @fr-FR@ - French, France
+--
+-- -   @it-IT@ - Italian, Italy
+--
+-- -   @ja-JP@ - Japanese, Japan
+--
+-- -   @ko-KR@ - Korean, Republic of Korea
+--
+-- -   @pt-BR@ - Portugese, Brazil
+--
+-- -   @zh-CN@ - Chinese, China
+--
+-- -   @zh-TW@ - Chinese, Taiwan
+getRecommendations_locale :: Lens.Lens' GetRecommendations (Prelude.Maybe Prelude.Text)
+getRecommendations_locale = Lens.lens (\GetRecommendations' {locale} -> locale) (\s@GetRecommendations' {} a -> s {locale = a} :: GetRecommendations)
+
+-- | The start time of the profile to get analysis data about. You must
+-- specify @startTime@ and @endTime@. This is specified using the ISO 8601
+-- format. For example, 2020-06-01T13:15:02.001Z represents 1 millisecond
+-- past June 1, 2020 1:15:02 PM UTC.
+getRecommendations_endTime :: Lens.Lens' GetRecommendations Prelude.UTCTime
+getRecommendations_endTime = Lens.lens (\GetRecommendations' {endTime} -> endTime) (\s@GetRecommendations' {} a -> s {endTime = a} :: GetRecommendations) Prelude.. Data._Time
+
+-- | The name of the profiling group to get analysis data about.
+getRecommendations_profilingGroupName :: Lens.Lens' GetRecommendations Prelude.Text
+getRecommendations_profilingGroupName = Lens.lens (\GetRecommendations' {profilingGroupName} -> profilingGroupName) (\s@GetRecommendations' {} a -> s {profilingGroupName = a} :: GetRecommendations)
+
+-- | The end time of the profile to get analysis data about. You must specify
+-- @startTime@ and @endTime@. This is specified using the ISO 8601 format.
+-- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+-- 1, 2020 1:15:02 PM UTC.
+getRecommendations_startTime :: Lens.Lens' GetRecommendations Prelude.UTCTime
+getRecommendations_startTime = Lens.lens (\GetRecommendations' {startTime} -> startTime) (\s@GetRecommendations' {} a -> s {startTime = a} :: GetRecommendations) Prelude.. Data._Time
+
+instance Core.AWSRequest GetRecommendations where
+  type
+    AWSResponse GetRecommendations =
+      GetRecommendationsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetRecommendationsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "anomalies" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..:> "profileEndTime")
+            Prelude.<*> (x Data..:> "profileStartTime")
+            Prelude.<*> (x Data..:> "profilingGroupName")
+            Prelude.<*> ( x
+                            Data..?> "recommendations"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable GetRecommendations where
+  hashWithSalt _salt GetRecommendations' {..} =
+    _salt
+      `Prelude.hashWithSalt` locale
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` profilingGroupName
+      `Prelude.hashWithSalt` startTime
+
+instance Prelude.NFData GetRecommendations where
+  rnf GetRecommendations' {..} =
+    Prelude.rnf locale
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf profilingGroupName
+      `Prelude.seq` Prelude.rnf startTime
+
+instance Data.ToHeaders GetRecommendations where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetRecommendations where
+  toPath GetRecommendations' {..} =
+    Prelude.mconcat
+      [ "/internal/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/recommendations"
+      ]
+
+instance Data.ToQuery GetRecommendations where
+  toQuery GetRecommendations' {..} =
+    Prelude.mconcat
+      [ "locale" Data.=: locale,
+        "endTime" Data.=: endTime,
+        "startTime" Data.=: startTime
+      ]
+
+-- | The structure representing the GetRecommendationsResponse.
+--
+-- /See:/ 'newGetRecommendationsResponse' smart constructor.
+data GetRecommendationsResponse = GetRecommendationsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of anomalies that the analysis has found for this profile.
+    anomalies :: [Anomaly],
+    -- | The end time of the profile the analysis data is about. This is
+    -- specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    profileEndTime :: Data.ISO8601,
+    -- | The start time of the profile the analysis data is about. This is
+    -- specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    profileStartTime :: Data.ISO8601,
+    -- | The name of the profiling group the analysis data is about.
+    profilingGroupName :: Prelude.Text,
+    -- | The list of recommendations that the analysis found for this profile.
+    recommendations :: [Recommendation]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetRecommendationsResponse' 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:
+--
+-- 'httpStatus', 'getRecommendationsResponse_httpStatus' - The response's http status code.
+--
+-- 'anomalies', 'getRecommendationsResponse_anomalies' - The list of anomalies that the analysis has found for this profile.
+--
+-- 'profileEndTime', 'getRecommendationsResponse_profileEndTime' - The end time of the profile the analysis data is about. This is
+-- specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+--
+-- 'profileStartTime', 'getRecommendationsResponse_profileStartTime' - The start time of the profile the analysis data is about. This is
+-- specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+--
+-- 'profilingGroupName', 'getRecommendationsResponse_profilingGroupName' - The name of the profiling group the analysis data is about.
+--
+-- 'recommendations', 'getRecommendationsResponse_recommendations' - The list of recommendations that the analysis found for this profile.
+newGetRecommendationsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'profileEndTime'
+  Prelude.UTCTime ->
+  -- | 'profileStartTime'
+  Prelude.UTCTime ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  GetRecommendationsResponse
+newGetRecommendationsResponse
+  pHttpStatus_
+  pProfileEndTime_
+  pProfileStartTime_
+  pProfilingGroupName_ =
+    GetRecommendationsResponse'
+      { httpStatus =
+          pHttpStatus_,
+        anomalies = Prelude.mempty,
+        profileEndTime =
+          Data._Time Lens.# pProfileEndTime_,
+        profileStartTime =
+          Data._Time Lens.# pProfileStartTime_,
+        profilingGroupName = pProfilingGroupName_,
+        recommendations = Prelude.mempty
+      }
+
+-- | The response's http status code.
+getRecommendationsResponse_httpStatus :: Lens.Lens' GetRecommendationsResponse Prelude.Int
+getRecommendationsResponse_httpStatus = Lens.lens (\GetRecommendationsResponse' {httpStatus} -> httpStatus) (\s@GetRecommendationsResponse' {} a -> s {httpStatus = a} :: GetRecommendationsResponse)
+
+-- | The list of anomalies that the analysis has found for this profile.
+getRecommendationsResponse_anomalies :: Lens.Lens' GetRecommendationsResponse [Anomaly]
+getRecommendationsResponse_anomalies = Lens.lens (\GetRecommendationsResponse' {anomalies} -> anomalies) (\s@GetRecommendationsResponse' {} a -> s {anomalies = a} :: GetRecommendationsResponse) Prelude.. Lens.coerced
+
+-- | The end time of the profile the analysis data is about. This is
+-- specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+getRecommendationsResponse_profileEndTime :: Lens.Lens' GetRecommendationsResponse Prelude.UTCTime
+getRecommendationsResponse_profileEndTime = Lens.lens (\GetRecommendationsResponse' {profileEndTime} -> profileEndTime) (\s@GetRecommendationsResponse' {} a -> s {profileEndTime = a} :: GetRecommendationsResponse) Prelude.. Data._Time
+
+-- | The start time of the profile the analysis data is about. This is
+-- specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+getRecommendationsResponse_profileStartTime :: Lens.Lens' GetRecommendationsResponse Prelude.UTCTime
+getRecommendationsResponse_profileStartTime = Lens.lens (\GetRecommendationsResponse' {profileStartTime} -> profileStartTime) (\s@GetRecommendationsResponse' {} a -> s {profileStartTime = a} :: GetRecommendationsResponse) Prelude.. Data._Time
+
+-- | The name of the profiling group the analysis data is about.
+getRecommendationsResponse_profilingGroupName :: Lens.Lens' GetRecommendationsResponse Prelude.Text
+getRecommendationsResponse_profilingGroupName = Lens.lens (\GetRecommendationsResponse' {profilingGroupName} -> profilingGroupName) (\s@GetRecommendationsResponse' {} a -> s {profilingGroupName = a} :: GetRecommendationsResponse)
+
+-- | The list of recommendations that the analysis found for this profile.
+getRecommendationsResponse_recommendations :: Lens.Lens' GetRecommendationsResponse [Recommendation]
+getRecommendationsResponse_recommendations = Lens.lens (\GetRecommendationsResponse' {recommendations} -> recommendations) (\s@GetRecommendationsResponse' {} a -> s {recommendations = a} :: GetRecommendationsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData GetRecommendationsResponse where
+  rnf GetRecommendationsResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf anomalies
+      `Prelude.seq` Prelude.rnf profileEndTime
+      `Prelude.seq` Prelude.rnf profileStartTime
+      `Prelude.seq` Prelude.rnf profilingGroupName
+      `Prelude.seq` Prelude.rnf recommendations
diff --git a/gen/Amazonka/CodeGuruProfiler/Lens.hs b/gen/Amazonka/CodeGuruProfiler/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Lens.hs
@@ -0,0 +1,339 @@
+{-# 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.CodeGuruProfiler.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.CodeGuruProfiler.Lens
+  ( -- * Operations
+
+    -- ** AddNotificationChannels
+    addNotificationChannels_channels,
+    addNotificationChannels_profilingGroupName,
+    addNotificationChannelsResponse_notificationConfiguration,
+    addNotificationChannelsResponse_httpStatus,
+
+    -- ** BatchGetFrameMetricData
+    batchGetFrameMetricData_endTime,
+    batchGetFrameMetricData_frameMetrics,
+    batchGetFrameMetricData_period,
+    batchGetFrameMetricData_startTime,
+    batchGetFrameMetricData_targetResolution,
+    batchGetFrameMetricData_profilingGroupName,
+    batchGetFrameMetricDataResponse_httpStatus,
+    batchGetFrameMetricDataResponse_endTime,
+    batchGetFrameMetricDataResponse_endTimes,
+    batchGetFrameMetricDataResponse_frameMetricData,
+    batchGetFrameMetricDataResponse_resolution,
+    batchGetFrameMetricDataResponse_startTime,
+    batchGetFrameMetricDataResponse_unprocessedEndTimes,
+
+    -- ** ConfigureAgent
+    configureAgent_fleetInstanceId,
+    configureAgent_metadata,
+    configureAgent_profilingGroupName,
+    configureAgentResponse_httpStatus,
+    configureAgentResponse_configuration,
+
+    -- ** CreateProfilingGroup
+    createProfilingGroup_agentOrchestrationConfig,
+    createProfilingGroup_computePlatform,
+    createProfilingGroup_tags,
+    createProfilingGroup_clientToken,
+    createProfilingGroup_profilingGroupName,
+    createProfilingGroupResponse_httpStatus,
+    createProfilingGroupResponse_profilingGroup,
+
+    -- ** DeleteProfilingGroup
+    deleteProfilingGroup_profilingGroupName,
+    deleteProfilingGroupResponse_httpStatus,
+
+    -- ** DescribeProfilingGroup
+    describeProfilingGroup_profilingGroupName,
+    describeProfilingGroupResponse_httpStatus,
+    describeProfilingGroupResponse_profilingGroup,
+
+    -- ** GetFindingsReportAccountSummary
+    getFindingsReportAccountSummary_dailyReportsOnly,
+    getFindingsReportAccountSummary_maxResults,
+    getFindingsReportAccountSummary_nextToken,
+    getFindingsReportAccountSummaryResponse_nextToken,
+    getFindingsReportAccountSummaryResponse_httpStatus,
+    getFindingsReportAccountSummaryResponse_reportSummaries,
+
+    -- ** GetNotificationConfiguration
+    getNotificationConfiguration_profilingGroupName,
+    getNotificationConfigurationResponse_httpStatus,
+    getNotificationConfigurationResponse_notificationConfiguration,
+
+    -- ** GetPolicy
+    getPolicy_profilingGroupName,
+    getPolicyResponse_httpStatus,
+    getPolicyResponse_policy,
+    getPolicyResponse_revisionId,
+
+    -- ** GetProfile
+    getProfile_accept,
+    getProfile_endTime,
+    getProfile_maxDepth,
+    getProfile_period,
+    getProfile_startTime,
+    getProfile_profilingGroupName,
+    getProfileResponse_contentEncoding,
+    getProfileResponse_httpStatus,
+    getProfileResponse_contentType,
+    getProfileResponse_profile,
+
+    -- ** GetRecommendations
+    getRecommendations_locale,
+    getRecommendations_endTime,
+    getRecommendations_profilingGroupName,
+    getRecommendations_startTime,
+    getRecommendationsResponse_httpStatus,
+    getRecommendationsResponse_anomalies,
+    getRecommendationsResponse_profileEndTime,
+    getRecommendationsResponse_profileStartTime,
+    getRecommendationsResponse_profilingGroupName,
+    getRecommendationsResponse_recommendations,
+
+    -- ** ListFindingsReports
+    listFindingsReports_dailyReportsOnly,
+    listFindingsReports_maxResults,
+    listFindingsReports_nextToken,
+    listFindingsReports_endTime,
+    listFindingsReports_profilingGroupName,
+    listFindingsReports_startTime,
+    listFindingsReportsResponse_nextToken,
+    listFindingsReportsResponse_httpStatus,
+    listFindingsReportsResponse_findingsReportSummaries,
+
+    -- ** ListProfileTimes
+    listProfileTimes_maxResults,
+    listProfileTimes_nextToken,
+    listProfileTimes_orderBy,
+    listProfileTimes_endTime,
+    listProfileTimes_period,
+    listProfileTimes_profilingGroupName,
+    listProfileTimes_startTime,
+    listProfileTimesResponse_nextToken,
+    listProfileTimesResponse_httpStatus,
+    listProfileTimesResponse_profileTimes,
+
+    -- ** ListProfilingGroups
+    listProfilingGroups_includeDescription,
+    listProfilingGroups_maxResults,
+    listProfilingGroups_nextToken,
+    listProfilingGroupsResponse_nextToken,
+    listProfilingGroupsResponse_profilingGroups,
+    listProfilingGroupsResponse_httpStatus,
+    listProfilingGroupsResponse_profilingGroupNames,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** PostAgentProfile
+    postAgentProfile_profileToken,
+    postAgentProfile_agentProfile,
+    postAgentProfile_contentType,
+    postAgentProfile_profilingGroupName,
+    postAgentProfileResponse_httpStatus,
+
+    -- ** PutPermission
+    putPermission_revisionId,
+    putPermission_actionGroup,
+    putPermission_principals,
+    putPermission_profilingGroupName,
+    putPermissionResponse_httpStatus,
+    putPermissionResponse_policy,
+    putPermissionResponse_revisionId,
+
+    -- ** RemoveNotificationChannel
+    removeNotificationChannel_channelId,
+    removeNotificationChannel_profilingGroupName,
+    removeNotificationChannelResponse_notificationConfiguration,
+    removeNotificationChannelResponse_httpStatus,
+
+    -- ** RemovePermission
+    removePermission_actionGroup,
+    removePermission_profilingGroupName,
+    removePermission_revisionId,
+    removePermissionResponse_httpStatus,
+    removePermissionResponse_policy,
+    removePermissionResponse_revisionId,
+
+    -- ** SubmitFeedback
+    submitFeedback_comment,
+    submitFeedback_anomalyInstanceId,
+    submitFeedback_profilingGroupName,
+    submitFeedback_type,
+    submitFeedbackResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateProfilingGroup
+    updateProfilingGroup_agentOrchestrationConfig,
+    updateProfilingGroup_profilingGroupName,
+    updateProfilingGroupResponse_httpStatus,
+    updateProfilingGroupResponse_profilingGroup,
+
+    -- * Types
+
+    -- ** AgentConfiguration
+    agentConfiguration_agentParameters,
+    agentConfiguration_periodInSeconds,
+    agentConfiguration_shouldProfile,
+
+    -- ** AgentOrchestrationConfig
+    agentOrchestrationConfig_profilingEnabled,
+
+    -- ** AggregatedProfileTime
+    aggregatedProfileTime_period,
+    aggregatedProfileTime_start,
+
+    -- ** Anomaly
+    anomaly_instances,
+    anomaly_metric,
+    anomaly_reason,
+
+    -- ** AnomalyInstance
+    anomalyInstance_endTime,
+    anomalyInstance_userFeedback,
+    anomalyInstance_id,
+    anomalyInstance_startTime,
+
+    -- ** Channel
+    channel_id,
+    channel_eventPublishers,
+    channel_uri,
+
+    -- ** FindingsReportSummary
+    findingsReportSummary_id,
+    findingsReportSummary_profileEndTime,
+    findingsReportSummary_profileStartTime,
+    findingsReportSummary_profilingGroupName,
+    findingsReportSummary_totalNumberOfFindings,
+
+    -- ** FrameMetric
+    frameMetric_frameName,
+    frameMetric_threadStates,
+    frameMetric_type,
+
+    -- ** FrameMetricDatum
+    frameMetricDatum_frameMetric,
+    frameMetricDatum_values,
+
+    -- ** Match
+    match_frameAddress,
+    match_targetFramesIndex,
+    match_thresholdBreachValue,
+
+    -- ** Metric
+    metric_frameName,
+    metric_threadStates,
+    metric_type,
+
+    -- ** NotificationConfiguration
+    notificationConfiguration_channels,
+
+    -- ** Pattern
+    pattern_countersToAggregate,
+    pattern_description,
+    pattern_id,
+    pattern_name,
+    pattern_resolutionSteps,
+    pattern_targetFrames,
+    pattern_thresholdPercent,
+
+    -- ** ProfileTime
+    profileTime_start,
+
+    -- ** ProfilingGroupDescription
+    profilingGroupDescription_agentOrchestrationConfig,
+    profilingGroupDescription_arn,
+    profilingGroupDescription_computePlatform,
+    profilingGroupDescription_createdAt,
+    profilingGroupDescription_name,
+    profilingGroupDescription_profilingStatus,
+    profilingGroupDescription_tags,
+    profilingGroupDescription_updatedAt,
+
+    -- ** ProfilingStatus
+    profilingStatus_latestAgentOrchestratedAt,
+    profilingStatus_latestAgentProfileReportedAt,
+    profilingStatus_latestAggregatedProfile,
+
+    -- ** Recommendation
+    recommendation_allMatchesCount,
+    recommendation_allMatchesSum,
+    recommendation_endTime,
+    recommendation_pattern,
+    recommendation_startTime,
+    recommendation_topMatches,
+
+    -- ** TimestampStructure
+    timestampStructure_value,
+
+    -- ** UserFeedback
+    userFeedback_type,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.AddNotificationChannels
+import Amazonka.CodeGuruProfiler.BatchGetFrameMetricData
+import Amazonka.CodeGuruProfiler.ConfigureAgent
+import Amazonka.CodeGuruProfiler.CreateProfilingGroup
+import Amazonka.CodeGuruProfiler.DeleteProfilingGroup
+import Amazonka.CodeGuruProfiler.DescribeProfilingGroup
+import Amazonka.CodeGuruProfiler.GetFindingsReportAccountSummary
+import Amazonka.CodeGuruProfiler.GetNotificationConfiguration
+import Amazonka.CodeGuruProfiler.GetPolicy
+import Amazonka.CodeGuruProfiler.GetProfile
+import Amazonka.CodeGuruProfiler.GetRecommendations
+import Amazonka.CodeGuruProfiler.ListFindingsReports
+import Amazonka.CodeGuruProfiler.ListProfileTimes
+import Amazonka.CodeGuruProfiler.ListProfilingGroups
+import Amazonka.CodeGuruProfiler.ListTagsForResource
+import Amazonka.CodeGuruProfiler.PostAgentProfile
+import Amazonka.CodeGuruProfiler.PutPermission
+import Amazonka.CodeGuruProfiler.RemoveNotificationChannel
+import Amazonka.CodeGuruProfiler.RemovePermission
+import Amazonka.CodeGuruProfiler.SubmitFeedback
+import Amazonka.CodeGuruProfiler.TagResource
+import Amazonka.CodeGuruProfiler.Types.AgentConfiguration
+import Amazonka.CodeGuruProfiler.Types.AgentOrchestrationConfig
+import Amazonka.CodeGuruProfiler.Types.AggregatedProfileTime
+import Amazonka.CodeGuruProfiler.Types.Anomaly
+import Amazonka.CodeGuruProfiler.Types.AnomalyInstance
+import Amazonka.CodeGuruProfiler.Types.Channel
+import Amazonka.CodeGuruProfiler.Types.FindingsReportSummary
+import Amazonka.CodeGuruProfiler.Types.FrameMetric
+import Amazonka.CodeGuruProfiler.Types.FrameMetricDatum
+import Amazonka.CodeGuruProfiler.Types.Match
+import Amazonka.CodeGuruProfiler.Types.Metric
+import Amazonka.CodeGuruProfiler.Types.NotificationConfiguration
+import Amazonka.CodeGuruProfiler.Types.Pattern
+import Amazonka.CodeGuruProfiler.Types.ProfileTime
+import Amazonka.CodeGuruProfiler.Types.ProfilingGroupDescription
+import Amazonka.CodeGuruProfiler.Types.ProfilingStatus
+import Amazonka.CodeGuruProfiler.Types.Recommendation
+import Amazonka.CodeGuruProfiler.Types.TimestampStructure
+import Amazonka.CodeGuruProfiler.Types.UserFeedback
+import Amazonka.CodeGuruProfiler.UntagResource
+import Amazonka.CodeGuruProfiler.UpdateProfilingGroup
diff --git a/gen/Amazonka/CodeGuruProfiler/ListFindingsReports.hs b/gen/Amazonka/CodeGuruProfiler/ListFindingsReports.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/ListFindingsReports.hs
@@ -0,0 +1,332 @@
+{-# 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.CodeGuruProfiler.ListFindingsReports
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- List the available reports for a given profiling group and time range.
+module Amazonka.CodeGuruProfiler.ListFindingsReports
+  ( -- * Creating a Request
+    ListFindingsReports (..),
+    newListFindingsReports,
+
+    -- * Request Lenses
+    listFindingsReports_dailyReportsOnly,
+    listFindingsReports_maxResults,
+    listFindingsReports_nextToken,
+    listFindingsReports_endTime,
+    listFindingsReports_profilingGroupName,
+    listFindingsReports_startTime,
+
+    -- * Destructuring the Response
+    ListFindingsReportsResponse (..),
+    newListFindingsReportsResponse,
+
+    -- * Response Lenses
+    listFindingsReportsResponse_nextToken,
+    listFindingsReportsResponse_httpStatus,
+    listFindingsReportsResponse_findingsReportSummaries,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the ListFindingsReportsRequest.
+--
+-- /See:/ 'newListFindingsReports' smart constructor.
+data ListFindingsReports = ListFindingsReports'
+  { -- | A @Boolean@ value indicating whether to only return reports from daily
+    -- profiles. If set to @True@, only analysis data from daily profiles is
+    -- returned. If set to @False@, analysis data is returned from smaller time
+    -- windows (for example, one hour).
+    dailyReportsOnly :: Prelude.Maybe Prelude.Bool,
+    -- | The maximum number of report results returned by @ListFindingsReports@
+    -- in paginated output. When this parameter is used, @ListFindingsReports@
+    -- only returns @maxResults@ results in a single page along with a
+    -- @nextToken@ response element. The remaining results of the initial
+    -- request can be seen by sending another @ListFindingsReports@ request
+    -- with the returned @nextToken@ value.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @ListFindingsReportsRequest@ request where @maxResults@ was used and the
+    -- results exceeded the value of that parameter. Pagination continues from
+    -- the end of the previous results that returned the @nextToken@ value.
+    --
+    -- This token should be treated as an opaque identifier that is only used
+    -- to retrieve the next items in a list and not for other programmatic
+    -- purposes.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The end time of the profile to get analysis data about. You must specify
+    -- @startTime@ and @endTime@. This is specified using the ISO 8601 format.
+    -- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+    -- 1, 2020 1:15:02 PM UTC.
+    endTime :: Data.ISO8601,
+    -- | The name of the profiling group from which to search for analysis data.
+    profilingGroupName :: Prelude.Text,
+    -- | The start time of the profile to get analysis data about. You must
+    -- specify @startTime@ and @endTime@. This is specified using the ISO 8601
+    -- format. For example, 2020-06-01T13:15:02.001Z represents 1 millisecond
+    -- past June 1, 2020 1:15:02 PM UTC.
+    startTime :: Data.ISO8601
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListFindingsReports' 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:
+--
+-- 'dailyReportsOnly', 'listFindingsReports_dailyReportsOnly' - A @Boolean@ value indicating whether to only return reports from daily
+-- profiles. If set to @True@, only analysis data from daily profiles is
+-- returned. If set to @False@, analysis data is returned from smaller time
+-- windows (for example, one hour).
+--
+-- 'maxResults', 'listFindingsReports_maxResults' - The maximum number of report results returned by @ListFindingsReports@
+-- in paginated output. When this parameter is used, @ListFindingsReports@
+-- only returns @maxResults@ results in a single page along with a
+-- @nextToken@ response element. The remaining results of the initial
+-- request can be seen by sending another @ListFindingsReports@ request
+-- with the returned @nextToken@ value.
+--
+-- 'nextToken', 'listFindingsReports_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @ListFindingsReportsRequest@ request where @maxResults@ was used and the
+-- results exceeded the value of that parameter. Pagination continues from
+-- the end of the previous results that returned the @nextToken@ value.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+--
+-- 'endTime', 'listFindingsReports_endTime' - The end time of the profile to get analysis data about. You must specify
+-- @startTime@ and @endTime@. This is specified using the ISO 8601 format.
+-- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+-- 1, 2020 1:15:02 PM UTC.
+--
+-- 'profilingGroupName', 'listFindingsReports_profilingGroupName' - The name of the profiling group from which to search for analysis data.
+--
+-- 'startTime', 'listFindingsReports_startTime' - The start time of the profile to get analysis data about. You must
+-- specify @startTime@ and @endTime@. This is specified using the ISO 8601
+-- format. For example, 2020-06-01T13:15:02.001Z represents 1 millisecond
+-- past June 1, 2020 1:15:02 PM UTC.
+newListFindingsReports ::
+  -- | 'endTime'
+  Prelude.UTCTime ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  ListFindingsReports
+newListFindingsReports
+  pEndTime_
+  pProfilingGroupName_
+  pStartTime_ =
+    ListFindingsReports'
+      { dailyReportsOnly =
+          Prelude.Nothing,
+        maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        endTime = Data._Time Lens.# pEndTime_,
+        profilingGroupName = pProfilingGroupName_,
+        startTime = Data._Time Lens.# pStartTime_
+      }
+
+-- | A @Boolean@ value indicating whether to only return reports from daily
+-- profiles. If set to @True@, only analysis data from daily profiles is
+-- returned. If set to @False@, analysis data is returned from smaller time
+-- windows (for example, one hour).
+listFindingsReports_dailyReportsOnly :: Lens.Lens' ListFindingsReports (Prelude.Maybe Prelude.Bool)
+listFindingsReports_dailyReportsOnly = Lens.lens (\ListFindingsReports' {dailyReportsOnly} -> dailyReportsOnly) (\s@ListFindingsReports' {} a -> s {dailyReportsOnly = a} :: ListFindingsReports)
+
+-- | The maximum number of report results returned by @ListFindingsReports@
+-- in paginated output. When this parameter is used, @ListFindingsReports@
+-- only returns @maxResults@ results in a single page along with a
+-- @nextToken@ response element. The remaining results of the initial
+-- request can be seen by sending another @ListFindingsReports@ request
+-- with the returned @nextToken@ value.
+listFindingsReports_maxResults :: Lens.Lens' ListFindingsReports (Prelude.Maybe Prelude.Natural)
+listFindingsReports_maxResults = Lens.lens (\ListFindingsReports' {maxResults} -> maxResults) (\s@ListFindingsReports' {} a -> s {maxResults = a} :: ListFindingsReports)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @ListFindingsReportsRequest@ request where @maxResults@ was used and the
+-- results exceeded the value of that parameter. Pagination continues from
+-- the end of the previous results that returned the @nextToken@ value.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+listFindingsReports_nextToken :: Lens.Lens' ListFindingsReports (Prelude.Maybe Prelude.Text)
+listFindingsReports_nextToken = Lens.lens (\ListFindingsReports' {nextToken} -> nextToken) (\s@ListFindingsReports' {} a -> s {nextToken = a} :: ListFindingsReports)
+
+-- | The end time of the profile to get analysis data about. You must specify
+-- @startTime@ and @endTime@. This is specified using the ISO 8601 format.
+-- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+-- 1, 2020 1:15:02 PM UTC.
+listFindingsReports_endTime :: Lens.Lens' ListFindingsReports Prelude.UTCTime
+listFindingsReports_endTime = Lens.lens (\ListFindingsReports' {endTime} -> endTime) (\s@ListFindingsReports' {} a -> s {endTime = a} :: ListFindingsReports) Prelude.. Data._Time
+
+-- | The name of the profiling group from which to search for analysis data.
+listFindingsReports_profilingGroupName :: Lens.Lens' ListFindingsReports Prelude.Text
+listFindingsReports_profilingGroupName = Lens.lens (\ListFindingsReports' {profilingGroupName} -> profilingGroupName) (\s@ListFindingsReports' {} a -> s {profilingGroupName = a} :: ListFindingsReports)
+
+-- | The start time of the profile to get analysis data about. You must
+-- specify @startTime@ and @endTime@. This is specified using the ISO 8601
+-- format. For example, 2020-06-01T13:15:02.001Z represents 1 millisecond
+-- past June 1, 2020 1:15:02 PM UTC.
+listFindingsReports_startTime :: Lens.Lens' ListFindingsReports Prelude.UTCTime
+listFindingsReports_startTime = Lens.lens (\ListFindingsReports' {startTime} -> startTime) (\s@ListFindingsReports' {} a -> s {startTime = a} :: ListFindingsReports) Prelude.. Data._Time
+
+instance Core.AWSRequest ListFindingsReports where
+  type
+    AWSResponse ListFindingsReports =
+      ListFindingsReportsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListFindingsReportsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "findingsReportSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListFindingsReports where
+  hashWithSalt _salt ListFindingsReports' {..} =
+    _salt
+      `Prelude.hashWithSalt` dailyReportsOnly
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` profilingGroupName
+      `Prelude.hashWithSalt` startTime
+
+instance Prelude.NFData ListFindingsReports where
+  rnf ListFindingsReports' {..} =
+    Prelude.rnf dailyReportsOnly
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf profilingGroupName
+      `Prelude.seq` Prelude.rnf startTime
+
+instance Data.ToHeaders ListFindingsReports where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListFindingsReports where
+  toPath ListFindingsReports' {..} =
+    Prelude.mconcat
+      [ "/internal/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/findingsReports"
+      ]
+
+instance Data.ToQuery ListFindingsReports where
+  toQuery ListFindingsReports' {..} =
+    Prelude.mconcat
+      [ "dailyReportsOnly" Data.=: dailyReportsOnly,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "endTime" Data.=: endTime,
+        "startTime" Data.=: startTime
+      ]
+
+-- | The structure representing the ListFindingsReportsResponse.
+--
+-- /See:/ 'newListFindingsReportsResponse' smart constructor.
+data ListFindingsReportsResponse = ListFindingsReportsResponse'
+  { -- | The @nextToken@ value to include in a future @ListFindingsReports@
+    -- request. When the results of a @ListFindingsReports@ request exceed
+    -- @maxResults@, this value can be used to retrieve the next page of
+    -- results. This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of analysis results summaries.
+    findingsReportSummaries :: [FindingsReportSummary]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListFindingsReportsResponse' 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:
+--
+-- 'nextToken', 'listFindingsReportsResponse_nextToken' - The @nextToken@ value to include in a future @ListFindingsReports@
+-- request. When the results of a @ListFindingsReports@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listFindingsReportsResponse_httpStatus' - The response's http status code.
+--
+-- 'findingsReportSummaries', 'listFindingsReportsResponse_findingsReportSummaries' - The list of analysis results summaries.
+newListFindingsReportsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListFindingsReportsResponse
+newListFindingsReportsResponse pHttpStatus_ =
+  ListFindingsReportsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      findingsReportSummaries = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @ListFindingsReports@
+-- request. When the results of a @ListFindingsReports@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+listFindingsReportsResponse_nextToken :: Lens.Lens' ListFindingsReportsResponse (Prelude.Maybe Prelude.Text)
+listFindingsReportsResponse_nextToken = Lens.lens (\ListFindingsReportsResponse' {nextToken} -> nextToken) (\s@ListFindingsReportsResponse' {} a -> s {nextToken = a} :: ListFindingsReportsResponse)
+
+-- | The response's http status code.
+listFindingsReportsResponse_httpStatus :: Lens.Lens' ListFindingsReportsResponse Prelude.Int
+listFindingsReportsResponse_httpStatus = Lens.lens (\ListFindingsReportsResponse' {httpStatus} -> httpStatus) (\s@ListFindingsReportsResponse' {} a -> s {httpStatus = a} :: ListFindingsReportsResponse)
+
+-- | The list of analysis results summaries.
+listFindingsReportsResponse_findingsReportSummaries :: Lens.Lens' ListFindingsReportsResponse [FindingsReportSummary]
+listFindingsReportsResponse_findingsReportSummaries = Lens.lens (\ListFindingsReportsResponse' {findingsReportSummaries} -> findingsReportSummaries) (\s@ListFindingsReportsResponse' {} a -> s {findingsReportSummaries = a} :: ListFindingsReportsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListFindingsReportsResponse where
+  rnf ListFindingsReportsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf findingsReportSummaries
diff --git a/gen/Amazonka/CodeGuruProfiler/ListProfileTimes.hs b/gen/Amazonka/CodeGuruProfiler/ListProfileTimes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/ListProfileTimes.hs
@@ -0,0 +1,370 @@
+{-# 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.CodeGuruProfiler.ListProfileTimes
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the start times of the available aggregated profiles of a
+-- profiling group for an aggregation period within the specified time
+-- range.
+--
+-- This operation returns paginated results.
+module Amazonka.CodeGuruProfiler.ListProfileTimes
+  ( -- * Creating a Request
+    ListProfileTimes (..),
+    newListProfileTimes,
+
+    -- * Request Lenses
+    listProfileTimes_maxResults,
+    listProfileTimes_nextToken,
+    listProfileTimes_orderBy,
+    listProfileTimes_endTime,
+    listProfileTimes_period,
+    listProfileTimes_profilingGroupName,
+    listProfileTimes_startTime,
+
+    -- * Destructuring the Response
+    ListProfileTimesResponse (..),
+    newListProfileTimesResponse,
+
+    -- * Response Lenses
+    listProfileTimesResponse_nextToken,
+    listProfileTimesResponse_httpStatus,
+    listProfileTimesResponse_profileTimes,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the listProfileTimesRequest.
+--
+-- /See:/ 'newListProfileTimes' smart constructor.
+data ListProfileTimes = ListProfileTimes'
+  { -- | The maximum number of profile time results returned by
+    -- @ListProfileTimes@ in paginated output. When this parameter is used,
+    -- @ListProfileTimes@ only returns @maxResults@ results in a single page
+    -- with a @nextToken@ response element. The remaining results of the
+    -- initial request can be seen by sending another @ListProfileTimes@
+    -- request with the returned @nextToken@ value.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @ListProfileTimes@ request where @maxResults@ was used and the results
+    -- exceeded the value of that parameter. Pagination continues from the end
+    -- of the previous results that returned the @nextToken@ value.
+    --
+    -- This token should be treated as an opaque identifier that is only used
+    -- to retrieve the next items in a list and not for other programmatic
+    -- purposes.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The order (ascending or descending by start time of the profile) to use
+    -- when listing profiles. Defaults to @TIMESTAMP_DESCENDING@.
+    orderBy :: Prelude.Maybe OrderBy,
+    -- | The end time of the time range from which to list the profiles.
+    endTime :: Data.ISO8601,
+    -- | The aggregation period. This specifies the period during which an
+    -- aggregation profile collects posted agent profiles for a profiling
+    -- group. There are 3 valid values.
+    --
+    -- -   @P1D@ — 1 day
+    --
+    -- -   @PT1H@ — 1 hour
+    --
+    -- -   @PT5M@ — 5 minutes
+    period :: AggregationPeriod,
+    -- | The name of the profiling group.
+    profilingGroupName :: Prelude.Text,
+    -- | The start time of the time range from which to list the profiles.
+    startTime :: Data.ISO8601
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListProfileTimes' 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', 'listProfileTimes_maxResults' - The maximum number of profile time results returned by
+-- @ListProfileTimes@ in paginated output. When this parameter is used,
+-- @ListProfileTimes@ only returns @maxResults@ results in a single page
+-- with a @nextToken@ response element. The remaining results of the
+-- initial request can be seen by sending another @ListProfileTimes@
+-- request with the returned @nextToken@ value.
+--
+-- 'nextToken', 'listProfileTimes_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @ListProfileTimes@ request where @maxResults@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+--
+-- 'orderBy', 'listProfileTimes_orderBy' - The order (ascending or descending by start time of the profile) to use
+-- when listing profiles. Defaults to @TIMESTAMP_DESCENDING@.
+--
+-- 'endTime', 'listProfileTimes_endTime' - The end time of the time range from which to list the profiles.
+--
+-- 'period', 'listProfileTimes_period' - The aggregation period. This specifies the period during which an
+-- aggregation profile collects posted agent profiles for a profiling
+-- group. There are 3 valid values.
+--
+-- -   @P1D@ — 1 day
+--
+-- -   @PT1H@ — 1 hour
+--
+-- -   @PT5M@ — 5 minutes
+--
+-- 'profilingGroupName', 'listProfileTimes_profilingGroupName' - The name of the profiling group.
+--
+-- 'startTime', 'listProfileTimes_startTime' - The start time of the time range from which to list the profiles.
+newListProfileTimes ::
+  -- | 'endTime'
+  Prelude.UTCTime ->
+  -- | 'period'
+  AggregationPeriod ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  ListProfileTimes
+newListProfileTimes
+  pEndTime_
+  pPeriod_
+  pProfilingGroupName_
+  pStartTime_ =
+    ListProfileTimes'
+      { maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        orderBy = Prelude.Nothing,
+        endTime = Data._Time Lens.# pEndTime_,
+        period = pPeriod_,
+        profilingGroupName = pProfilingGroupName_,
+        startTime = Data._Time Lens.# pStartTime_
+      }
+
+-- | The maximum number of profile time results returned by
+-- @ListProfileTimes@ in paginated output. When this parameter is used,
+-- @ListProfileTimes@ only returns @maxResults@ results in a single page
+-- with a @nextToken@ response element. The remaining results of the
+-- initial request can be seen by sending another @ListProfileTimes@
+-- request with the returned @nextToken@ value.
+listProfileTimes_maxResults :: Lens.Lens' ListProfileTimes (Prelude.Maybe Prelude.Natural)
+listProfileTimes_maxResults = Lens.lens (\ListProfileTimes' {maxResults} -> maxResults) (\s@ListProfileTimes' {} a -> s {maxResults = a} :: ListProfileTimes)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @ListProfileTimes@ request where @maxResults@ was used and the results
+-- exceeded the value of that parameter. Pagination continues from the end
+-- of the previous results that returned the @nextToken@ value.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+listProfileTimes_nextToken :: Lens.Lens' ListProfileTimes (Prelude.Maybe Prelude.Text)
+listProfileTimes_nextToken = Lens.lens (\ListProfileTimes' {nextToken} -> nextToken) (\s@ListProfileTimes' {} a -> s {nextToken = a} :: ListProfileTimes)
+
+-- | The order (ascending or descending by start time of the profile) to use
+-- when listing profiles. Defaults to @TIMESTAMP_DESCENDING@.
+listProfileTimes_orderBy :: Lens.Lens' ListProfileTimes (Prelude.Maybe OrderBy)
+listProfileTimes_orderBy = Lens.lens (\ListProfileTimes' {orderBy} -> orderBy) (\s@ListProfileTimes' {} a -> s {orderBy = a} :: ListProfileTimes)
+
+-- | The end time of the time range from which to list the profiles.
+listProfileTimes_endTime :: Lens.Lens' ListProfileTimes Prelude.UTCTime
+listProfileTimes_endTime = Lens.lens (\ListProfileTimes' {endTime} -> endTime) (\s@ListProfileTimes' {} a -> s {endTime = a} :: ListProfileTimes) Prelude.. Data._Time
+
+-- | The aggregation period. This specifies the period during which an
+-- aggregation profile collects posted agent profiles for a profiling
+-- group. There are 3 valid values.
+--
+-- -   @P1D@ — 1 day
+--
+-- -   @PT1H@ — 1 hour
+--
+-- -   @PT5M@ — 5 minutes
+listProfileTimes_period :: Lens.Lens' ListProfileTimes AggregationPeriod
+listProfileTimes_period = Lens.lens (\ListProfileTimes' {period} -> period) (\s@ListProfileTimes' {} a -> s {period = a} :: ListProfileTimes)
+
+-- | The name of the profiling group.
+listProfileTimes_profilingGroupName :: Lens.Lens' ListProfileTimes Prelude.Text
+listProfileTimes_profilingGroupName = Lens.lens (\ListProfileTimes' {profilingGroupName} -> profilingGroupName) (\s@ListProfileTimes' {} a -> s {profilingGroupName = a} :: ListProfileTimes)
+
+-- | The start time of the time range from which to list the profiles.
+listProfileTimes_startTime :: Lens.Lens' ListProfileTimes Prelude.UTCTime
+listProfileTimes_startTime = Lens.lens (\ListProfileTimes' {startTime} -> startTime) (\s@ListProfileTimes' {} a -> s {startTime = a} :: ListProfileTimes) Prelude.. Data._Time
+
+instance Core.AWSPager ListProfileTimes where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listProfileTimesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        (rs Lens.^. listProfileTimesResponse_profileTimes) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listProfileTimes_nextToken
+          Lens..~ rs
+          Lens.^? listProfileTimesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListProfileTimes where
+  type
+    AWSResponse ListProfileTimes =
+      ListProfileTimesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListProfileTimesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "profileTimes" Core..!@ Prelude.mempty)
+      )
+
+instance Prelude.Hashable ListProfileTimes where
+  hashWithSalt _salt ListProfileTimes' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` orderBy
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` period
+      `Prelude.hashWithSalt` profilingGroupName
+      `Prelude.hashWithSalt` startTime
+
+instance Prelude.NFData ListProfileTimes where
+  rnf ListProfileTimes' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf orderBy
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf period
+      `Prelude.seq` Prelude.rnf profilingGroupName
+      `Prelude.seq` Prelude.rnf startTime
+
+instance Data.ToHeaders ListProfileTimes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListProfileTimes where
+  toPath ListProfileTimes' {..} =
+    Prelude.mconcat
+      [ "/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/profileTimes"
+      ]
+
+instance Data.ToQuery ListProfileTimes where
+  toQuery ListProfileTimes' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "orderBy" Data.=: orderBy,
+        "endTime" Data.=: endTime,
+        "period" Data.=: period,
+        "startTime" Data.=: startTime
+      ]
+
+-- | The structure representing the listProfileTimesResponse.
+--
+-- /See:/ 'newListProfileTimesResponse' smart constructor.
+data ListProfileTimesResponse = ListProfileTimesResponse'
+  { -- | The @nextToken@ value to include in a future @ListProfileTimes@ request.
+    -- When the results of a @ListProfileTimes@ request exceed @maxResults@,
+    -- this value can be used to retrieve the next page of results. This value
+    -- is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The list of start times of the available profiles for the aggregation
+    -- period in the specified time range.
+    profileTimes :: [ProfileTime]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListProfileTimesResponse' 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:
+--
+-- 'nextToken', 'listProfileTimesResponse_nextToken' - The @nextToken@ value to include in a future @ListProfileTimes@ request.
+-- When the results of a @ListProfileTimes@ request exceed @maxResults@,
+-- this value can be used to retrieve the next page of results. This value
+-- is @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listProfileTimesResponse_httpStatus' - The response's http status code.
+--
+-- 'profileTimes', 'listProfileTimesResponse_profileTimes' - The list of start times of the available profiles for the aggregation
+-- period in the specified time range.
+newListProfileTimesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListProfileTimesResponse
+newListProfileTimesResponse pHttpStatus_ =
+  ListProfileTimesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      profileTimes = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @ListProfileTimes@ request.
+-- When the results of a @ListProfileTimes@ request exceed @maxResults@,
+-- this value can be used to retrieve the next page of results. This value
+-- is @null@ when there are no more results to return.
+listProfileTimesResponse_nextToken :: Lens.Lens' ListProfileTimesResponse (Prelude.Maybe Prelude.Text)
+listProfileTimesResponse_nextToken = Lens.lens (\ListProfileTimesResponse' {nextToken} -> nextToken) (\s@ListProfileTimesResponse' {} a -> s {nextToken = a} :: ListProfileTimesResponse)
+
+-- | The response's http status code.
+listProfileTimesResponse_httpStatus :: Lens.Lens' ListProfileTimesResponse Prelude.Int
+listProfileTimesResponse_httpStatus = Lens.lens (\ListProfileTimesResponse' {httpStatus} -> httpStatus) (\s@ListProfileTimesResponse' {} a -> s {httpStatus = a} :: ListProfileTimesResponse)
+
+-- | The list of start times of the available profiles for the aggregation
+-- period in the specified time range.
+listProfileTimesResponse_profileTimes :: Lens.Lens' ListProfileTimesResponse [ProfileTime]
+listProfileTimesResponse_profileTimes = Lens.lens (\ListProfileTimesResponse' {profileTimes} -> profileTimes) (\s@ListProfileTimesResponse' {} a -> s {profileTimes = a} :: ListProfileTimesResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListProfileTimesResponse where
+  rnf ListProfileTimesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf profileTimes
diff --git a/gen/Amazonka/CodeGuruProfiler/ListProfilingGroups.hs b/gen/Amazonka/CodeGuruProfiler/ListProfilingGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/ListProfilingGroups.hs
@@ -0,0 +1,306 @@
+{-# 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.CodeGuruProfiler.ListProfilingGroups
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of profiling groups. The profiling groups are returned as
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- objects.
+module Amazonka.CodeGuruProfiler.ListProfilingGroups
+  ( -- * Creating a Request
+    ListProfilingGroups (..),
+    newListProfilingGroups,
+
+    -- * Request Lenses
+    listProfilingGroups_includeDescription,
+    listProfilingGroups_maxResults,
+    listProfilingGroups_nextToken,
+
+    -- * Destructuring the Response
+    ListProfilingGroupsResponse (..),
+    newListProfilingGroupsResponse,
+
+    -- * Response Lenses
+    listProfilingGroupsResponse_nextToken,
+    listProfilingGroupsResponse_profilingGroups,
+    listProfilingGroupsResponse_httpStatus,
+    listProfilingGroupsResponse_profilingGroupNames,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the listProfilingGroupsRequest.
+--
+-- /See:/ 'newListProfilingGroups' smart constructor.
+data ListProfilingGroups = ListProfilingGroups'
+  { -- | A @Boolean@ value indicating whether to include a description. If
+    -- @true@, then a list of
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+    -- objects that contain detailed information about profiling groups is
+    -- returned. If @false@, then a list of profiling group names is returned.
+    includeDescription :: Prelude.Maybe Prelude.Bool,
+    -- | The maximum number of profiling groups results returned by
+    -- @ListProfilingGroups@ in paginated output. When this parameter is used,
+    -- @ListProfilingGroups@ only returns @maxResults@ results in a single page
+    -- along with a @nextToken@ response element. The remaining results of the
+    -- initial request can be seen by sending another @ListProfilingGroups@
+    -- request with the returned @nextToken@ value.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The @nextToken@ value returned from a previous paginated
+    -- @ListProfilingGroups@ request where @maxResults@ was used and the
+    -- results exceeded the value of that parameter. Pagination continues from
+    -- the end of the previous results that returned the @nextToken@ value.
+    --
+    -- This token should be treated as an opaque identifier that is only used
+    -- to retrieve the next items in a list and not for other programmatic
+    -- purposes.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListProfilingGroups' 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:
+--
+-- 'includeDescription', 'listProfilingGroups_includeDescription' - A @Boolean@ value indicating whether to include a description. If
+-- @true@, then a list of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- objects that contain detailed information about profiling groups is
+-- returned. If @false@, then a list of profiling group names is returned.
+--
+-- 'maxResults', 'listProfilingGroups_maxResults' - The maximum number of profiling groups results returned by
+-- @ListProfilingGroups@ in paginated output. When this parameter is used,
+-- @ListProfilingGroups@ only returns @maxResults@ results in a single page
+-- along with a @nextToken@ response element. The remaining results of the
+-- initial request can be seen by sending another @ListProfilingGroups@
+-- request with the returned @nextToken@ value.
+--
+-- 'nextToken', 'listProfilingGroups_nextToken' - The @nextToken@ value returned from a previous paginated
+-- @ListProfilingGroups@ request where @maxResults@ was used and the
+-- results exceeded the value of that parameter. Pagination continues from
+-- the end of the previous results that returned the @nextToken@ value.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+newListProfilingGroups ::
+  ListProfilingGroups
+newListProfilingGroups =
+  ListProfilingGroups'
+    { includeDescription =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | A @Boolean@ value indicating whether to include a description. If
+-- @true@, then a list of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- objects that contain detailed information about profiling groups is
+-- returned. If @false@, then a list of profiling group names is returned.
+listProfilingGroups_includeDescription :: Lens.Lens' ListProfilingGroups (Prelude.Maybe Prelude.Bool)
+listProfilingGroups_includeDescription = Lens.lens (\ListProfilingGroups' {includeDescription} -> includeDescription) (\s@ListProfilingGroups' {} a -> s {includeDescription = a} :: ListProfilingGroups)
+
+-- | The maximum number of profiling groups results returned by
+-- @ListProfilingGroups@ in paginated output. When this parameter is used,
+-- @ListProfilingGroups@ only returns @maxResults@ results in a single page
+-- along with a @nextToken@ response element. The remaining results of the
+-- initial request can be seen by sending another @ListProfilingGroups@
+-- request with the returned @nextToken@ value.
+listProfilingGroups_maxResults :: Lens.Lens' ListProfilingGroups (Prelude.Maybe Prelude.Natural)
+listProfilingGroups_maxResults = Lens.lens (\ListProfilingGroups' {maxResults} -> maxResults) (\s@ListProfilingGroups' {} a -> s {maxResults = a} :: ListProfilingGroups)
+
+-- | The @nextToken@ value returned from a previous paginated
+-- @ListProfilingGroups@ request where @maxResults@ was used and the
+-- results exceeded the value of that parameter. Pagination continues from
+-- the end of the previous results that returned the @nextToken@ value.
+--
+-- This token should be treated as an opaque identifier that is only used
+-- to retrieve the next items in a list and not for other programmatic
+-- purposes.
+listProfilingGroups_nextToken :: Lens.Lens' ListProfilingGroups (Prelude.Maybe Prelude.Text)
+listProfilingGroups_nextToken = Lens.lens (\ListProfilingGroups' {nextToken} -> nextToken) (\s@ListProfilingGroups' {} a -> s {nextToken = a} :: ListProfilingGroups)
+
+instance Core.AWSRequest ListProfilingGroups where
+  type
+    AWSResponse ListProfilingGroups =
+      ListProfilingGroupsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListProfilingGroupsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> ( x
+                            Data..?> "profilingGroups"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> ( x
+                            Data..?> "profilingGroupNames"
+                            Core..!@ Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable ListProfilingGroups where
+  hashWithSalt _salt ListProfilingGroups' {..} =
+    _salt
+      `Prelude.hashWithSalt` includeDescription
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListProfilingGroups where
+  rnf ListProfilingGroups' {..} =
+    Prelude.rnf includeDescription
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListProfilingGroups where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListProfilingGroups where
+  toPath = Prelude.const "/profilingGroups"
+
+instance Data.ToQuery ListProfilingGroups where
+  toQuery ListProfilingGroups' {..} =
+    Prelude.mconcat
+      [ "includeDescription" Data.=: includeDescription,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | The structure representing the listProfilingGroupsResponse.
+--
+-- /See:/ 'newListProfilingGroupsResponse' smart constructor.
+data ListProfilingGroupsResponse = ListProfilingGroupsResponse'
+  { -- | The @nextToken@ value to include in a future @ListProfilingGroups@
+    -- request. When the results of a @ListProfilingGroups@ request exceed
+    -- @maxResults@, this value can be used to retrieve the next page of
+    -- results. This value is @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A returned list
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+    -- objects. A list of
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+    -- objects is returned only if @includeDescription@ is @true@, otherwise a
+    -- list of profiling group names is returned.
+    profilingGroups :: Prelude.Maybe [ProfilingGroupDescription],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A returned list of profiling group names. A list of the names is
+    -- returned only if @includeDescription@ is @false@, otherwise a list of
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+    -- objects is returned.
+    profilingGroupNames :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListProfilingGroupsResponse' 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:
+--
+-- 'nextToken', 'listProfilingGroupsResponse_nextToken' - The @nextToken@ value to include in a future @ListProfilingGroups@
+-- request. When the results of a @ListProfilingGroups@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+--
+-- 'profilingGroups', 'listProfilingGroupsResponse_profilingGroups' - A returned list
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- objects. A list of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- objects is returned only if @includeDescription@ is @true@, otherwise a
+-- list of profiling group names is returned.
+--
+-- 'httpStatus', 'listProfilingGroupsResponse_httpStatus' - The response's http status code.
+--
+-- 'profilingGroupNames', 'listProfilingGroupsResponse_profilingGroupNames' - A returned list of profiling group names. A list of the names is
+-- returned only if @includeDescription@ is @false@, otherwise a list of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- objects is returned.
+newListProfilingGroupsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListProfilingGroupsResponse
+newListProfilingGroupsResponse pHttpStatus_ =
+  ListProfilingGroupsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      profilingGroups = Prelude.Nothing,
+      httpStatus = pHttpStatus_,
+      profilingGroupNames = Prelude.mempty
+    }
+
+-- | The @nextToken@ value to include in a future @ListProfilingGroups@
+-- request. When the results of a @ListProfilingGroups@ request exceed
+-- @maxResults@, this value can be used to retrieve the next page of
+-- results. This value is @null@ when there are no more results to return.
+listProfilingGroupsResponse_nextToken :: Lens.Lens' ListProfilingGroupsResponse (Prelude.Maybe Prelude.Text)
+listProfilingGroupsResponse_nextToken = Lens.lens (\ListProfilingGroupsResponse' {nextToken} -> nextToken) (\s@ListProfilingGroupsResponse' {} a -> s {nextToken = a} :: ListProfilingGroupsResponse)
+
+-- | A returned list
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- objects. A list of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- objects is returned only if @includeDescription@ is @true@, otherwise a
+-- list of profiling group names is returned.
+listProfilingGroupsResponse_profilingGroups :: Lens.Lens' ListProfilingGroupsResponse (Prelude.Maybe [ProfilingGroupDescription])
+listProfilingGroupsResponse_profilingGroups = Lens.lens (\ListProfilingGroupsResponse' {profilingGroups} -> profilingGroups) (\s@ListProfilingGroupsResponse' {} a -> s {profilingGroups = a} :: ListProfilingGroupsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listProfilingGroupsResponse_httpStatus :: Lens.Lens' ListProfilingGroupsResponse Prelude.Int
+listProfilingGroupsResponse_httpStatus = Lens.lens (\ListProfilingGroupsResponse' {httpStatus} -> httpStatus) (\s@ListProfilingGroupsResponse' {} a -> s {httpStatus = a} :: ListProfilingGroupsResponse)
+
+-- | A returned list of profiling group names. A list of the names is
+-- returned only if @includeDescription@ is @false@, otherwise a list of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- objects is returned.
+listProfilingGroupsResponse_profilingGroupNames :: Lens.Lens' ListProfilingGroupsResponse [Prelude.Text]
+listProfilingGroupsResponse_profilingGroupNames = Lens.lens (\ListProfilingGroupsResponse' {profilingGroupNames} -> profilingGroupNames) (\s@ListProfilingGroupsResponse' {} a -> s {profilingGroupNames = a} :: ListProfilingGroupsResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListProfilingGroupsResponse where
+  rnf ListProfilingGroupsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf profilingGroups
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf profilingGroupNames
diff --git a/gen/Amazonka/CodeGuruProfiler/ListTagsForResource.hs b/gen/Amazonka/CodeGuruProfiler/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/ListTagsForResource.hs
@@ -0,0 +1,165 @@
+{-# 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.CodeGuruProfiler.ListTagsForResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of the tags that are assigned to a specified resource.
+module Amazonka.CodeGuruProfiler.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The Amazon Resource Name (ARN) of the resource that contains the tags to
+    -- return.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' 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:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The Amazon Resource Name (ARN) of the resource that contains the tags to
+-- return.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name (ARN) of the resource that contains the tags to
+-- return.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath ListTagsForResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The list of tags assigned to the specified resource. This is the list of
+    -- tags returned in the response.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' 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:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The list of tags assigned to the specified resource. This is the list of
+-- tags returned in the response.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of tags assigned to the specified resource. This is the list of
+-- tags returned in the response.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/CodeGuruProfiler/PostAgentProfile.hs b/gen/Amazonka/CodeGuruProfiler/PostAgentProfile.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/PostAgentProfile.hs
@@ -0,0 +1,225 @@
+{-# 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.CodeGuruProfiler.PostAgentProfile
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Submits profiling data to an aggregated profile of a profiling group. To
+-- get an aggregated profile that is created with this profiling data, use
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_GetProfile.html GetProfile>
+-- .
+module Amazonka.CodeGuruProfiler.PostAgentProfile
+  ( -- * Creating a Request
+    PostAgentProfile (..),
+    newPostAgentProfile,
+
+    -- * Request Lenses
+    postAgentProfile_profileToken,
+    postAgentProfile_agentProfile,
+    postAgentProfile_contentType,
+    postAgentProfile_profilingGroupName,
+
+    -- * Destructuring the Response
+    PostAgentProfileResponse (..),
+    newPostAgentProfileResponse,
+
+    -- * Response Lenses
+    postAgentProfileResponse_httpStatus,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the postAgentProfileRequest.
+--
+-- /See:/ 'newPostAgentProfile' smart constructor.
+data PostAgentProfile = PostAgentProfile'
+  { -- | Amazon CodeGuru Profiler uses this universally unique identifier (UUID)
+    -- to prevent the accidental submission of duplicate profiling data if
+    -- there are failures and retries.
+    profileToken :: Prelude.Maybe Prelude.Text,
+    -- | The submitted profiling data.
+    agentProfile :: Prelude.ByteString,
+    -- | The format of the submitted profiling data. The format maps to the
+    -- @Accept@ and @Content-Type@ headers of the HTTP request. You can specify
+    -- one of the following: or the default .
+    --
+    -- >  <ul> <li> <p> <code>application/json</code> — standard JSON format </p> </li> <li> <p> <code>application/x-amzn-ion</code> — the Amazon Ion data format. For more information, see <a href="http://amzn.github.io/ion-docs/">Amazon Ion</a>. </p> </li> </ul>
+    contentType :: Prelude.Text,
+    -- | The name of the profiling group with the aggregated profile that
+    -- receives the submitted profiling data.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PostAgentProfile' 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:
+--
+-- 'profileToken', 'postAgentProfile_profileToken' - Amazon CodeGuru Profiler uses this universally unique identifier (UUID)
+-- to prevent the accidental submission of duplicate profiling data if
+-- there are failures and retries.
+--
+-- 'agentProfile', 'postAgentProfile_agentProfile' - The submitted profiling data.
+--
+-- 'contentType', 'postAgentProfile_contentType' - The format of the submitted profiling data. The format maps to the
+-- @Accept@ and @Content-Type@ headers of the HTTP request. You can specify
+-- one of the following: or the default .
+--
+-- >  <ul> <li> <p> <code>application/json</code> — standard JSON format </p> </li> <li> <p> <code>application/x-amzn-ion</code> — the Amazon Ion data format. For more information, see <a href="http://amzn.github.io/ion-docs/">Amazon Ion</a>. </p> </li> </ul>
+--
+-- 'profilingGroupName', 'postAgentProfile_profilingGroupName' - The name of the profiling group with the aggregated profile that
+-- receives the submitted profiling data.
+newPostAgentProfile ::
+  -- | 'agentProfile'
+  Prelude.ByteString ->
+  -- | 'contentType'
+  Prelude.Text ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  PostAgentProfile
+newPostAgentProfile
+  pAgentProfile_
+  pContentType_
+  pProfilingGroupName_ =
+    PostAgentProfile'
+      { profileToken = Prelude.Nothing,
+        agentProfile = pAgentProfile_,
+        contentType = pContentType_,
+        profilingGroupName = pProfilingGroupName_
+      }
+
+-- | Amazon CodeGuru Profiler uses this universally unique identifier (UUID)
+-- to prevent the accidental submission of duplicate profiling data if
+-- there are failures and retries.
+postAgentProfile_profileToken :: Lens.Lens' PostAgentProfile (Prelude.Maybe Prelude.Text)
+postAgentProfile_profileToken = Lens.lens (\PostAgentProfile' {profileToken} -> profileToken) (\s@PostAgentProfile' {} a -> s {profileToken = a} :: PostAgentProfile)
+
+-- | The submitted profiling data.
+postAgentProfile_agentProfile :: Lens.Lens' PostAgentProfile Prelude.ByteString
+postAgentProfile_agentProfile = Lens.lens (\PostAgentProfile' {agentProfile} -> agentProfile) (\s@PostAgentProfile' {} a -> s {agentProfile = a} :: PostAgentProfile)
+
+-- | The format of the submitted profiling data. The format maps to the
+-- @Accept@ and @Content-Type@ headers of the HTTP request. You can specify
+-- one of the following: or the default .
+--
+-- >  <ul> <li> <p> <code>application/json</code> — standard JSON format </p> </li> <li> <p> <code>application/x-amzn-ion</code> — the Amazon Ion data format. For more information, see <a href="http://amzn.github.io/ion-docs/">Amazon Ion</a>. </p> </li> </ul>
+postAgentProfile_contentType :: Lens.Lens' PostAgentProfile Prelude.Text
+postAgentProfile_contentType = Lens.lens (\PostAgentProfile' {contentType} -> contentType) (\s@PostAgentProfile' {} a -> s {contentType = a} :: PostAgentProfile)
+
+-- | The name of the profiling group with the aggregated profile that
+-- receives the submitted profiling data.
+postAgentProfile_profilingGroupName :: Lens.Lens' PostAgentProfile Prelude.Text
+postAgentProfile_profilingGroupName = Lens.lens (\PostAgentProfile' {profilingGroupName} -> profilingGroupName) (\s@PostAgentProfile' {} a -> s {profilingGroupName = a} :: PostAgentProfile)
+
+instance Core.AWSRequest PostAgentProfile where
+  type
+    AWSResponse PostAgentProfile =
+      PostAgentProfileResponse
+  request overrides =
+    Request.postBody (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          PostAgentProfileResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PostAgentProfile where
+  hashWithSalt _salt PostAgentProfile' {..} =
+    _salt
+      `Prelude.hashWithSalt` profileToken
+      `Prelude.hashWithSalt` agentProfile
+      `Prelude.hashWithSalt` contentType
+      `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData PostAgentProfile where
+  rnf PostAgentProfile' {..} =
+    Prelude.rnf profileToken
+      `Prelude.seq` Prelude.rnf agentProfile
+      `Prelude.seq` Prelude.rnf contentType
+      `Prelude.seq` Prelude.rnf profilingGroupName
+
+instance Data.ToBody PostAgentProfile where
+  toBody PostAgentProfile' {..} =
+    Data.toBody agentProfile
+
+instance Data.ToHeaders PostAgentProfile where
+  toHeaders PostAgentProfile' {..} =
+    Prelude.mconcat
+      ["Content-Type" Data.=# contentType]
+
+instance Data.ToPath PostAgentProfile where
+  toPath PostAgentProfile' {..} =
+    Prelude.mconcat
+      [ "/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/agentProfile"
+      ]
+
+instance Data.ToQuery PostAgentProfile where
+  toQuery PostAgentProfile' {..} =
+    Prelude.mconcat
+      ["profileToken" Data.=: profileToken]
+
+-- | The structure representing the postAgentProfileResponse.
+--
+-- /See:/ 'newPostAgentProfileResponse' smart constructor.
+data PostAgentProfileResponse = PostAgentProfileResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PostAgentProfileResponse' 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:
+--
+-- 'httpStatus', 'postAgentProfileResponse_httpStatus' - The response's http status code.
+newPostAgentProfileResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PostAgentProfileResponse
+newPostAgentProfileResponse pHttpStatus_ =
+  PostAgentProfileResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+postAgentProfileResponse_httpStatus :: Lens.Lens' PostAgentProfileResponse Prelude.Int
+postAgentProfileResponse_httpStatus = Lens.lens (\PostAgentProfileResponse' {httpStatus} -> httpStatus) (\s@PostAgentProfileResponse' {} a -> s {httpStatus = a} :: PostAgentProfileResponse)
+
+instance Prelude.NFData PostAgentProfileResponse where
+  rnf PostAgentProfileResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/CodeGuruProfiler/PutPermission.hs b/gen/Amazonka/CodeGuruProfiler/PutPermission.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/PutPermission.hs
@@ -0,0 +1,279 @@
+{-# 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.CodeGuruProfiler.PutPermission
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds permissions to a profiling group\'s resource-based policy that are
+-- provided using an action group. If a profiling group doesn\'t have a
+-- resource-based policy, one is created for it using the permissions in
+-- the action group and the roles and users in the @principals@ parameter.
+--
+-- >  <p> The one supported action group that can be added is <code>agentPermission</code> which grants <code>ConfigureAgent</code> and <code>PostAgent</code> permissions. For more information, see <a href="https://docs.aws.amazon.com/codeguru/latest/profiler-ug/resource-based-policies.html">Resource-based policies in CodeGuru Profiler</a> in the <i>Amazon CodeGuru Profiler User Guide</i>, <a href="https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ConfigureAgent.html"> <code>ConfigureAgent</code> </a>, and <a href="https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_PostAgentProfile.html"> <code>PostAgentProfile</code> </a>. </p> <p> The first time you call <code>PutPermission</code> on a profiling group, do not specify a <code>revisionId</code> because it doesn't have a resource-based policy. Subsequent calls must provide a <code>revisionId</code> to specify which revision of the resource-based policy to add the permissions to. </p> <p> The response contains the profiling group's JSON-formatted resource policy. </p>
+module Amazonka.CodeGuruProfiler.PutPermission
+  ( -- * Creating a Request
+    PutPermission (..),
+    newPutPermission,
+
+    -- * Request Lenses
+    putPermission_revisionId,
+    putPermission_actionGroup,
+    putPermission_principals,
+    putPermission_profilingGroupName,
+
+    -- * Destructuring the Response
+    PutPermissionResponse (..),
+    newPutPermissionResponse,
+
+    -- * Response Lenses
+    putPermissionResponse_httpStatus,
+    putPermissionResponse_policy,
+    putPermissionResponse_revisionId,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the @putPermissionRequest@.
+--
+-- /See:/ 'newPutPermission' smart constructor.
+data PutPermission = PutPermission'
+  { -- | A universally unique identifier (UUID) for the revision of the policy
+    -- you are adding to the profiling group. Do not specify this when you add
+    -- permissions to a profiling group for the first time. If a policy already
+    -- exists on the profiling group, you must specify the @revisionId@.
+    revisionId :: Prelude.Maybe Prelude.Text,
+    -- | Specifies an action group that contains permissions to add to a
+    -- profiling group resource. One action group is supported,
+    -- @agentPermissions@, which grants permission to perform actions required
+    -- by the profiling agent, @ConfigureAgent@ and @PostAgentProfile@
+    -- permissions.
+    actionGroup :: ActionGroup,
+    -- | A list ARNs for the roles and users you want to grant access to the
+    -- profiling group. Wildcards are not are supported in the ARNs.
+    principals :: Prelude.NonEmpty Prelude.Text,
+    -- | The name of the profiling group to grant access to.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutPermission' 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:
+--
+-- 'revisionId', 'putPermission_revisionId' - A universally unique identifier (UUID) for the revision of the policy
+-- you are adding to the profiling group. Do not specify this when you add
+-- permissions to a profiling group for the first time. If a policy already
+-- exists on the profiling group, you must specify the @revisionId@.
+--
+-- 'actionGroup', 'putPermission_actionGroup' - Specifies an action group that contains permissions to add to a
+-- profiling group resource. One action group is supported,
+-- @agentPermissions@, which grants permission to perform actions required
+-- by the profiling agent, @ConfigureAgent@ and @PostAgentProfile@
+-- permissions.
+--
+-- 'principals', 'putPermission_principals' - A list ARNs for the roles and users you want to grant access to the
+-- profiling group. Wildcards are not are supported in the ARNs.
+--
+-- 'profilingGroupName', 'putPermission_profilingGroupName' - The name of the profiling group to grant access to.
+newPutPermission ::
+  -- | 'actionGroup'
+  ActionGroup ->
+  -- | 'principals'
+  Prelude.NonEmpty Prelude.Text ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  PutPermission
+newPutPermission
+  pActionGroup_
+  pPrincipals_
+  pProfilingGroupName_ =
+    PutPermission'
+      { revisionId = Prelude.Nothing,
+        actionGroup = pActionGroup_,
+        principals = Lens.coerced Lens.# pPrincipals_,
+        profilingGroupName = pProfilingGroupName_
+      }
+
+-- | A universally unique identifier (UUID) for the revision of the policy
+-- you are adding to the profiling group. Do not specify this when you add
+-- permissions to a profiling group for the first time. If a policy already
+-- exists on the profiling group, you must specify the @revisionId@.
+putPermission_revisionId :: Lens.Lens' PutPermission (Prelude.Maybe Prelude.Text)
+putPermission_revisionId = Lens.lens (\PutPermission' {revisionId} -> revisionId) (\s@PutPermission' {} a -> s {revisionId = a} :: PutPermission)
+
+-- | Specifies an action group that contains permissions to add to a
+-- profiling group resource. One action group is supported,
+-- @agentPermissions@, which grants permission to perform actions required
+-- by the profiling agent, @ConfigureAgent@ and @PostAgentProfile@
+-- permissions.
+putPermission_actionGroup :: Lens.Lens' PutPermission ActionGroup
+putPermission_actionGroup = Lens.lens (\PutPermission' {actionGroup} -> actionGroup) (\s@PutPermission' {} a -> s {actionGroup = a} :: PutPermission)
+
+-- | A list ARNs for the roles and users you want to grant access to the
+-- profiling group. Wildcards are not are supported in the ARNs.
+putPermission_principals :: Lens.Lens' PutPermission (Prelude.NonEmpty Prelude.Text)
+putPermission_principals = Lens.lens (\PutPermission' {principals} -> principals) (\s@PutPermission' {} a -> s {principals = a} :: PutPermission) Prelude.. Lens.coerced
+
+-- | The name of the profiling group to grant access to.
+putPermission_profilingGroupName :: Lens.Lens' PutPermission Prelude.Text
+putPermission_profilingGroupName = Lens.lens (\PutPermission' {profilingGroupName} -> profilingGroupName) (\s@PutPermission' {} a -> s {profilingGroupName = a} :: PutPermission)
+
+instance Core.AWSRequest PutPermission where
+  type
+    AWSResponse PutPermission =
+      PutPermissionResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          PutPermissionResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "policy")
+            Prelude.<*> (x Data..:> "revisionId")
+      )
+
+instance Prelude.Hashable PutPermission where
+  hashWithSalt _salt PutPermission' {..} =
+    _salt
+      `Prelude.hashWithSalt` revisionId
+      `Prelude.hashWithSalt` actionGroup
+      `Prelude.hashWithSalt` principals
+      `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData PutPermission where
+  rnf PutPermission' {..} =
+    Prelude.rnf revisionId
+      `Prelude.seq` Prelude.rnf actionGroup
+      `Prelude.seq` Prelude.rnf principals
+      `Prelude.seq` Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders PutPermission where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutPermission where
+  toJSON PutPermission' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("revisionId" Data..=) Prelude.<$> revisionId,
+            Prelude.Just ("principals" Data..= principals)
+          ]
+      )
+
+instance Data.ToPath PutPermission where
+  toPath PutPermission' {..} =
+    Prelude.mconcat
+      [ "/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/policy/",
+        Data.toBS actionGroup
+      ]
+
+instance Data.ToQuery PutPermission where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The structure representing the @putPermissionResponse@.
+--
+-- /See:/ 'newPutPermissionResponse' smart constructor.
+data PutPermissionResponse = PutPermissionResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The JSON-formatted resource-based policy on the profiling group that
+    -- includes the added permissions.
+    policy :: Prelude.Text,
+    -- | A universally unique identifier (UUID) for the revision of the
+    -- resource-based policy that includes the added permissions. The
+    -- JSON-formatted policy is in the @policy@ element of the response.
+    revisionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutPermissionResponse' 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:
+--
+-- 'httpStatus', 'putPermissionResponse_httpStatus' - The response's http status code.
+--
+-- 'policy', 'putPermissionResponse_policy' - The JSON-formatted resource-based policy on the profiling group that
+-- includes the added permissions.
+--
+-- 'revisionId', 'putPermissionResponse_revisionId' - A universally unique identifier (UUID) for the revision of the
+-- resource-based policy that includes the added permissions. The
+-- JSON-formatted policy is in the @policy@ element of the response.
+newPutPermissionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'policy'
+  Prelude.Text ->
+  -- | 'revisionId'
+  Prelude.Text ->
+  PutPermissionResponse
+newPutPermissionResponse
+  pHttpStatus_
+  pPolicy_
+  pRevisionId_ =
+    PutPermissionResponse'
+      { httpStatus = pHttpStatus_,
+        policy = pPolicy_,
+        revisionId = pRevisionId_
+      }
+
+-- | The response's http status code.
+putPermissionResponse_httpStatus :: Lens.Lens' PutPermissionResponse Prelude.Int
+putPermissionResponse_httpStatus = Lens.lens (\PutPermissionResponse' {httpStatus} -> httpStatus) (\s@PutPermissionResponse' {} a -> s {httpStatus = a} :: PutPermissionResponse)
+
+-- | The JSON-formatted resource-based policy on the profiling group that
+-- includes the added permissions.
+putPermissionResponse_policy :: Lens.Lens' PutPermissionResponse Prelude.Text
+putPermissionResponse_policy = Lens.lens (\PutPermissionResponse' {policy} -> policy) (\s@PutPermissionResponse' {} a -> s {policy = a} :: PutPermissionResponse)
+
+-- | A universally unique identifier (UUID) for the revision of the
+-- resource-based policy that includes the added permissions. The
+-- JSON-formatted policy is in the @policy@ element of the response.
+putPermissionResponse_revisionId :: Lens.Lens' PutPermissionResponse Prelude.Text
+putPermissionResponse_revisionId = Lens.lens (\PutPermissionResponse' {revisionId} -> revisionId) (\s@PutPermissionResponse' {} a -> s {revisionId = a} :: PutPermissionResponse)
+
+instance Prelude.NFData PutPermissionResponse where
+  rnf PutPermissionResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf policy
+      `Prelude.seq` Prelude.rnf revisionId
diff --git a/gen/Amazonka/CodeGuruProfiler/RemoveNotificationChannel.hs b/gen/Amazonka/CodeGuruProfiler/RemoveNotificationChannel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/RemoveNotificationChannel.hs
@@ -0,0 +1,193 @@
+{-# 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.CodeGuruProfiler.RemoveNotificationChannel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Remove one anomaly notifications channel for a profiling group.
+module Amazonka.CodeGuruProfiler.RemoveNotificationChannel
+  ( -- * Creating a Request
+    RemoveNotificationChannel (..),
+    newRemoveNotificationChannel,
+
+    -- * Request Lenses
+    removeNotificationChannel_channelId,
+    removeNotificationChannel_profilingGroupName,
+
+    -- * Destructuring the Response
+    RemoveNotificationChannelResponse (..),
+    newRemoveNotificationChannelResponse,
+
+    -- * Response Lenses
+    removeNotificationChannelResponse_notificationConfiguration,
+    removeNotificationChannelResponse_httpStatus,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the RemoveNotificationChannelRequest.
+--
+-- /See:/ 'newRemoveNotificationChannel' smart constructor.
+data RemoveNotificationChannel = RemoveNotificationChannel'
+  { -- | The id of the channel that we want to stop receiving notifications.
+    channelId :: Prelude.Text,
+    -- | The name of the profiling group we want to change notification
+    -- configuration for.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RemoveNotificationChannel' 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:
+--
+-- 'channelId', 'removeNotificationChannel_channelId' - The id of the channel that we want to stop receiving notifications.
+--
+-- 'profilingGroupName', 'removeNotificationChannel_profilingGroupName' - The name of the profiling group we want to change notification
+-- configuration for.
+newRemoveNotificationChannel ::
+  -- | 'channelId'
+  Prelude.Text ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  RemoveNotificationChannel
+newRemoveNotificationChannel
+  pChannelId_
+  pProfilingGroupName_ =
+    RemoveNotificationChannel'
+      { channelId = pChannelId_,
+        profilingGroupName = pProfilingGroupName_
+      }
+
+-- | The id of the channel that we want to stop receiving notifications.
+removeNotificationChannel_channelId :: Lens.Lens' RemoveNotificationChannel Prelude.Text
+removeNotificationChannel_channelId = Lens.lens (\RemoveNotificationChannel' {channelId} -> channelId) (\s@RemoveNotificationChannel' {} a -> s {channelId = a} :: RemoveNotificationChannel)
+
+-- | The name of the profiling group we want to change notification
+-- configuration for.
+removeNotificationChannel_profilingGroupName :: Lens.Lens' RemoveNotificationChannel Prelude.Text
+removeNotificationChannel_profilingGroupName = Lens.lens (\RemoveNotificationChannel' {profilingGroupName} -> profilingGroupName) (\s@RemoveNotificationChannel' {} a -> s {profilingGroupName = a} :: RemoveNotificationChannel)
+
+instance Core.AWSRequest RemoveNotificationChannel where
+  type
+    AWSResponse RemoveNotificationChannel =
+      RemoveNotificationChannelResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          RemoveNotificationChannelResponse'
+            Prelude.<$> (x Data..?> "notificationConfiguration")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable RemoveNotificationChannel where
+  hashWithSalt _salt RemoveNotificationChannel' {..} =
+    _salt
+      `Prelude.hashWithSalt` channelId
+      `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData RemoveNotificationChannel where
+  rnf RemoveNotificationChannel' {..} =
+    Prelude.rnf channelId
+      `Prelude.seq` Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders RemoveNotificationChannel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath RemoveNotificationChannel where
+  toPath RemoveNotificationChannel' {..} =
+    Prelude.mconcat
+      [ "/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/notificationConfiguration/",
+        Data.toBS channelId
+      ]
+
+instance Data.ToQuery RemoveNotificationChannel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The structure representing the RemoveNotificationChannelResponse.
+--
+-- /See:/ 'newRemoveNotificationChannelResponse' smart constructor.
+data RemoveNotificationChannelResponse = RemoveNotificationChannelResponse'
+  { -- | The new notification configuration for this profiling group.
+    notificationConfiguration :: Prelude.Maybe NotificationConfiguration,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RemoveNotificationChannelResponse' 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:
+--
+-- 'notificationConfiguration', 'removeNotificationChannelResponse_notificationConfiguration' - The new notification configuration for this profiling group.
+--
+-- 'httpStatus', 'removeNotificationChannelResponse_httpStatus' - The response's http status code.
+newRemoveNotificationChannelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  RemoveNotificationChannelResponse
+newRemoveNotificationChannelResponse pHttpStatus_ =
+  RemoveNotificationChannelResponse'
+    { notificationConfiguration =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The new notification configuration for this profiling group.
+removeNotificationChannelResponse_notificationConfiguration :: Lens.Lens' RemoveNotificationChannelResponse (Prelude.Maybe NotificationConfiguration)
+removeNotificationChannelResponse_notificationConfiguration = Lens.lens (\RemoveNotificationChannelResponse' {notificationConfiguration} -> notificationConfiguration) (\s@RemoveNotificationChannelResponse' {} a -> s {notificationConfiguration = a} :: RemoveNotificationChannelResponse)
+
+-- | The response's http status code.
+removeNotificationChannelResponse_httpStatus :: Lens.Lens' RemoveNotificationChannelResponse Prelude.Int
+removeNotificationChannelResponse_httpStatus = Lens.lens (\RemoveNotificationChannelResponse' {httpStatus} -> httpStatus) (\s@RemoveNotificationChannelResponse' {} a -> s {httpStatus = a} :: RemoveNotificationChannelResponse)
+
+instance
+  Prelude.NFData
+    RemoveNotificationChannelResponse
+  where
+  rnf RemoveNotificationChannelResponse' {..} =
+    Prelude.rnf notificationConfiguration
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/CodeGuruProfiler/RemovePermission.hs b/gen/Amazonka/CodeGuruProfiler/RemovePermission.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/RemovePermission.hs
@@ -0,0 +1,255 @@
+{-# 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.CodeGuruProfiler.RemovePermission
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes permissions from a profiling group\'s resource-based policy that
+-- are provided using an action group. The one supported action group that
+-- can be removed is @agentPermission@ which grants @ConfigureAgent@ and
+-- @PostAgent@ permissions. For more information, see
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-ug/resource-based-policies.html Resource-based policies in CodeGuru Profiler>
+-- in the /Amazon CodeGuru Profiler User Guide/,
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ConfigureAgent.html ConfigureAgent>
+-- , and
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_PostAgentProfile.html PostAgentProfile>
+-- .
+module Amazonka.CodeGuruProfiler.RemovePermission
+  ( -- * Creating a Request
+    RemovePermission (..),
+    newRemovePermission,
+
+    -- * Request Lenses
+    removePermission_actionGroup,
+    removePermission_profilingGroupName,
+    removePermission_revisionId,
+
+    -- * Destructuring the Response
+    RemovePermissionResponse (..),
+    newRemovePermissionResponse,
+
+    -- * Response Lenses
+    removePermissionResponse_httpStatus,
+    removePermissionResponse_policy,
+    removePermissionResponse_revisionId,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | >  The structure representing the <code>removePermissionRequest</code>.</p>
+--
+-- /See:/ 'newRemovePermission' smart constructor.
+data RemovePermission = RemovePermission'
+  { -- | Specifies an action group that contains the permissions to remove from a
+    -- profiling group\'s resource-based policy. One action group is supported,
+    -- @agentPermissions@, which grants @ConfigureAgent@ and @PostAgentProfile@
+    -- permissions.
+    actionGroup :: ActionGroup,
+    -- | The name of the profiling group.
+    profilingGroupName :: Prelude.Text,
+    -- | A universally unique identifier (UUID) for the revision of the
+    -- resource-based policy from which you want to remove permissions.
+    revisionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RemovePermission' 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:
+--
+-- 'actionGroup', 'removePermission_actionGroup' - Specifies an action group that contains the permissions to remove from a
+-- profiling group\'s resource-based policy. One action group is supported,
+-- @agentPermissions@, which grants @ConfigureAgent@ and @PostAgentProfile@
+-- permissions.
+--
+-- 'profilingGroupName', 'removePermission_profilingGroupName' - The name of the profiling group.
+--
+-- 'revisionId', 'removePermission_revisionId' - A universally unique identifier (UUID) for the revision of the
+-- resource-based policy from which you want to remove permissions.
+newRemovePermission ::
+  -- | 'actionGroup'
+  ActionGroup ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  -- | 'revisionId'
+  Prelude.Text ->
+  RemovePermission
+newRemovePermission
+  pActionGroup_
+  pProfilingGroupName_
+  pRevisionId_ =
+    RemovePermission'
+      { actionGroup = pActionGroup_,
+        profilingGroupName = pProfilingGroupName_,
+        revisionId = pRevisionId_
+      }
+
+-- | Specifies an action group that contains the permissions to remove from a
+-- profiling group\'s resource-based policy. One action group is supported,
+-- @agentPermissions@, which grants @ConfigureAgent@ and @PostAgentProfile@
+-- permissions.
+removePermission_actionGroup :: Lens.Lens' RemovePermission ActionGroup
+removePermission_actionGroup = Lens.lens (\RemovePermission' {actionGroup} -> actionGroup) (\s@RemovePermission' {} a -> s {actionGroup = a} :: RemovePermission)
+
+-- | The name of the profiling group.
+removePermission_profilingGroupName :: Lens.Lens' RemovePermission Prelude.Text
+removePermission_profilingGroupName = Lens.lens (\RemovePermission' {profilingGroupName} -> profilingGroupName) (\s@RemovePermission' {} a -> s {profilingGroupName = a} :: RemovePermission)
+
+-- | A universally unique identifier (UUID) for the revision of the
+-- resource-based policy from which you want to remove permissions.
+removePermission_revisionId :: Lens.Lens' RemovePermission Prelude.Text
+removePermission_revisionId = Lens.lens (\RemovePermission' {revisionId} -> revisionId) (\s@RemovePermission' {} a -> s {revisionId = a} :: RemovePermission)
+
+instance Core.AWSRequest RemovePermission where
+  type
+    AWSResponse RemovePermission =
+      RemovePermissionResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          RemovePermissionResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "policy")
+            Prelude.<*> (x Data..:> "revisionId")
+      )
+
+instance Prelude.Hashable RemovePermission where
+  hashWithSalt _salt RemovePermission' {..} =
+    _salt
+      `Prelude.hashWithSalt` actionGroup
+      `Prelude.hashWithSalt` profilingGroupName
+      `Prelude.hashWithSalt` revisionId
+
+instance Prelude.NFData RemovePermission where
+  rnf RemovePermission' {..} =
+    Prelude.rnf actionGroup
+      `Prelude.seq` Prelude.rnf profilingGroupName
+      `Prelude.seq` Prelude.rnf revisionId
+
+instance Data.ToHeaders RemovePermission where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath RemovePermission where
+  toPath RemovePermission' {..} =
+    Prelude.mconcat
+      [ "/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/policy/",
+        Data.toBS actionGroup
+      ]
+
+instance Data.ToQuery RemovePermission where
+  toQuery RemovePermission' {..} =
+    Prelude.mconcat ["revisionId" Data.=: revisionId]
+
+-- | The structure representing the @removePermissionResponse@.
+--
+-- /See:/ 'newRemovePermissionResponse' smart constructor.
+data RemovePermissionResponse = RemovePermissionResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The JSON-formatted resource-based policy on the profiling group after
+    -- the specified permissions were removed.
+    policy :: Prelude.Text,
+    -- | A universally unique identifier (UUID) for the revision of the
+    -- resource-based policy after the specified permissions were removed. The
+    -- updated JSON-formatted policy is in the @policy@ element of the
+    -- response.
+    revisionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RemovePermissionResponse' 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:
+--
+-- 'httpStatus', 'removePermissionResponse_httpStatus' - The response's http status code.
+--
+-- 'policy', 'removePermissionResponse_policy' - The JSON-formatted resource-based policy on the profiling group after
+-- the specified permissions were removed.
+--
+-- 'revisionId', 'removePermissionResponse_revisionId' - A universally unique identifier (UUID) for the revision of the
+-- resource-based policy after the specified permissions were removed. The
+-- updated JSON-formatted policy is in the @policy@ element of the
+-- response.
+newRemovePermissionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'policy'
+  Prelude.Text ->
+  -- | 'revisionId'
+  Prelude.Text ->
+  RemovePermissionResponse
+newRemovePermissionResponse
+  pHttpStatus_
+  pPolicy_
+  pRevisionId_ =
+    RemovePermissionResponse'
+      { httpStatus =
+          pHttpStatus_,
+        policy = pPolicy_,
+        revisionId = pRevisionId_
+      }
+
+-- | The response's http status code.
+removePermissionResponse_httpStatus :: Lens.Lens' RemovePermissionResponse Prelude.Int
+removePermissionResponse_httpStatus = Lens.lens (\RemovePermissionResponse' {httpStatus} -> httpStatus) (\s@RemovePermissionResponse' {} a -> s {httpStatus = a} :: RemovePermissionResponse)
+
+-- | The JSON-formatted resource-based policy on the profiling group after
+-- the specified permissions were removed.
+removePermissionResponse_policy :: Lens.Lens' RemovePermissionResponse Prelude.Text
+removePermissionResponse_policy = Lens.lens (\RemovePermissionResponse' {policy} -> policy) (\s@RemovePermissionResponse' {} a -> s {policy = a} :: RemovePermissionResponse)
+
+-- | A universally unique identifier (UUID) for the revision of the
+-- resource-based policy after the specified permissions were removed. The
+-- updated JSON-formatted policy is in the @policy@ element of the
+-- response.
+removePermissionResponse_revisionId :: Lens.Lens' RemovePermissionResponse Prelude.Text
+removePermissionResponse_revisionId = Lens.lens (\RemovePermissionResponse' {revisionId} -> revisionId) (\s@RemovePermissionResponse' {} a -> s {revisionId = a} :: RemovePermissionResponse)
+
+instance Prelude.NFData RemovePermissionResponse where
+  rnf RemovePermissionResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf policy
+      `Prelude.seq` Prelude.rnf revisionId
diff --git a/gen/Amazonka/CodeGuruProfiler/SubmitFeedback.hs b/gen/Amazonka/CodeGuruProfiler/SubmitFeedback.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/SubmitFeedback.hs
@@ -0,0 +1,219 @@
+{-# 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.CodeGuruProfiler.SubmitFeedback
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Sends feedback to CodeGuru Profiler about whether the anomaly detected
+-- by the analysis is useful or not.
+module Amazonka.CodeGuruProfiler.SubmitFeedback
+  ( -- * Creating a Request
+    SubmitFeedback (..),
+    newSubmitFeedback,
+
+    -- * Request Lenses
+    submitFeedback_comment,
+    submitFeedback_anomalyInstanceId,
+    submitFeedback_profilingGroupName,
+    submitFeedback_type,
+
+    -- * Destructuring the Response
+    SubmitFeedbackResponse (..),
+    newSubmitFeedbackResponse,
+
+    -- * Response Lenses
+    submitFeedbackResponse_httpStatus,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the SubmitFeedbackRequest.
+--
+-- /See:/ 'newSubmitFeedback' smart constructor.
+data SubmitFeedback = SubmitFeedback'
+  { -- | Optional feedback about this anomaly.
+    comment :: Prelude.Maybe Prelude.Text,
+    -- | The universally unique identifier (UUID) of the
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AnomalyInstance.html AnomalyInstance>
+    -- object that is included in the analysis data.
+    anomalyInstanceId :: Prelude.Text,
+    -- | The name of the profiling group that is associated with the analysis
+    -- data.
+    profilingGroupName :: Prelude.Text,
+    -- | The feedback tpye. Thee are two valid values, @Positive@ and @Negative@.
+    type' :: FeedbackType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SubmitFeedback' 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:
+--
+-- 'comment', 'submitFeedback_comment' - Optional feedback about this anomaly.
+--
+-- 'anomalyInstanceId', 'submitFeedback_anomalyInstanceId' - The universally unique identifier (UUID) of the
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AnomalyInstance.html AnomalyInstance>
+-- object that is included in the analysis data.
+--
+-- 'profilingGroupName', 'submitFeedback_profilingGroupName' - The name of the profiling group that is associated with the analysis
+-- data.
+--
+-- 'type'', 'submitFeedback_type' - The feedback tpye. Thee are two valid values, @Positive@ and @Negative@.
+newSubmitFeedback ::
+  -- | 'anomalyInstanceId'
+  Prelude.Text ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  -- | 'type''
+  FeedbackType ->
+  SubmitFeedback
+newSubmitFeedback
+  pAnomalyInstanceId_
+  pProfilingGroupName_
+  pType_ =
+    SubmitFeedback'
+      { comment = Prelude.Nothing,
+        anomalyInstanceId = pAnomalyInstanceId_,
+        profilingGroupName = pProfilingGroupName_,
+        type' = pType_
+      }
+
+-- | Optional feedback about this anomaly.
+submitFeedback_comment :: Lens.Lens' SubmitFeedback (Prelude.Maybe Prelude.Text)
+submitFeedback_comment = Lens.lens (\SubmitFeedback' {comment} -> comment) (\s@SubmitFeedback' {} a -> s {comment = a} :: SubmitFeedback)
+
+-- | The universally unique identifier (UUID) of the
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AnomalyInstance.html AnomalyInstance>
+-- object that is included in the analysis data.
+submitFeedback_anomalyInstanceId :: Lens.Lens' SubmitFeedback Prelude.Text
+submitFeedback_anomalyInstanceId = Lens.lens (\SubmitFeedback' {anomalyInstanceId} -> anomalyInstanceId) (\s@SubmitFeedback' {} a -> s {anomalyInstanceId = a} :: SubmitFeedback)
+
+-- | The name of the profiling group that is associated with the analysis
+-- data.
+submitFeedback_profilingGroupName :: Lens.Lens' SubmitFeedback Prelude.Text
+submitFeedback_profilingGroupName = Lens.lens (\SubmitFeedback' {profilingGroupName} -> profilingGroupName) (\s@SubmitFeedback' {} a -> s {profilingGroupName = a} :: SubmitFeedback)
+
+-- | The feedback tpye. Thee are two valid values, @Positive@ and @Negative@.
+submitFeedback_type :: Lens.Lens' SubmitFeedback FeedbackType
+submitFeedback_type = Lens.lens (\SubmitFeedback' {type'} -> type') (\s@SubmitFeedback' {} a -> s {type' = a} :: SubmitFeedback)
+
+instance Core.AWSRequest SubmitFeedback where
+  type
+    AWSResponse SubmitFeedback =
+      SubmitFeedbackResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          SubmitFeedbackResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable SubmitFeedback where
+  hashWithSalt _salt SubmitFeedback' {..} =
+    _salt
+      `Prelude.hashWithSalt` comment
+      `Prelude.hashWithSalt` anomalyInstanceId
+      `Prelude.hashWithSalt` profilingGroupName
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData SubmitFeedback where
+  rnf SubmitFeedback' {..} =
+    Prelude.rnf comment
+      `Prelude.seq` Prelude.rnf anomalyInstanceId
+      `Prelude.seq` Prelude.rnf profilingGroupName
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToHeaders SubmitFeedback where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON SubmitFeedback where
+  toJSON SubmitFeedback' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("comment" Data..=) Prelude.<$> comment,
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
+
+instance Data.ToPath SubmitFeedback where
+  toPath SubmitFeedback' {..} =
+    Prelude.mconcat
+      [ "/internal/profilingGroups/",
+        Data.toBS profilingGroupName,
+        "/anomalies/",
+        Data.toBS anomalyInstanceId,
+        "/feedback"
+      ]
+
+instance Data.ToQuery SubmitFeedback where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The structure representing the SubmitFeedbackResponse.
+--
+-- /See:/ 'newSubmitFeedbackResponse' smart constructor.
+data SubmitFeedbackResponse = SubmitFeedbackResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SubmitFeedbackResponse' 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:
+--
+-- 'httpStatus', 'submitFeedbackResponse_httpStatus' - The response's http status code.
+newSubmitFeedbackResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  SubmitFeedbackResponse
+newSubmitFeedbackResponse pHttpStatus_ =
+  SubmitFeedbackResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+submitFeedbackResponse_httpStatus :: Lens.Lens' SubmitFeedbackResponse Prelude.Int
+submitFeedbackResponse_httpStatus = Lens.lens (\SubmitFeedbackResponse' {httpStatus} -> httpStatus) (\s@SubmitFeedbackResponse' {} a -> s {httpStatus = a} :: SubmitFeedbackResponse)
+
+instance Prelude.NFData SubmitFeedbackResponse where
+  rnf SubmitFeedbackResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/CodeGuruProfiler/TagResource.hs b/gen/Amazonka/CodeGuruProfiler/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/TagResource.hs
@@ -0,0 +1,166 @@
+{-# 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.CodeGuruProfiler.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Use to assign one or more tags to a resource.
+module Amazonka.CodeGuruProfiler.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource that the tags are added
+    -- to.
+    resourceArn :: Prelude.Text,
+    -- | The list of tags that are added to the specified resource.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' 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:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource that the tags are added
+-- to.
+--
+-- 'tags', 'tagResource_tags' - The list of tags that are added to the specified resource.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource that the tags are added
+-- to.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | The list of tags that are added to the specified resource.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.HashMap Prelude.Text Prelude.Text)
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("tags" Data..= tags)]
+      )
+
+instance Data.ToPath TagResource where
+  toPath TagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' 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:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/CodeGuruProfiler/Types.hs b/gen/Amazonka/CodeGuruProfiler/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types.hs
@@ -0,0 +1,348 @@
+{-# 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.CodeGuruProfiler.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.CodeGuruProfiler.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _ConflictException,
+    _InternalServerException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * ActionGroup
+    ActionGroup (..),
+
+    -- * AgentParameterField
+    AgentParameterField (..),
+
+    -- * AggregationPeriod
+    AggregationPeriod (..),
+
+    -- * ComputePlatform
+    ComputePlatform (..),
+
+    -- * EventPublisher
+    EventPublisher (..),
+
+    -- * FeedbackType
+    FeedbackType (..),
+
+    -- * MetadataField
+    MetadataField (..),
+
+    -- * MetricType
+    MetricType (..),
+
+    -- * OrderBy
+    OrderBy (..),
+
+    -- * AgentConfiguration
+    AgentConfiguration (..),
+    newAgentConfiguration,
+    agentConfiguration_agentParameters,
+    agentConfiguration_periodInSeconds,
+    agentConfiguration_shouldProfile,
+
+    -- * AgentOrchestrationConfig
+    AgentOrchestrationConfig (..),
+    newAgentOrchestrationConfig,
+    agentOrchestrationConfig_profilingEnabled,
+
+    -- * AggregatedProfileTime
+    AggregatedProfileTime (..),
+    newAggregatedProfileTime,
+    aggregatedProfileTime_period,
+    aggregatedProfileTime_start,
+
+    -- * Anomaly
+    Anomaly (..),
+    newAnomaly,
+    anomaly_instances,
+    anomaly_metric,
+    anomaly_reason,
+
+    -- * AnomalyInstance
+    AnomalyInstance (..),
+    newAnomalyInstance,
+    anomalyInstance_endTime,
+    anomalyInstance_userFeedback,
+    anomalyInstance_id,
+    anomalyInstance_startTime,
+
+    -- * Channel
+    Channel (..),
+    newChannel,
+    channel_id,
+    channel_eventPublishers,
+    channel_uri,
+
+    -- * FindingsReportSummary
+    FindingsReportSummary (..),
+    newFindingsReportSummary,
+    findingsReportSummary_id,
+    findingsReportSummary_profileEndTime,
+    findingsReportSummary_profileStartTime,
+    findingsReportSummary_profilingGroupName,
+    findingsReportSummary_totalNumberOfFindings,
+
+    -- * FrameMetric
+    FrameMetric (..),
+    newFrameMetric,
+    frameMetric_frameName,
+    frameMetric_threadStates,
+    frameMetric_type,
+
+    -- * FrameMetricDatum
+    FrameMetricDatum (..),
+    newFrameMetricDatum,
+    frameMetricDatum_frameMetric,
+    frameMetricDatum_values,
+
+    -- * Match
+    Match (..),
+    newMatch,
+    match_frameAddress,
+    match_targetFramesIndex,
+    match_thresholdBreachValue,
+
+    -- * Metric
+    Metric (..),
+    newMetric,
+    metric_frameName,
+    metric_threadStates,
+    metric_type,
+
+    -- * NotificationConfiguration
+    NotificationConfiguration (..),
+    newNotificationConfiguration,
+    notificationConfiguration_channels,
+
+    -- * Pattern
+    Pattern (..),
+    newPattern,
+    pattern_countersToAggregate,
+    pattern_description,
+    pattern_id,
+    pattern_name,
+    pattern_resolutionSteps,
+    pattern_targetFrames,
+    pattern_thresholdPercent,
+
+    -- * ProfileTime
+    ProfileTime (..),
+    newProfileTime,
+    profileTime_start,
+
+    -- * ProfilingGroupDescription
+    ProfilingGroupDescription (..),
+    newProfilingGroupDescription,
+    profilingGroupDescription_agentOrchestrationConfig,
+    profilingGroupDescription_arn,
+    profilingGroupDescription_computePlatform,
+    profilingGroupDescription_createdAt,
+    profilingGroupDescription_name,
+    profilingGroupDescription_profilingStatus,
+    profilingGroupDescription_tags,
+    profilingGroupDescription_updatedAt,
+
+    -- * ProfilingStatus
+    ProfilingStatus (..),
+    newProfilingStatus,
+    profilingStatus_latestAgentOrchestratedAt,
+    profilingStatus_latestAgentProfileReportedAt,
+    profilingStatus_latestAggregatedProfile,
+
+    -- * Recommendation
+    Recommendation (..),
+    newRecommendation,
+    recommendation_allMatchesCount,
+    recommendation_allMatchesSum,
+    recommendation_endTime,
+    recommendation_pattern,
+    recommendation_startTime,
+    recommendation_topMatches,
+
+    -- * TimestampStructure
+    TimestampStructure (..),
+    newTimestampStructure,
+    timestampStructure_value,
+
+    -- * UserFeedback
+    UserFeedback (..),
+    newUserFeedback,
+    userFeedback_type,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types.ActionGroup
+import Amazonka.CodeGuruProfiler.Types.AgentConfiguration
+import Amazonka.CodeGuruProfiler.Types.AgentOrchestrationConfig
+import Amazonka.CodeGuruProfiler.Types.AgentParameterField
+import Amazonka.CodeGuruProfiler.Types.AggregatedProfileTime
+import Amazonka.CodeGuruProfiler.Types.AggregationPeriod
+import Amazonka.CodeGuruProfiler.Types.Anomaly
+import Amazonka.CodeGuruProfiler.Types.AnomalyInstance
+import Amazonka.CodeGuruProfiler.Types.Channel
+import Amazonka.CodeGuruProfiler.Types.ComputePlatform
+import Amazonka.CodeGuruProfiler.Types.EventPublisher
+import Amazonka.CodeGuruProfiler.Types.FeedbackType
+import Amazonka.CodeGuruProfiler.Types.FindingsReportSummary
+import Amazonka.CodeGuruProfiler.Types.FrameMetric
+import Amazonka.CodeGuruProfiler.Types.FrameMetricDatum
+import Amazonka.CodeGuruProfiler.Types.Match
+import Amazonka.CodeGuruProfiler.Types.MetadataField
+import Amazonka.CodeGuruProfiler.Types.Metric
+import Amazonka.CodeGuruProfiler.Types.MetricType
+import Amazonka.CodeGuruProfiler.Types.NotificationConfiguration
+import Amazonka.CodeGuruProfiler.Types.OrderBy
+import Amazonka.CodeGuruProfiler.Types.Pattern
+import Amazonka.CodeGuruProfiler.Types.ProfileTime
+import Amazonka.CodeGuruProfiler.Types.ProfilingGroupDescription
+import Amazonka.CodeGuruProfiler.Types.ProfilingStatus
+import Amazonka.CodeGuruProfiler.Types.Recommendation
+import Amazonka.CodeGuruProfiler.Types.TimestampStructure
+import Amazonka.CodeGuruProfiler.Types.UserFeedback
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2019-07-18@ of the Amazon CodeGuru Profiler SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "CodeGuruProfiler",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "codeguru-profiler",
+      Core.signingName = "codeguru-profiler",
+      Core.version = "2019-07-18",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "CodeGuruProfiler",
+      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 requested operation would cause a conflict with the current state of
+-- a service resource associated with the request. Resolve the conflict
+-- before retrying this request.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | The server encountered an internal error and is unable to complete the
+-- request.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+-- | The resource specified in the request does not exist.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | You have exceeded your service quota. To perform the requested action,
+-- remove some of the relevant resources, or use
+-- <https://docs.aws.amazon.com/servicequotas/latest/userguide/intro.html Service Quotas>
+-- to request a service quota increase.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+    Prelude.. Core.hasStatus 402
+
+-- | The request was denied due to request throttling.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+-- | The parameter is not valid.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/ActionGroup.hs b/gen/Amazonka/CodeGuruProfiler/Types/ActionGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/ActionGroup.hs
@@ -0,0 +1,66 @@
+{-# 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.CodeGuruProfiler.Types.ActionGroup
+-- 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.CodeGuruProfiler.Types.ActionGroup
+  ( ActionGroup
+      ( ..,
+        ActionGroup_AgentPermissions
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ActionGroup = ActionGroup'
+  { fromActionGroup ::
+      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 ActionGroup_AgentPermissions :: ActionGroup
+pattern ActionGroup_AgentPermissions = ActionGroup' "agentPermissions"
+
+{-# COMPLETE
+  ActionGroup_AgentPermissions,
+  ActionGroup'
+  #-}
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/AgentConfiguration.hs b/gen/Amazonka/CodeGuruProfiler/Types/AgentConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/AgentConfiguration.hs
@@ -0,0 +1,182 @@
+{-# 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.CodeGuruProfiler.Types.AgentConfiguration
+-- 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.CodeGuruProfiler.Types.AgentConfiguration where
+
+import Amazonka.CodeGuruProfiler.Types.AgentParameterField
+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 response of
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ConfigureAgent.html ConfigureAgent>
+-- that specifies if an agent profiles or not and for how long to return
+-- profiling data.
+--
+-- /See:/ 'newAgentConfiguration' smart constructor.
+data AgentConfiguration = AgentConfiguration'
+  { -- | Parameters used by the profiler. The valid parameters are:
+    --
+    -- -   @MaxStackDepth@ - The maximum depth of the stacks in the code that
+    --     is represented in the profile. For example, if CodeGuru Profiler
+    --     finds a method @A@, which calls method @B@, which calls method @C@,
+    --     which calls method @D@, then the depth is 4. If the @maxDepth@ is
+    --     set to 2, then the profiler evaluates @A@ and @B@.
+    --
+    -- -   @MemoryUsageLimitPercent@ - The percentage of memory that is used by
+    --     the profiler.
+    --
+    -- -   @MinimumTimeForReportingInMilliseconds@ - The minimum time in
+    --     milliseconds between sending reports.
+    --
+    -- -   @ReportingIntervalInMilliseconds@ - The reporting interval in
+    --     milliseconds used to report profiles.
+    --
+    -- -   @SamplingIntervalInMilliseconds@ - The sampling interval in
+    --     milliseconds that is used to profile samples.
+    agentParameters :: Prelude.Maybe (Prelude.HashMap AgentParameterField Prelude.Text),
+    -- | How long a profiling agent should send profiling data using
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ConfigureAgent.html ConfigureAgent>
+    -- . For example, if this is set to 300, the profiling agent calls
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ConfigureAgent.html ConfigureAgent>
+    -- every 5 minutes to submit the profiled data collected during that
+    -- period.
+    periodInSeconds :: Prelude.Int,
+    -- | A @Boolean@ that specifies whether the profiling agent collects
+    -- profiling data or not. Set to @true@ to enable profiling.
+    shouldProfile :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AgentConfiguration' 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:
+--
+-- 'agentParameters', 'agentConfiguration_agentParameters' - Parameters used by the profiler. The valid parameters are:
+--
+-- -   @MaxStackDepth@ - The maximum depth of the stacks in the code that
+--     is represented in the profile. For example, if CodeGuru Profiler
+--     finds a method @A@, which calls method @B@, which calls method @C@,
+--     which calls method @D@, then the depth is 4. If the @maxDepth@ is
+--     set to 2, then the profiler evaluates @A@ and @B@.
+--
+-- -   @MemoryUsageLimitPercent@ - The percentage of memory that is used by
+--     the profiler.
+--
+-- -   @MinimumTimeForReportingInMilliseconds@ - The minimum time in
+--     milliseconds between sending reports.
+--
+-- -   @ReportingIntervalInMilliseconds@ - The reporting interval in
+--     milliseconds used to report profiles.
+--
+-- -   @SamplingIntervalInMilliseconds@ - The sampling interval in
+--     milliseconds that is used to profile samples.
+--
+-- 'periodInSeconds', 'agentConfiguration_periodInSeconds' - How long a profiling agent should send profiling data using
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ConfigureAgent.html ConfigureAgent>
+-- . For example, if this is set to 300, the profiling agent calls
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ConfigureAgent.html ConfigureAgent>
+-- every 5 minutes to submit the profiled data collected during that
+-- period.
+--
+-- 'shouldProfile', 'agentConfiguration_shouldProfile' - A @Boolean@ that specifies whether the profiling agent collects
+-- profiling data or not. Set to @true@ to enable profiling.
+newAgentConfiguration ::
+  -- | 'periodInSeconds'
+  Prelude.Int ->
+  -- | 'shouldProfile'
+  Prelude.Bool ->
+  AgentConfiguration
+newAgentConfiguration
+  pPeriodInSeconds_
+  pShouldProfile_ =
+    AgentConfiguration'
+      { agentParameters =
+          Prelude.Nothing,
+        periodInSeconds = pPeriodInSeconds_,
+        shouldProfile = pShouldProfile_
+      }
+
+-- | Parameters used by the profiler. The valid parameters are:
+--
+-- -   @MaxStackDepth@ - The maximum depth of the stacks in the code that
+--     is represented in the profile. For example, if CodeGuru Profiler
+--     finds a method @A@, which calls method @B@, which calls method @C@,
+--     which calls method @D@, then the depth is 4. If the @maxDepth@ is
+--     set to 2, then the profiler evaluates @A@ and @B@.
+--
+-- -   @MemoryUsageLimitPercent@ - The percentage of memory that is used by
+--     the profiler.
+--
+-- -   @MinimumTimeForReportingInMilliseconds@ - The minimum time in
+--     milliseconds between sending reports.
+--
+-- -   @ReportingIntervalInMilliseconds@ - The reporting interval in
+--     milliseconds used to report profiles.
+--
+-- -   @SamplingIntervalInMilliseconds@ - The sampling interval in
+--     milliseconds that is used to profile samples.
+agentConfiguration_agentParameters :: Lens.Lens' AgentConfiguration (Prelude.Maybe (Prelude.HashMap AgentParameterField Prelude.Text))
+agentConfiguration_agentParameters = Lens.lens (\AgentConfiguration' {agentParameters} -> agentParameters) (\s@AgentConfiguration' {} a -> s {agentParameters = a} :: AgentConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | How long a profiling agent should send profiling data using
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ConfigureAgent.html ConfigureAgent>
+-- . For example, if this is set to 300, the profiling agent calls
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ConfigureAgent.html ConfigureAgent>
+-- every 5 minutes to submit the profiled data collected during that
+-- period.
+agentConfiguration_periodInSeconds :: Lens.Lens' AgentConfiguration Prelude.Int
+agentConfiguration_periodInSeconds = Lens.lens (\AgentConfiguration' {periodInSeconds} -> periodInSeconds) (\s@AgentConfiguration' {} a -> s {periodInSeconds = a} :: AgentConfiguration)
+
+-- | A @Boolean@ that specifies whether the profiling agent collects
+-- profiling data or not. Set to @true@ to enable profiling.
+agentConfiguration_shouldProfile :: Lens.Lens' AgentConfiguration Prelude.Bool
+agentConfiguration_shouldProfile = Lens.lens (\AgentConfiguration' {shouldProfile} -> shouldProfile) (\s@AgentConfiguration' {} a -> s {shouldProfile = a} :: AgentConfiguration)
+
+instance Data.FromJSON AgentConfiguration where
+  parseJSON =
+    Data.withObject
+      "AgentConfiguration"
+      ( \x ->
+          AgentConfiguration'
+            Prelude.<$> ( x
+                            Data..:? "agentParameters"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..: "periodInSeconds")
+            Prelude.<*> (x Data..: "shouldProfile")
+      )
+
+instance Prelude.Hashable AgentConfiguration where
+  hashWithSalt _salt AgentConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` agentParameters
+      `Prelude.hashWithSalt` periodInSeconds
+      `Prelude.hashWithSalt` shouldProfile
+
+instance Prelude.NFData AgentConfiguration where
+  rnf AgentConfiguration' {..} =
+    Prelude.rnf agentParameters
+      `Prelude.seq` Prelude.rnf periodInSeconds
+      `Prelude.seq` Prelude.rnf shouldProfile
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/AgentOrchestrationConfig.hs b/gen/Amazonka/CodeGuruProfiler/Types/AgentOrchestrationConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/AgentOrchestrationConfig.hs
@@ -0,0 +1,89 @@
+{-# 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.CodeGuruProfiler.Types.AgentOrchestrationConfig
+-- 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.CodeGuruProfiler.Types.AgentOrchestrationConfig 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
+
+-- | Specifies whether profiling is enabled or disabled for a profiling
+-- group. It is used by
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ConfigureAgent.html ConfigureAgent>
+-- to enable or disable profiling for a profiling group.
+--
+-- /See:/ 'newAgentOrchestrationConfig' smart constructor.
+data AgentOrchestrationConfig = AgentOrchestrationConfig'
+  { -- | A @Boolean@ that specifies whether the profiling agent collects
+    -- profiling data or not. Set to @true@ to enable profiling.
+    profilingEnabled :: Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AgentOrchestrationConfig' 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:
+--
+-- 'profilingEnabled', 'agentOrchestrationConfig_profilingEnabled' - A @Boolean@ that specifies whether the profiling agent collects
+-- profiling data or not. Set to @true@ to enable profiling.
+newAgentOrchestrationConfig ::
+  -- | 'profilingEnabled'
+  Prelude.Bool ->
+  AgentOrchestrationConfig
+newAgentOrchestrationConfig pProfilingEnabled_ =
+  AgentOrchestrationConfig'
+    { profilingEnabled =
+        pProfilingEnabled_
+    }
+
+-- | A @Boolean@ that specifies whether the profiling agent collects
+-- profiling data or not. Set to @true@ to enable profiling.
+agentOrchestrationConfig_profilingEnabled :: Lens.Lens' AgentOrchestrationConfig Prelude.Bool
+agentOrchestrationConfig_profilingEnabled = Lens.lens (\AgentOrchestrationConfig' {profilingEnabled} -> profilingEnabled) (\s@AgentOrchestrationConfig' {} a -> s {profilingEnabled = a} :: AgentOrchestrationConfig)
+
+instance Data.FromJSON AgentOrchestrationConfig where
+  parseJSON =
+    Data.withObject
+      "AgentOrchestrationConfig"
+      ( \x ->
+          AgentOrchestrationConfig'
+            Prelude.<$> (x Data..: "profilingEnabled")
+      )
+
+instance Prelude.Hashable AgentOrchestrationConfig where
+  hashWithSalt _salt AgentOrchestrationConfig' {..} =
+    _salt `Prelude.hashWithSalt` profilingEnabled
+
+instance Prelude.NFData AgentOrchestrationConfig where
+  rnf AgentOrchestrationConfig' {..} =
+    Prelude.rnf profilingEnabled
+
+instance Data.ToJSON AgentOrchestrationConfig where
+  toJSON AgentOrchestrationConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("profilingEnabled" Data..= profilingEnabled)
+          ]
+      )
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/AgentParameterField.hs b/gen/Amazonka/CodeGuruProfiler/Types/AgentParameterField.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/AgentParameterField.hs
@@ -0,0 +1,86 @@
+{-# 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.CodeGuruProfiler.Types.AgentParameterField
+-- 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.CodeGuruProfiler.Types.AgentParameterField
+  ( AgentParameterField
+      ( ..,
+        AgentParameterField_MaxStackDepth,
+        AgentParameterField_MemoryUsageLimitPercent,
+        AgentParameterField_MinimumTimeForReportingInMilliseconds,
+        AgentParameterField_ReportingIntervalInMilliseconds,
+        AgentParameterField_SamplingIntervalInMilliseconds
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AgentParameterField = AgentParameterField'
+  { fromAgentParameterField ::
+      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 AgentParameterField_MaxStackDepth :: AgentParameterField
+pattern AgentParameterField_MaxStackDepth = AgentParameterField' "MaxStackDepth"
+
+pattern AgentParameterField_MemoryUsageLimitPercent :: AgentParameterField
+pattern AgentParameterField_MemoryUsageLimitPercent = AgentParameterField' "MemoryUsageLimitPercent"
+
+pattern AgentParameterField_MinimumTimeForReportingInMilliseconds :: AgentParameterField
+pattern AgentParameterField_MinimumTimeForReportingInMilliseconds = AgentParameterField' "MinimumTimeForReportingInMilliseconds"
+
+pattern AgentParameterField_ReportingIntervalInMilliseconds :: AgentParameterField
+pattern AgentParameterField_ReportingIntervalInMilliseconds = AgentParameterField' "ReportingIntervalInMilliseconds"
+
+pattern AgentParameterField_SamplingIntervalInMilliseconds :: AgentParameterField
+pattern AgentParameterField_SamplingIntervalInMilliseconds = AgentParameterField' "SamplingIntervalInMilliseconds"
+
+{-# COMPLETE
+  AgentParameterField_MaxStackDepth,
+  AgentParameterField_MemoryUsageLimitPercent,
+  AgentParameterField_MinimumTimeForReportingInMilliseconds,
+  AgentParameterField_ReportingIntervalInMilliseconds,
+  AgentParameterField_SamplingIntervalInMilliseconds,
+  AgentParameterField'
+  #-}
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/AggregatedProfileTime.hs b/gen/Amazonka/CodeGuruProfiler/Types/AggregatedProfileTime.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/AggregatedProfileTime.hs
@@ -0,0 +1,135 @@
+{-# 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.CodeGuruProfiler.Types.AggregatedProfileTime
+-- 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.CodeGuruProfiler.Types.AggregatedProfileTime where
+
+import Amazonka.CodeGuruProfiler.Types.AggregationPeriod
+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
+
+-- | Specifies the aggregation period and aggregation start time for an
+-- aggregated profile. An aggregated profile is used to collect posted
+-- agent profiles during an aggregation period. There are three possible
+-- aggregation periods (1 day, 1 hour, or 5 minutes).
+--
+-- /See:/ 'newAggregatedProfileTime' smart constructor.
+data AggregatedProfileTime = AggregatedProfileTime'
+  { -- | The aggregation period. This indicates the period during which an
+    -- aggregation profile collects posted agent profiles for a profiling
+    -- group. Use one of three valid durations that are specified using the ISO
+    -- 8601 format.
+    --
+    -- -   @P1D@ — 1 day
+    --
+    -- -   @PT1H@ — 1 hour
+    --
+    -- -   @PT5M@ — 5 minutes
+    period :: Prelude.Maybe AggregationPeriod,
+    -- | The time that aggregation of posted agent profiles for a profiling group
+    -- starts. The aggregation profile contains profiles posted by the agent
+    -- starting at this time for an aggregation period specified by the
+    -- @period@ property of the @AggregatedProfileTime@ object.
+    --
+    -- Specify @start@ using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    start :: Prelude.Maybe Data.ISO8601
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AggregatedProfileTime' 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:
+--
+-- 'period', 'aggregatedProfileTime_period' - The aggregation period. This indicates the period during which an
+-- aggregation profile collects posted agent profiles for a profiling
+-- group. Use one of three valid durations that are specified using the ISO
+-- 8601 format.
+--
+-- -   @P1D@ — 1 day
+--
+-- -   @PT1H@ — 1 hour
+--
+-- -   @PT5M@ — 5 minutes
+--
+-- 'start', 'aggregatedProfileTime_start' - The time that aggregation of posted agent profiles for a profiling group
+-- starts. The aggregation profile contains profiles posted by the agent
+-- starting at this time for an aggregation period specified by the
+-- @period@ property of the @AggregatedProfileTime@ object.
+--
+-- Specify @start@ using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+newAggregatedProfileTime ::
+  AggregatedProfileTime
+newAggregatedProfileTime =
+  AggregatedProfileTime'
+    { period = Prelude.Nothing,
+      start = Prelude.Nothing
+    }
+
+-- | The aggregation period. This indicates the period during which an
+-- aggregation profile collects posted agent profiles for a profiling
+-- group. Use one of three valid durations that are specified using the ISO
+-- 8601 format.
+--
+-- -   @P1D@ — 1 day
+--
+-- -   @PT1H@ — 1 hour
+--
+-- -   @PT5M@ — 5 minutes
+aggregatedProfileTime_period :: Lens.Lens' AggregatedProfileTime (Prelude.Maybe AggregationPeriod)
+aggregatedProfileTime_period = Lens.lens (\AggregatedProfileTime' {period} -> period) (\s@AggregatedProfileTime' {} a -> s {period = a} :: AggregatedProfileTime)
+
+-- | The time that aggregation of posted agent profiles for a profiling group
+-- starts. The aggregation profile contains profiles posted by the agent
+-- starting at this time for an aggregation period specified by the
+-- @period@ property of the @AggregatedProfileTime@ object.
+--
+-- Specify @start@ using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+aggregatedProfileTime_start :: Lens.Lens' AggregatedProfileTime (Prelude.Maybe Prelude.UTCTime)
+aggregatedProfileTime_start = Lens.lens (\AggregatedProfileTime' {start} -> start) (\s@AggregatedProfileTime' {} a -> s {start = a} :: AggregatedProfileTime) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON AggregatedProfileTime where
+  parseJSON =
+    Data.withObject
+      "AggregatedProfileTime"
+      ( \x ->
+          AggregatedProfileTime'
+            Prelude.<$> (x Data..:? "period")
+            Prelude.<*> (x Data..:? "start")
+      )
+
+instance Prelude.Hashable AggregatedProfileTime where
+  hashWithSalt _salt AggregatedProfileTime' {..} =
+    _salt
+      `Prelude.hashWithSalt` period
+      `Prelude.hashWithSalt` start
+
+instance Prelude.NFData AggregatedProfileTime where
+  rnf AggregatedProfileTime' {..} =
+    Prelude.rnf period `Prelude.seq` Prelude.rnf start
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/AggregationPeriod.hs b/gen/Amazonka/CodeGuruProfiler/Types/AggregationPeriod.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/AggregationPeriod.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.CodeGuruProfiler.Types.AggregationPeriod
+-- 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.CodeGuruProfiler.Types.AggregationPeriod
+  ( AggregationPeriod
+      ( ..,
+        AggregationPeriod_P1D,
+        AggregationPeriod_PT1H,
+        AggregationPeriod_PT5M
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AggregationPeriod = AggregationPeriod'
+  { fromAggregationPeriod ::
+      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 AggregationPeriod_P1D :: AggregationPeriod
+pattern AggregationPeriod_P1D = AggregationPeriod' "P1D"
+
+pattern AggregationPeriod_PT1H :: AggregationPeriod
+pattern AggregationPeriod_PT1H = AggregationPeriod' "PT1H"
+
+pattern AggregationPeriod_PT5M :: AggregationPeriod
+pattern AggregationPeriod_PT5M = AggregationPeriod' "PT5M"
+
+{-# COMPLETE
+  AggregationPeriod_P1D,
+  AggregationPeriod_PT1H,
+  AggregationPeriod_PT5M,
+  AggregationPeriod'
+  #-}
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/Anomaly.hs b/gen/Amazonka/CodeGuruProfiler/Types/Anomaly.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/Anomaly.hs
@@ -0,0 +1,116 @@
+{-# 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.CodeGuruProfiler.Types.Anomaly
+-- 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.CodeGuruProfiler.Types.Anomaly where
+
+import Amazonka.CodeGuruProfiler.Types.AnomalyInstance
+import Amazonka.CodeGuruProfiler.Types.Metric
+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
+
+-- | Details about an anomaly in a specific metric of application profile.
+-- The anomaly is detected using analysis of the metric data over a period
+-- of time.
+--
+-- /See:/ 'newAnomaly' smart constructor.
+data Anomaly = Anomaly'
+  { -- | A list of the instances of the detected anomalies during the requested
+    -- period.
+    instances :: [AnomalyInstance],
+    -- | Details about the metric that the analysis used when it detected the
+    -- anomaly. The metric includes the name of the frame that was analyzed
+    -- with the type and thread states used to derive the metric value for that
+    -- frame.
+    metric :: Metric,
+    -- | The reason for which metric was flagged as anomalous.
+    reason :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Anomaly' 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:
+--
+-- 'instances', 'anomaly_instances' - A list of the instances of the detected anomalies during the requested
+-- period.
+--
+-- 'metric', 'anomaly_metric' - Details about the metric that the analysis used when it detected the
+-- anomaly. The metric includes the name of the frame that was analyzed
+-- with the type and thread states used to derive the metric value for that
+-- frame.
+--
+-- 'reason', 'anomaly_reason' - The reason for which metric was flagged as anomalous.
+newAnomaly ::
+  -- | 'metric'
+  Metric ->
+  -- | 'reason'
+  Prelude.Text ->
+  Anomaly
+newAnomaly pMetric_ pReason_ =
+  Anomaly'
+    { instances = Prelude.mempty,
+      metric = pMetric_,
+      reason = pReason_
+    }
+
+-- | A list of the instances of the detected anomalies during the requested
+-- period.
+anomaly_instances :: Lens.Lens' Anomaly [AnomalyInstance]
+anomaly_instances = Lens.lens (\Anomaly' {instances} -> instances) (\s@Anomaly' {} a -> s {instances = a} :: Anomaly) Prelude.. Lens.coerced
+
+-- | Details about the metric that the analysis used when it detected the
+-- anomaly. The metric includes the name of the frame that was analyzed
+-- with the type and thread states used to derive the metric value for that
+-- frame.
+anomaly_metric :: Lens.Lens' Anomaly Metric
+anomaly_metric = Lens.lens (\Anomaly' {metric} -> metric) (\s@Anomaly' {} a -> s {metric = a} :: Anomaly)
+
+-- | The reason for which metric was flagged as anomalous.
+anomaly_reason :: Lens.Lens' Anomaly Prelude.Text
+anomaly_reason = Lens.lens (\Anomaly' {reason} -> reason) (\s@Anomaly' {} a -> s {reason = a} :: Anomaly)
+
+instance Data.FromJSON Anomaly where
+  parseJSON =
+    Data.withObject
+      "Anomaly"
+      ( \x ->
+          Anomaly'
+            Prelude.<$> (x Data..:? "instances" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "metric")
+            Prelude.<*> (x Data..: "reason")
+      )
+
+instance Prelude.Hashable Anomaly where
+  hashWithSalt _salt Anomaly' {..} =
+    _salt
+      `Prelude.hashWithSalt` instances
+      `Prelude.hashWithSalt` metric
+      `Prelude.hashWithSalt` reason
+
+instance Prelude.NFData Anomaly where
+  rnf Anomaly' {..} =
+    Prelude.rnf instances
+      `Prelude.seq` Prelude.rnf metric
+      `Prelude.seq` Prelude.rnf reason
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/AnomalyInstance.hs b/gen/Amazonka/CodeGuruProfiler/Types/AnomalyInstance.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/AnomalyInstance.hs
@@ -0,0 +1,134 @@
+{-# 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.CodeGuruProfiler.Types.AnomalyInstance
+-- 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.CodeGuruProfiler.Types.AnomalyInstance where
+
+import Amazonka.CodeGuruProfiler.Types.UserFeedback
+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 specific duration in which the metric is flagged as anomalous.
+--
+-- /See:/ 'newAnomalyInstance' smart constructor.
+data AnomalyInstance = AnomalyInstance'
+  { -- | The end time of the period during which the metric is flagged as
+    -- anomalous. This is specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    endTime :: Prelude.Maybe Data.ISO8601,
+    -- | Feedback type on a specific instance of anomaly submitted by the user.
+    userFeedback :: Prelude.Maybe UserFeedback,
+    -- | The universally unique identifier (UUID) of an instance of an anomaly in
+    -- a metric.
+    id :: Prelude.Text,
+    -- | The start time of the period during which the metric is flagged as
+    -- anomalous. This is specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    startTime :: Data.ISO8601
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AnomalyInstance' 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:
+--
+-- 'endTime', 'anomalyInstance_endTime' - The end time of the period during which the metric is flagged as
+-- anomalous. This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+--
+-- 'userFeedback', 'anomalyInstance_userFeedback' - Feedback type on a specific instance of anomaly submitted by the user.
+--
+-- 'id', 'anomalyInstance_id' - The universally unique identifier (UUID) of an instance of an anomaly in
+-- a metric.
+--
+-- 'startTime', 'anomalyInstance_startTime' - The start time of the period during which the metric is flagged as
+-- anomalous. This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+newAnomalyInstance ::
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  AnomalyInstance
+newAnomalyInstance pId_ pStartTime_ =
+  AnomalyInstance'
+    { endTime = Prelude.Nothing,
+      userFeedback = Prelude.Nothing,
+      id = pId_,
+      startTime = Data._Time Lens.# pStartTime_
+    }
+
+-- | The end time of the period during which the metric is flagged as
+-- anomalous. This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+anomalyInstance_endTime :: Lens.Lens' AnomalyInstance (Prelude.Maybe Prelude.UTCTime)
+anomalyInstance_endTime = Lens.lens (\AnomalyInstance' {endTime} -> endTime) (\s@AnomalyInstance' {} a -> s {endTime = a} :: AnomalyInstance) Prelude.. Lens.mapping Data._Time
+
+-- | Feedback type on a specific instance of anomaly submitted by the user.
+anomalyInstance_userFeedback :: Lens.Lens' AnomalyInstance (Prelude.Maybe UserFeedback)
+anomalyInstance_userFeedback = Lens.lens (\AnomalyInstance' {userFeedback} -> userFeedback) (\s@AnomalyInstance' {} a -> s {userFeedback = a} :: AnomalyInstance)
+
+-- | The universally unique identifier (UUID) of an instance of an anomaly in
+-- a metric.
+anomalyInstance_id :: Lens.Lens' AnomalyInstance Prelude.Text
+anomalyInstance_id = Lens.lens (\AnomalyInstance' {id} -> id) (\s@AnomalyInstance' {} a -> s {id = a} :: AnomalyInstance)
+
+-- | The start time of the period during which the metric is flagged as
+-- anomalous. This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+anomalyInstance_startTime :: Lens.Lens' AnomalyInstance Prelude.UTCTime
+anomalyInstance_startTime = Lens.lens (\AnomalyInstance' {startTime} -> startTime) (\s@AnomalyInstance' {} a -> s {startTime = a} :: AnomalyInstance) Prelude.. Data._Time
+
+instance Data.FromJSON AnomalyInstance where
+  parseJSON =
+    Data.withObject
+      "AnomalyInstance"
+      ( \x ->
+          AnomalyInstance'
+            Prelude.<$> (x Data..:? "endTime")
+            Prelude.<*> (x Data..:? "userFeedback")
+            Prelude.<*> (x Data..: "id")
+            Prelude.<*> (x Data..: "startTime")
+      )
+
+instance Prelude.Hashable AnomalyInstance where
+  hashWithSalt _salt AnomalyInstance' {..} =
+    _salt
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` userFeedback
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` startTime
+
+instance Prelude.NFData AnomalyInstance where
+  rnf AnomalyInstance' {..} =
+    Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf userFeedback
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf startTime
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/Channel.hs b/gen/Amazonka/CodeGuruProfiler/Types/Channel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/Channel.hs
@@ -0,0 +1,132 @@
+{-# 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.CodeGuruProfiler.Types.Channel
+-- 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.CodeGuruProfiler.Types.Channel where
+
+import Amazonka.CodeGuruProfiler.Types.EventPublisher
+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
+
+-- | Notification medium for users to get alerted for events that occur in
+-- application profile. We support SNS topic as a notification channel.
+--
+-- /See:/ 'newChannel' smart constructor.
+data Channel = Channel'
+  { -- | Unique identifier for each @Channel@ in the notification configuration
+    -- of a Profiling Group. A random UUID for channelId is used when adding a
+    -- channel to the notification configuration if not specified in the
+    -- request.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | List of publishers for different type of events that may be detected in
+    -- an application from the profile. Anomaly detection is the only event
+    -- publisher in Profiler.
+    eventPublishers :: Prelude.NonEmpty EventPublisher,
+    -- | Unique arn of the resource to be used for notifications. We support a
+    -- valid SNS topic arn as a channel uri.
+    uri :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Channel' 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:
+--
+-- 'id', 'channel_id' - Unique identifier for each @Channel@ in the notification configuration
+-- of a Profiling Group. A random UUID for channelId is used when adding a
+-- channel to the notification configuration if not specified in the
+-- request.
+--
+-- 'eventPublishers', 'channel_eventPublishers' - List of publishers for different type of events that may be detected in
+-- an application from the profile. Anomaly detection is the only event
+-- publisher in Profiler.
+--
+-- 'uri', 'channel_uri' - Unique arn of the resource to be used for notifications. We support a
+-- valid SNS topic arn as a channel uri.
+newChannel ::
+  -- | 'eventPublishers'
+  Prelude.NonEmpty EventPublisher ->
+  -- | 'uri'
+  Prelude.Text ->
+  Channel
+newChannel pEventPublishers_ pUri_ =
+  Channel'
+    { id = Prelude.Nothing,
+      eventPublishers =
+        Lens.coerced Lens.# pEventPublishers_,
+      uri = pUri_
+    }
+
+-- | Unique identifier for each @Channel@ in the notification configuration
+-- of a Profiling Group. A random UUID for channelId is used when adding a
+-- channel to the notification configuration if not specified in the
+-- request.
+channel_id :: Lens.Lens' Channel (Prelude.Maybe Prelude.Text)
+channel_id = Lens.lens (\Channel' {id} -> id) (\s@Channel' {} a -> s {id = a} :: Channel)
+
+-- | List of publishers for different type of events that may be detected in
+-- an application from the profile. Anomaly detection is the only event
+-- publisher in Profiler.
+channel_eventPublishers :: Lens.Lens' Channel (Prelude.NonEmpty EventPublisher)
+channel_eventPublishers = Lens.lens (\Channel' {eventPublishers} -> eventPublishers) (\s@Channel' {} a -> s {eventPublishers = a} :: Channel) Prelude.. Lens.coerced
+
+-- | Unique arn of the resource to be used for notifications. We support a
+-- valid SNS topic arn as a channel uri.
+channel_uri :: Lens.Lens' Channel Prelude.Text
+channel_uri = Lens.lens (\Channel' {uri} -> uri) (\s@Channel' {} a -> s {uri = a} :: Channel)
+
+instance Data.FromJSON Channel where
+  parseJSON =
+    Data.withObject
+      "Channel"
+      ( \x ->
+          Channel'
+            Prelude.<$> (x Data..:? "id")
+            Prelude.<*> (x Data..: "eventPublishers")
+            Prelude.<*> (x Data..: "uri")
+      )
+
+instance Prelude.Hashable Channel where
+  hashWithSalt _salt Channel' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` eventPublishers
+      `Prelude.hashWithSalt` uri
+
+instance Prelude.NFData Channel where
+  rnf Channel' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf eventPublishers
+      `Prelude.seq` Prelude.rnf uri
+
+instance Data.ToJSON Channel where
+  toJSON Channel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("id" Data..=) Prelude.<$> id,
+            Prelude.Just
+              ("eventPublishers" Data..= eventPublishers),
+            Prelude.Just ("uri" Data..= uri)
+          ]
+      )
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/ComputePlatform.hs b/gen/Amazonka/CodeGuruProfiler/Types/ComputePlatform.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/ComputePlatform.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.CodeGuruProfiler.Types.ComputePlatform
+-- 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.CodeGuruProfiler.Types.ComputePlatform
+  ( ComputePlatform
+      ( ..,
+        ComputePlatform_AWSLambda,
+        ComputePlatform_Default
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ComputePlatform = ComputePlatform'
+  { fromComputePlatform ::
+      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 ComputePlatform_AWSLambda :: ComputePlatform
+pattern ComputePlatform_AWSLambda = ComputePlatform' "AWSLambda"
+
+pattern ComputePlatform_Default :: ComputePlatform
+pattern ComputePlatform_Default = ComputePlatform' "Default"
+
+{-# COMPLETE
+  ComputePlatform_AWSLambda,
+  ComputePlatform_Default,
+  ComputePlatform'
+  #-}
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/EventPublisher.hs b/gen/Amazonka/CodeGuruProfiler/Types/EventPublisher.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/EventPublisher.hs
@@ -0,0 +1,66 @@
+{-# 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.CodeGuruProfiler.Types.EventPublisher
+-- 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.CodeGuruProfiler.Types.EventPublisher
+  ( EventPublisher
+      ( ..,
+        EventPublisher_AnomalyDetection
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype EventPublisher = EventPublisher'
+  { fromEventPublisher ::
+      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 EventPublisher_AnomalyDetection :: EventPublisher
+pattern EventPublisher_AnomalyDetection = EventPublisher' "AnomalyDetection"
+
+{-# COMPLETE
+  EventPublisher_AnomalyDetection,
+  EventPublisher'
+  #-}
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/FeedbackType.hs b/gen/Amazonka/CodeGuruProfiler/Types/FeedbackType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/FeedbackType.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.CodeGuruProfiler.Types.FeedbackType
+-- 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.CodeGuruProfiler.Types.FeedbackType
+  ( FeedbackType
+      ( ..,
+        FeedbackType_Negative,
+        FeedbackType_Positive
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FeedbackType = FeedbackType'
+  { fromFeedbackType ::
+      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 FeedbackType_Negative :: FeedbackType
+pattern FeedbackType_Negative = FeedbackType' "Negative"
+
+pattern FeedbackType_Positive :: FeedbackType
+pattern FeedbackType_Positive = FeedbackType' "Positive"
+
+{-# COMPLETE
+  FeedbackType_Negative,
+  FeedbackType_Positive,
+  FeedbackType'
+  #-}
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/FindingsReportSummary.hs b/gen/Amazonka/CodeGuruProfiler/Types/FindingsReportSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/FindingsReportSummary.hs
@@ -0,0 +1,145 @@
+{-# 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.CodeGuruProfiler.Types.FindingsReportSummary
+-- 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.CodeGuruProfiler.Types.FindingsReportSummary 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
+
+-- | Information about potential recommendations that might be created from
+-- the analysis of profiling data.
+--
+-- /See:/ 'newFindingsReportSummary' smart constructor.
+data FindingsReportSummary = FindingsReportSummary'
+  { -- | The universally unique identifier (UUID) of the recommendation report.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The end time of the period during which the metric is flagged as
+    -- anomalous. This is specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    profileEndTime :: Prelude.Maybe Data.ISO8601,
+    -- | The start time of the profile the analysis data is about. This is
+    -- specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    profileStartTime :: Prelude.Maybe Data.ISO8601,
+    -- | The name of the profiling group that is associated with the analysis
+    -- data.
+    profilingGroupName :: Prelude.Maybe Prelude.Text,
+    -- | The total number of different recommendations that were found by the
+    -- analysis.
+    totalNumberOfFindings :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FindingsReportSummary' 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:
+--
+-- 'id', 'findingsReportSummary_id' - The universally unique identifier (UUID) of the recommendation report.
+--
+-- 'profileEndTime', 'findingsReportSummary_profileEndTime' - The end time of the period during which the metric is flagged as
+-- anomalous. This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+--
+-- 'profileStartTime', 'findingsReportSummary_profileStartTime' - The start time of the profile the analysis data is about. This is
+-- specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+--
+-- 'profilingGroupName', 'findingsReportSummary_profilingGroupName' - The name of the profiling group that is associated with the analysis
+-- data.
+--
+-- 'totalNumberOfFindings', 'findingsReportSummary_totalNumberOfFindings' - The total number of different recommendations that were found by the
+-- analysis.
+newFindingsReportSummary ::
+  FindingsReportSummary
+newFindingsReportSummary =
+  FindingsReportSummary'
+    { id = Prelude.Nothing,
+      profileEndTime = Prelude.Nothing,
+      profileStartTime = Prelude.Nothing,
+      profilingGroupName = Prelude.Nothing,
+      totalNumberOfFindings = Prelude.Nothing
+    }
+
+-- | The universally unique identifier (UUID) of the recommendation report.
+findingsReportSummary_id :: Lens.Lens' FindingsReportSummary (Prelude.Maybe Prelude.Text)
+findingsReportSummary_id = Lens.lens (\FindingsReportSummary' {id} -> id) (\s@FindingsReportSummary' {} a -> s {id = a} :: FindingsReportSummary)
+
+-- | The end time of the period during which the metric is flagged as
+-- anomalous. This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+findingsReportSummary_profileEndTime :: Lens.Lens' FindingsReportSummary (Prelude.Maybe Prelude.UTCTime)
+findingsReportSummary_profileEndTime = Lens.lens (\FindingsReportSummary' {profileEndTime} -> profileEndTime) (\s@FindingsReportSummary' {} a -> s {profileEndTime = a} :: FindingsReportSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The start time of the profile the analysis data is about. This is
+-- specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+findingsReportSummary_profileStartTime :: Lens.Lens' FindingsReportSummary (Prelude.Maybe Prelude.UTCTime)
+findingsReportSummary_profileStartTime = Lens.lens (\FindingsReportSummary' {profileStartTime} -> profileStartTime) (\s@FindingsReportSummary' {} a -> s {profileStartTime = a} :: FindingsReportSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the profiling group that is associated with the analysis
+-- data.
+findingsReportSummary_profilingGroupName :: Lens.Lens' FindingsReportSummary (Prelude.Maybe Prelude.Text)
+findingsReportSummary_profilingGroupName = Lens.lens (\FindingsReportSummary' {profilingGroupName} -> profilingGroupName) (\s@FindingsReportSummary' {} a -> s {profilingGroupName = a} :: FindingsReportSummary)
+
+-- | The total number of different recommendations that were found by the
+-- analysis.
+findingsReportSummary_totalNumberOfFindings :: Lens.Lens' FindingsReportSummary (Prelude.Maybe Prelude.Int)
+findingsReportSummary_totalNumberOfFindings = Lens.lens (\FindingsReportSummary' {totalNumberOfFindings} -> totalNumberOfFindings) (\s@FindingsReportSummary' {} a -> s {totalNumberOfFindings = a} :: FindingsReportSummary)
+
+instance Data.FromJSON FindingsReportSummary where
+  parseJSON =
+    Data.withObject
+      "FindingsReportSummary"
+      ( \x ->
+          FindingsReportSummary'
+            Prelude.<$> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "profileEndTime")
+            Prelude.<*> (x Data..:? "profileStartTime")
+            Prelude.<*> (x Data..:? "profilingGroupName")
+            Prelude.<*> (x Data..:? "totalNumberOfFindings")
+      )
+
+instance Prelude.Hashable FindingsReportSummary where
+  hashWithSalt _salt FindingsReportSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` profileEndTime
+      `Prelude.hashWithSalt` profileStartTime
+      `Prelude.hashWithSalt` profilingGroupName
+      `Prelude.hashWithSalt` totalNumberOfFindings
+
+instance Prelude.NFData FindingsReportSummary where
+  rnf FindingsReportSummary' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf profileEndTime
+      `Prelude.seq` Prelude.rnf profileStartTime
+      `Prelude.seq` Prelude.rnf profilingGroupName
+      `Prelude.seq` Prelude.rnf totalNumberOfFindings
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/FrameMetric.hs b/gen/Amazonka/CodeGuruProfiler/Types/FrameMetric.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/FrameMetric.hs
@@ -0,0 +1,127 @@
+{-# 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.CodeGuruProfiler.Types.FrameMetric
+-- 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.CodeGuruProfiler.Types.FrameMetric where
+
+import Amazonka.CodeGuruProfiler.Types.MetricType
+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 frame name, metric type, and thread states. These are used to derive
+-- the value of the metric for the frame.
+--
+-- /See:/ 'newFrameMetric' smart constructor.
+data FrameMetric = FrameMetric'
+  { -- | Name of the method common across the multiple occurrences of a frame in
+    -- an application profile.
+    frameName :: Prelude.Text,
+    -- | List of application runtime thread states used to get the counts for a
+    -- frame a derive a metric value.
+    threadStates :: [Prelude.Text],
+    -- | A type of aggregation that specifies how a metric for a frame is
+    -- analyzed. The supported value @AggregatedRelativeTotalTime@ is an
+    -- aggregation of the metric value for one frame that is calculated across
+    -- the occurrences of all frames in a profile.
+    type' :: MetricType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FrameMetric' 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:
+--
+-- 'frameName', 'frameMetric_frameName' - Name of the method common across the multiple occurrences of a frame in
+-- an application profile.
+--
+-- 'threadStates', 'frameMetric_threadStates' - List of application runtime thread states used to get the counts for a
+-- frame a derive a metric value.
+--
+-- 'type'', 'frameMetric_type' - A type of aggregation that specifies how a metric for a frame is
+-- analyzed. The supported value @AggregatedRelativeTotalTime@ is an
+-- aggregation of the metric value for one frame that is calculated across
+-- the occurrences of all frames in a profile.
+newFrameMetric ::
+  -- | 'frameName'
+  Prelude.Text ->
+  -- | 'type''
+  MetricType ->
+  FrameMetric
+newFrameMetric pFrameName_ pType_ =
+  FrameMetric'
+    { frameName = pFrameName_,
+      threadStates = Prelude.mempty,
+      type' = pType_
+    }
+
+-- | Name of the method common across the multiple occurrences of a frame in
+-- an application profile.
+frameMetric_frameName :: Lens.Lens' FrameMetric Prelude.Text
+frameMetric_frameName = Lens.lens (\FrameMetric' {frameName} -> frameName) (\s@FrameMetric' {} a -> s {frameName = a} :: FrameMetric)
+
+-- | List of application runtime thread states used to get the counts for a
+-- frame a derive a metric value.
+frameMetric_threadStates :: Lens.Lens' FrameMetric [Prelude.Text]
+frameMetric_threadStates = Lens.lens (\FrameMetric' {threadStates} -> threadStates) (\s@FrameMetric' {} a -> s {threadStates = a} :: FrameMetric) Prelude.. Lens.coerced
+
+-- | A type of aggregation that specifies how a metric for a frame is
+-- analyzed. The supported value @AggregatedRelativeTotalTime@ is an
+-- aggregation of the metric value for one frame that is calculated across
+-- the occurrences of all frames in a profile.
+frameMetric_type :: Lens.Lens' FrameMetric MetricType
+frameMetric_type = Lens.lens (\FrameMetric' {type'} -> type') (\s@FrameMetric' {} a -> s {type' = a} :: FrameMetric)
+
+instance Data.FromJSON FrameMetric where
+  parseJSON =
+    Data.withObject
+      "FrameMetric"
+      ( \x ->
+          FrameMetric'
+            Prelude.<$> (x Data..: "frameName")
+            Prelude.<*> (x Data..:? "threadStates" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "type")
+      )
+
+instance Prelude.Hashable FrameMetric where
+  hashWithSalt _salt FrameMetric' {..} =
+    _salt
+      `Prelude.hashWithSalt` frameName
+      `Prelude.hashWithSalt` threadStates
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData FrameMetric where
+  rnf FrameMetric' {..} =
+    Prelude.rnf frameName
+      `Prelude.seq` Prelude.rnf threadStates
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON FrameMetric where
+  toJSON FrameMetric' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("frameName" Data..= frameName),
+            Prelude.Just ("threadStates" Data..= threadStates),
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/FrameMetricDatum.hs b/gen/Amazonka/CodeGuruProfiler/Types/FrameMetricDatum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/FrameMetricDatum.hs
@@ -0,0 +1,86 @@
+{-# 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.CodeGuruProfiler.Types.FrameMetricDatum
+-- 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.CodeGuruProfiler.Types.FrameMetricDatum where
+
+import Amazonka.CodeGuruProfiler.Types.FrameMetric
+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
+
+-- | Information about a frame metric and its values.
+--
+-- /See:/ 'newFrameMetricDatum' smart constructor.
+data FrameMetricDatum = FrameMetricDatum'
+  { frameMetric :: FrameMetric,
+    -- | A list of values that are associated with a frame metric.
+    values :: [Prelude.Double]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FrameMetricDatum' 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:
+--
+-- 'frameMetric', 'frameMetricDatum_frameMetric' - Undocumented member.
+--
+-- 'values', 'frameMetricDatum_values' - A list of values that are associated with a frame metric.
+newFrameMetricDatum ::
+  -- | 'frameMetric'
+  FrameMetric ->
+  FrameMetricDatum
+newFrameMetricDatum pFrameMetric_ =
+  FrameMetricDatum'
+    { frameMetric = pFrameMetric_,
+      values = Prelude.mempty
+    }
+
+-- | Undocumented member.
+frameMetricDatum_frameMetric :: Lens.Lens' FrameMetricDatum FrameMetric
+frameMetricDatum_frameMetric = Lens.lens (\FrameMetricDatum' {frameMetric} -> frameMetric) (\s@FrameMetricDatum' {} a -> s {frameMetric = a} :: FrameMetricDatum)
+
+-- | A list of values that are associated with a frame metric.
+frameMetricDatum_values :: Lens.Lens' FrameMetricDatum [Prelude.Double]
+frameMetricDatum_values = Lens.lens (\FrameMetricDatum' {values} -> values) (\s@FrameMetricDatum' {} a -> s {values = a} :: FrameMetricDatum) Prelude.. Lens.coerced
+
+instance Data.FromJSON FrameMetricDatum where
+  parseJSON =
+    Data.withObject
+      "FrameMetricDatum"
+      ( \x ->
+          FrameMetricDatum'
+            Prelude.<$> (x Data..: "frameMetric")
+            Prelude.<*> (x Data..:? "values" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable FrameMetricDatum where
+  hashWithSalt _salt FrameMetricDatum' {..} =
+    _salt
+      `Prelude.hashWithSalt` frameMetric
+      `Prelude.hashWithSalt` values
+
+instance Prelude.NFData FrameMetricDatum where
+  rnf FrameMetricDatum' {..} =
+    Prelude.rnf frameMetric
+      `Prelude.seq` Prelude.rnf values
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/Match.hs b/gen/Amazonka/CodeGuruProfiler/Types/Match.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/Match.hs
@@ -0,0 +1,103 @@
+{-# 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.CodeGuruProfiler.Types.Match
+-- 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.CodeGuruProfiler.Types.Match 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 part of a profile that contains a recommendation found during
+-- analysis.
+--
+-- /See:/ 'newMatch' smart constructor.
+data Match = Match'
+  { -- | The location in the profiling graph that contains a recommendation found
+    -- during analysis.
+    frameAddress :: Prelude.Maybe Prelude.Text,
+    -- | The target frame that triggered a match.
+    targetFramesIndex :: Prelude.Maybe Prelude.Int,
+    -- | The value in the profile data that exceeded the recommendation
+    -- threshold.
+    thresholdBreachValue :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Match' 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:
+--
+-- 'frameAddress', 'match_frameAddress' - The location in the profiling graph that contains a recommendation found
+-- during analysis.
+--
+-- 'targetFramesIndex', 'match_targetFramesIndex' - The target frame that triggered a match.
+--
+-- 'thresholdBreachValue', 'match_thresholdBreachValue' - The value in the profile data that exceeded the recommendation
+-- threshold.
+newMatch ::
+  Match
+newMatch =
+  Match'
+    { frameAddress = Prelude.Nothing,
+      targetFramesIndex = Prelude.Nothing,
+      thresholdBreachValue = Prelude.Nothing
+    }
+
+-- | The location in the profiling graph that contains a recommendation found
+-- during analysis.
+match_frameAddress :: Lens.Lens' Match (Prelude.Maybe Prelude.Text)
+match_frameAddress = Lens.lens (\Match' {frameAddress} -> frameAddress) (\s@Match' {} a -> s {frameAddress = a} :: Match)
+
+-- | The target frame that triggered a match.
+match_targetFramesIndex :: Lens.Lens' Match (Prelude.Maybe Prelude.Int)
+match_targetFramesIndex = Lens.lens (\Match' {targetFramesIndex} -> targetFramesIndex) (\s@Match' {} a -> s {targetFramesIndex = a} :: Match)
+
+-- | The value in the profile data that exceeded the recommendation
+-- threshold.
+match_thresholdBreachValue :: Lens.Lens' Match (Prelude.Maybe Prelude.Double)
+match_thresholdBreachValue = Lens.lens (\Match' {thresholdBreachValue} -> thresholdBreachValue) (\s@Match' {} a -> s {thresholdBreachValue = a} :: Match)
+
+instance Data.FromJSON Match where
+  parseJSON =
+    Data.withObject
+      "Match"
+      ( \x ->
+          Match'
+            Prelude.<$> (x Data..:? "frameAddress")
+            Prelude.<*> (x Data..:? "targetFramesIndex")
+            Prelude.<*> (x Data..:? "thresholdBreachValue")
+      )
+
+instance Prelude.Hashable Match where
+  hashWithSalt _salt Match' {..} =
+    _salt
+      `Prelude.hashWithSalt` frameAddress
+      `Prelude.hashWithSalt` targetFramesIndex
+      `Prelude.hashWithSalt` thresholdBreachValue
+
+instance Prelude.NFData Match where
+  rnf Match' {..} =
+    Prelude.rnf frameAddress
+      `Prelude.seq` Prelude.rnf targetFramesIndex
+      `Prelude.seq` Prelude.rnf thresholdBreachValue
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/MetadataField.hs b/gen/Amazonka/CodeGuruProfiler/Types/MetadataField.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/MetadataField.hs
@@ -0,0 +1,106 @@
+{-# 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.CodeGuruProfiler.Types.MetadataField
+-- 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.CodeGuruProfiler.Types.MetadataField
+  ( MetadataField
+      ( ..,
+        MetadataField_AgentId,
+        MetadataField_AwsRequestId,
+        MetadataField_ComputePlatform,
+        MetadataField_ExecutionEnvironment,
+        MetadataField_LambdaFunctionArn,
+        MetadataField_LambdaMemoryLimitInMB,
+        MetadataField_LambdaPreviousExecutionTimeInMilliseconds,
+        MetadataField_LambdaRemainingTimeInMilliseconds,
+        MetadataField_LambdaTimeGapBetweenInvokesInMilliseconds
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype MetadataField = MetadataField'
+  { fromMetadataField ::
+      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 MetadataField_AgentId :: MetadataField
+pattern MetadataField_AgentId = MetadataField' "AgentId"
+
+pattern MetadataField_AwsRequestId :: MetadataField
+pattern MetadataField_AwsRequestId = MetadataField' "AwsRequestId"
+
+pattern MetadataField_ComputePlatform :: MetadataField
+pattern MetadataField_ComputePlatform = MetadataField' "ComputePlatform"
+
+pattern MetadataField_ExecutionEnvironment :: MetadataField
+pattern MetadataField_ExecutionEnvironment = MetadataField' "ExecutionEnvironment"
+
+pattern MetadataField_LambdaFunctionArn :: MetadataField
+pattern MetadataField_LambdaFunctionArn = MetadataField' "LambdaFunctionArn"
+
+pattern MetadataField_LambdaMemoryLimitInMB :: MetadataField
+pattern MetadataField_LambdaMemoryLimitInMB = MetadataField' "LambdaMemoryLimitInMB"
+
+pattern MetadataField_LambdaPreviousExecutionTimeInMilliseconds :: MetadataField
+pattern MetadataField_LambdaPreviousExecutionTimeInMilliseconds = MetadataField' "LambdaPreviousExecutionTimeInMilliseconds"
+
+pattern MetadataField_LambdaRemainingTimeInMilliseconds :: MetadataField
+pattern MetadataField_LambdaRemainingTimeInMilliseconds = MetadataField' "LambdaRemainingTimeInMilliseconds"
+
+pattern MetadataField_LambdaTimeGapBetweenInvokesInMilliseconds :: MetadataField
+pattern MetadataField_LambdaTimeGapBetweenInvokesInMilliseconds = MetadataField' "LambdaTimeGapBetweenInvokesInMilliseconds"
+
+{-# COMPLETE
+  MetadataField_AgentId,
+  MetadataField_AwsRequestId,
+  MetadataField_ComputePlatform,
+  MetadataField_ExecutionEnvironment,
+  MetadataField_LambdaFunctionArn,
+  MetadataField_LambdaMemoryLimitInMB,
+  MetadataField_LambdaPreviousExecutionTimeInMilliseconds,
+  MetadataField_LambdaRemainingTimeInMilliseconds,
+  MetadataField_LambdaTimeGapBetweenInvokesInMilliseconds,
+  MetadataField'
+  #-}
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/Metric.hs b/gen/Amazonka/CodeGuruProfiler/Types/Metric.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/Metric.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.CodeGuruProfiler.Types.Metric
+-- 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.CodeGuruProfiler.Types.Metric where
+
+import Amazonka.CodeGuruProfiler.Types.MetricType
+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
+
+-- | Details about the metric that the analysis used when it detected the
+-- anomaly. The metric what is analyzed to create recommendations. It
+-- includes the name of the frame that was analyzed and the type and thread
+-- states used to derive the metric value for that frame.
+--
+-- /See:/ 'newMetric' smart constructor.
+data Metric = Metric'
+  { -- | The name of the method that appears as a frame in any stack in a
+    -- profile.
+    frameName :: Prelude.Text,
+    -- | The list of application runtime thread states that is used to calculate
+    -- the metric value for the frame.
+    threadStates :: [Prelude.Text],
+    -- | A type that specifies how a metric for a frame is analyzed. The
+    -- supported value @AggregatedRelativeTotalTime@ is an aggregation of the
+    -- metric value for one frame that is calculated across the occurences of
+    -- all frames in a profile.
+    type' :: MetricType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Metric' 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:
+--
+-- 'frameName', 'metric_frameName' - The name of the method that appears as a frame in any stack in a
+-- profile.
+--
+-- 'threadStates', 'metric_threadStates' - The list of application runtime thread states that is used to calculate
+-- the metric value for the frame.
+--
+-- 'type'', 'metric_type' - A type that specifies how a metric for a frame is analyzed. The
+-- supported value @AggregatedRelativeTotalTime@ is an aggregation of the
+-- metric value for one frame that is calculated across the occurences of
+-- all frames in a profile.
+newMetric ::
+  -- | 'frameName'
+  Prelude.Text ->
+  -- | 'type''
+  MetricType ->
+  Metric
+newMetric pFrameName_ pType_ =
+  Metric'
+    { frameName = pFrameName_,
+      threadStates = Prelude.mempty,
+      type' = pType_
+    }
+
+-- | The name of the method that appears as a frame in any stack in a
+-- profile.
+metric_frameName :: Lens.Lens' Metric Prelude.Text
+metric_frameName = Lens.lens (\Metric' {frameName} -> frameName) (\s@Metric' {} a -> s {frameName = a} :: Metric)
+
+-- | The list of application runtime thread states that is used to calculate
+-- the metric value for the frame.
+metric_threadStates :: Lens.Lens' Metric [Prelude.Text]
+metric_threadStates = Lens.lens (\Metric' {threadStates} -> threadStates) (\s@Metric' {} a -> s {threadStates = a} :: Metric) Prelude.. Lens.coerced
+
+-- | A type that specifies how a metric for a frame is analyzed. The
+-- supported value @AggregatedRelativeTotalTime@ is an aggregation of the
+-- metric value for one frame that is calculated across the occurences of
+-- all frames in a profile.
+metric_type :: Lens.Lens' Metric MetricType
+metric_type = Lens.lens (\Metric' {type'} -> type') (\s@Metric' {} a -> s {type' = a} :: Metric)
+
+instance Data.FromJSON Metric where
+  parseJSON =
+    Data.withObject
+      "Metric"
+      ( \x ->
+          Metric'
+            Prelude.<$> (x Data..: "frameName")
+            Prelude.<*> (x Data..:? "threadStates" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "type")
+      )
+
+instance Prelude.Hashable Metric where
+  hashWithSalt _salt Metric' {..} =
+    _salt
+      `Prelude.hashWithSalt` frameName
+      `Prelude.hashWithSalt` threadStates
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData Metric where
+  rnf Metric' {..} =
+    Prelude.rnf frameName
+      `Prelude.seq` Prelude.rnf threadStates
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/MetricType.hs b/gen/Amazonka/CodeGuruProfiler/Types/MetricType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/MetricType.hs
@@ -0,0 +1,66 @@
+{-# 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.CodeGuruProfiler.Types.MetricType
+-- 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.CodeGuruProfiler.Types.MetricType
+  ( MetricType
+      ( ..,
+        MetricType_AggregatedRelativeTotalTime
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype MetricType = MetricType'
+  { fromMetricType ::
+      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 MetricType_AggregatedRelativeTotalTime :: MetricType
+pattern MetricType_AggregatedRelativeTotalTime = MetricType' "AggregatedRelativeTotalTime"
+
+{-# COMPLETE
+  MetricType_AggregatedRelativeTotalTime,
+  MetricType'
+  #-}
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/NotificationConfiguration.hs b/gen/Amazonka/CodeGuruProfiler/Types/NotificationConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/NotificationConfiguration.hs
@@ -0,0 +1,78 @@
+{-# 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.CodeGuruProfiler.Types.NotificationConfiguration
+-- 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.CodeGuruProfiler.Types.NotificationConfiguration where
+
+import Amazonka.CodeGuruProfiler.Types.Channel
+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 configuration for notifications stored for each profiling group.
+-- This includes up to to two channels and a list of event publishers
+-- associated with each channel.
+--
+-- /See:/ 'newNotificationConfiguration' smart constructor.
+data NotificationConfiguration = NotificationConfiguration'
+  { -- | List of up to two channels to be used for sending notifications for
+    -- events detected from the application profile.
+    channels :: Prelude.Maybe (Prelude.NonEmpty Channel)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NotificationConfiguration' 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:
+--
+-- 'channels', 'notificationConfiguration_channels' - List of up to two channels to be used for sending notifications for
+-- events detected from the application profile.
+newNotificationConfiguration ::
+  NotificationConfiguration
+newNotificationConfiguration =
+  NotificationConfiguration'
+    { channels =
+        Prelude.Nothing
+    }
+
+-- | List of up to two channels to be used for sending notifications for
+-- events detected from the application profile.
+notificationConfiguration_channels :: Lens.Lens' NotificationConfiguration (Prelude.Maybe (Prelude.NonEmpty Channel))
+notificationConfiguration_channels = Lens.lens (\NotificationConfiguration' {channels} -> channels) (\s@NotificationConfiguration' {} a -> s {channels = a} :: NotificationConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON NotificationConfiguration where
+  parseJSON =
+    Data.withObject
+      "NotificationConfiguration"
+      ( \x ->
+          NotificationConfiguration'
+            Prelude.<$> (x Data..:? "channels")
+      )
+
+instance Prelude.Hashable NotificationConfiguration where
+  hashWithSalt _salt NotificationConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` channels
+
+instance Prelude.NFData NotificationConfiguration where
+  rnf NotificationConfiguration' {..} =
+    Prelude.rnf channels
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/OrderBy.hs b/gen/Amazonka/CodeGuruProfiler/Types/OrderBy.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/OrderBy.hs
@@ -0,0 +1,68 @@
+{-# 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.CodeGuruProfiler.Types.OrderBy
+-- 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.CodeGuruProfiler.Types.OrderBy
+  ( OrderBy
+      ( ..,
+        OrderBy_TimestampAscending,
+        OrderBy_TimestampDescending
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype OrderBy = OrderBy' {fromOrderBy :: 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 OrderBy_TimestampAscending :: OrderBy
+pattern OrderBy_TimestampAscending = OrderBy' "TimestampAscending"
+
+pattern OrderBy_TimestampDescending :: OrderBy
+pattern OrderBy_TimestampDescending = OrderBy' "TimestampDescending"
+
+{-# COMPLETE
+  OrderBy_TimestampAscending,
+  OrderBy_TimestampDescending,
+  OrderBy'
+  #-}
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/Pattern.hs b/gen/Amazonka/CodeGuruProfiler/Types/Pattern.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/Pattern.hs
@@ -0,0 +1,162 @@
+{-# 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.CodeGuruProfiler.Types.Pattern
+-- 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.CodeGuruProfiler.Types.Pattern 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 set of rules used to make a recommendation during an analysis.
+--
+-- /See:/ 'newPattern' smart constructor.
+data Pattern = Pattern'
+  { -- | A list of the different counters used to determine if there is a match.
+    countersToAggregate :: Prelude.Maybe [Prelude.Text],
+    -- | The description of the recommendation. This explains a potential
+    -- inefficiency in a profiled application.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The universally unique identifier (UUID) of this pattern.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The name for this pattern.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | A string that contains the steps recommended to address the potential
+    -- inefficiency.
+    resolutionSteps :: Prelude.Maybe Prelude.Text,
+    -- | A list of frame names that were searched during the analysis that
+    -- generated a recommendation.
+    targetFrames :: Prelude.Maybe [[Prelude.Text]],
+    -- | The percentage of time an application spends in one method that triggers
+    -- a recommendation. The percentage of time is the same as the percentage
+    -- of the total gathered sample counts during analysis.
+    thresholdPercent :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Pattern' 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:
+--
+-- 'countersToAggregate', 'pattern_countersToAggregate' - A list of the different counters used to determine if there is a match.
+--
+-- 'description', 'pattern_description' - The description of the recommendation. This explains a potential
+-- inefficiency in a profiled application.
+--
+-- 'id', 'pattern_id' - The universally unique identifier (UUID) of this pattern.
+--
+-- 'name', 'pattern_name' - The name for this pattern.
+--
+-- 'resolutionSteps', 'pattern_resolutionSteps' - A string that contains the steps recommended to address the potential
+-- inefficiency.
+--
+-- 'targetFrames', 'pattern_targetFrames' - A list of frame names that were searched during the analysis that
+-- generated a recommendation.
+--
+-- 'thresholdPercent', 'pattern_thresholdPercent' - The percentage of time an application spends in one method that triggers
+-- a recommendation. The percentage of time is the same as the percentage
+-- of the total gathered sample counts during analysis.
+newPattern ::
+  Pattern
+newPattern =
+  Pattern'
+    { countersToAggregate = Prelude.Nothing,
+      description = Prelude.Nothing,
+      id = Prelude.Nothing,
+      name = Prelude.Nothing,
+      resolutionSteps = Prelude.Nothing,
+      targetFrames = Prelude.Nothing,
+      thresholdPercent = Prelude.Nothing
+    }
+
+-- | A list of the different counters used to determine if there is a match.
+pattern_countersToAggregate :: Lens.Lens' Pattern (Prelude.Maybe [Prelude.Text])
+pattern_countersToAggregate = Lens.lens (\Pattern' {countersToAggregate} -> countersToAggregate) (\s@Pattern' {} a -> s {countersToAggregate = a} :: Pattern) Prelude.. Lens.mapping Lens.coerced
+
+-- | The description of the recommendation. This explains a potential
+-- inefficiency in a profiled application.
+pattern_description :: Lens.Lens' Pattern (Prelude.Maybe Prelude.Text)
+pattern_description = Lens.lens (\Pattern' {description} -> description) (\s@Pattern' {} a -> s {description = a} :: Pattern)
+
+-- | The universally unique identifier (UUID) of this pattern.
+pattern_id :: Lens.Lens' Pattern (Prelude.Maybe Prelude.Text)
+pattern_id = Lens.lens (\Pattern' {id} -> id) (\s@Pattern' {} a -> s {id = a} :: Pattern)
+
+-- | The name for this pattern.
+pattern_name :: Lens.Lens' Pattern (Prelude.Maybe Prelude.Text)
+pattern_name = Lens.lens (\Pattern' {name} -> name) (\s@Pattern' {} a -> s {name = a} :: Pattern)
+
+-- | A string that contains the steps recommended to address the potential
+-- inefficiency.
+pattern_resolutionSteps :: Lens.Lens' Pattern (Prelude.Maybe Prelude.Text)
+pattern_resolutionSteps = Lens.lens (\Pattern' {resolutionSteps} -> resolutionSteps) (\s@Pattern' {} a -> s {resolutionSteps = a} :: Pattern)
+
+-- | A list of frame names that were searched during the analysis that
+-- generated a recommendation.
+pattern_targetFrames :: Lens.Lens' Pattern (Prelude.Maybe [[Prelude.Text]])
+pattern_targetFrames = Lens.lens (\Pattern' {targetFrames} -> targetFrames) (\s@Pattern' {} a -> s {targetFrames = a} :: Pattern) Prelude.. Lens.mapping Lens.coerced
+
+-- | The percentage of time an application spends in one method that triggers
+-- a recommendation. The percentage of time is the same as the percentage
+-- of the total gathered sample counts during analysis.
+pattern_thresholdPercent :: Lens.Lens' Pattern (Prelude.Maybe Prelude.Double)
+pattern_thresholdPercent = Lens.lens (\Pattern' {thresholdPercent} -> thresholdPercent) (\s@Pattern' {} a -> s {thresholdPercent = a} :: Pattern)
+
+instance Data.FromJSON Pattern where
+  parseJSON =
+    Data.withObject
+      "Pattern"
+      ( \x ->
+          Pattern'
+            Prelude.<$> ( x
+                            Data..:? "countersToAggregate"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "id")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "resolutionSteps")
+            Prelude.<*> (x Data..:? "targetFrames" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "thresholdPercent")
+      )
+
+instance Prelude.Hashable Pattern where
+  hashWithSalt _salt Pattern' {..} =
+    _salt
+      `Prelude.hashWithSalt` countersToAggregate
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` resolutionSteps
+      `Prelude.hashWithSalt` targetFrames
+      `Prelude.hashWithSalt` thresholdPercent
+
+instance Prelude.NFData Pattern where
+  rnf Pattern' {..} =
+    Prelude.rnf countersToAggregate
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf resolutionSteps
+      `Prelude.seq` Prelude.rnf targetFrames
+      `Prelude.seq` Prelude.rnf thresholdPercent
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/ProfileTime.hs b/gen/Amazonka/CodeGuruProfiler/Types/ProfileTime.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/ProfileTime.hs
@@ -0,0 +1,73 @@
+{-# 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.CodeGuruProfiler.Types.ProfileTime
+-- 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.CodeGuruProfiler.Types.ProfileTime 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
+
+-- | Contains the start time of a profile.
+--
+-- /See:/ 'newProfileTime' smart constructor.
+data ProfileTime = ProfileTime'
+  { -- | The start time of a profile. It is specified using the ISO 8601 format.
+    -- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+    -- 1, 2020 1:15:02 PM UTC.
+    start :: Prelude.Maybe Data.ISO8601
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ProfileTime' 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:
+--
+-- 'start', 'profileTime_start' - The start time of a profile. It is specified using the ISO 8601 format.
+-- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+-- 1, 2020 1:15:02 PM UTC.
+newProfileTime ::
+  ProfileTime
+newProfileTime =
+  ProfileTime' {start = Prelude.Nothing}
+
+-- | The start time of a profile. It is specified using the ISO 8601 format.
+-- For example, 2020-06-01T13:15:02.001Z represents 1 millisecond past June
+-- 1, 2020 1:15:02 PM UTC.
+profileTime_start :: Lens.Lens' ProfileTime (Prelude.Maybe Prelude.UTCTime)
+profileTime_start = Lens.lens (\ProfileTime' {start} -> start) (\s@ProfileTime' {} a -> s {start = a} :: ProfileTime) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON ProfileTime where
+  parseJSON =
+    Data.withObject
+      "ProfileTime"
+      ( \x ->
+          ProfileTime' Prelude.<$> (x Data..:? "start")
+      )
+
+instance Prelude.Hashable ProfileTime where
+  hashWithSalt _salt ProfileTime' {..} =
+    _salt `Prelude.hashWithSalt` start
+
+instance Prelude.NFData ProfileTime where
+  rnf ProfileTime' {..} = Prelude.rnf start
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/ProfilingGroupDescription.hs b/gen/Amazonka/CodeGuruProfiler/Types/ProfilingGroupDescription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/ProfilingGroupDescription.hs
@@ -0,0 +1,205 @@
+{-# 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.CodeGuruProfiler.Types.ProfilingGroupDescription
+-- 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.CodeGuruProfiler.Types.ProfilingGroupDescription where
+
+import Amazonka.CodeGuruProfiler.Types.AgentOrchestrationConfig
+import Amazonka.CodeGuruProfiler.Types.ComputePlatform
+import Amazonka.CodeGuruProfiler.Types.ProfilingStatus
+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
+
+-- | Contains information about a profiling group.
+--
+-- /See:/ 'newProfilingGroupDescription' smart constructor.
+data ProfilingGroupDescription = ProfilingGroupDescription'
+  { -- | An
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AgentOrchestrationConfig.html AgentOrchestrationConfig>
+    -- object that indicates if the profiling group is enabled for profiled or
+    -- not.
+    agentOrchestrationConfig :: Prelude.Maybe AgentOrchestrationConfig,
+    -- | The Amazon Resource Name (ARN) identifying the profiling group resource.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The compute platform of the profiling group. If it is set to
+    -- @AWSLambda@, then the profiled application runs on AWS Lambda. If it is
+    -- set to @Default@, then the profiled application runs on a compute
+    -- platform that is not AWS Lambda, such an Amazon EC2 instance, an
+    -- on-premises server, or a different platform. The default is @Default@.
+    computePlatform :: Prelude.Maybe ComputePlatform,
+    -- | The time when the profiling group was created. Specify using the ISO
+    -- 8601 format. For example, 2020-06-01T13:15:02.001Z represents 1
+    -- millisecond past June 1, 2020 1:15:02 PM UTC.
+    createdAt :: Prelude.Maybe Data.ISO8601,
+    -- | The name of the profiling group.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | A
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingStatus.html ProfilingStatus>
+    -- object that includes information about the last time a profile agent
+    -- pinged back, the last time a profile was received, and the aggregation
+    -- period and start time for the most recent aggregated profile.
+    profilingStatus :: Prelude.Maybe ProfilingStatus,
+    -- | A list of the tags that belong to this profiling group.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The date and time when the profiling group was last updated. Specify
+    -- using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
+    -- represents 1 millisecond past June 1, 2020 1:15:02 PM UTC.
+    updatedAt :: Prelude.Maybe Data.ISO8601
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ProfilingGroupDescription' 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:
+--
+-- 'agentOrchestrationConfig', 'profilingGroupDescription_agentOrchestrationConfig' - An
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AgentOrchestrationConfig.html AgentOrchestrationConfig>
+-- object that indicates if the profiling group is enabled for profiled or
+-- not.
+--
+-- 'arn', 'profilingGroupDescription_arn' - The Amazon Resource Name (ARN) identifying the profiling group resource.
+--
+-- 'computePlatform', 'profilingGroupDescription_computePlatform' - The compute platform of the profiling group. If it is set to
+-- @AWSLambda@, then the profiled application runs on AWS Lambda. If it is
+-- set to @Default@, then the profiled application runs on a compute
+-- platform that is not AWS Lambda, such an Amazon EC2 instance, an
+-- on-premises server, or a different platform. The default is @Default@.
+--
+-- 'createdAt', 'profilingGroupDescription_createdAt' - The time when the profiling group was created. Specify using the ISO
+-- 8601 format. For example, 2020-06-01T13:15:02.001Z represents 1
+-- millisecond past June 1, 2020 1:15:02 PM UTC.
+--
+-- 'name', 'profilingGroupDescription_name' - The name of the profiling group.
+--
+-- 'profilingStatus', 'profilingGroupDescription_profilingStatus' - A
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingStatus.html ProfilingStatus>
+-- object that includes information about the last time a profile agent
+-- pinged back, the last time a profile was received, and the aggregation
+-- period and start time for the most recent aggregated profile.
+--
+-- 'tags', 'profilingGroupDescription_tags' - A list of the tags that belong to this profiling group.
+--
+-- 'updatedAt', 'profilingGroupDescription_updatedAt' - The date and time when the profiling group was last updated. Specify
+-- using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
+-- represents 1 millisecond past June 1, 2020 1:15:02 PM UTC.
+newProfilingGroupDescription ::
+  ProfilingGroupDescription
+newProfilingGroupDescription =
+  ProfilingGroupDescription'
+    { agentOrchestrationConfig =
+        Prelude.Nothing,
+      arn = Prelude.Nothing,
+      computePlatform = Prelude.Nothing,
+      createdAt = Prelude.Nothing,
+      name = Prelude.Nothing,
+      profilingStatus = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      updatedAt = Prelude.Nothing
+    }
+
+-- | An
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AgentOrchestrationConfig.html AgentOrchestrationConfig>
+-- object that indicates if the profiling group is enabled for profiled or
+-- not.
+profilingGroupDescription_agentOrchestrationConfig :: Lens.Lens' ProfilingGroupDescription (Prelude.Maybe AgentOrchestrationConfig)
+profilingGroupDescription_agentOrchestrationConfig = Lens.lens (\ProfilingGroupDescription' {agentOrchestrationConfig} -> agentOrchestrationConfig) (\s@ProfilingGroupDescription' {} a -> s {agentOrchestrationConfig = a} :: ProfilingGroupDescription)
+
+-- | The Amazon Resource Name (ARN) identifying the profiling group resource.
+profilingGroupDescription_arn :: Lens.Lens' ProfilingGroupDescription (Prelude.Maybe Prelude.Text)
+profilingGroupDescription_arn = Lens.lens (\ProfilingGroupDescription' {arn} -> arn) (\s@ProfilingGroupDescription' {} a -> s {arn = a} :: ProfilingGroupDescription)
+
+-- | The compute platform of the profiling group. If it is set to
+-- @AWSLambda@, then the profiled application runs on AWS Lambda. If it is
+-- set to @Default@, then the profiled application runs on a compute
+-- platform that is not AWS Lambda, such an Amazon EC2 instance, an
+-- on-premises server, or a different platform. The default is @Default@.
+profilingGroupDescription_computePlatform :: Lens.Lens' ProfilingGroupDescription (Prelude.Maybe ComputePlatform)
+profilingGroupDescription_computePlatform = Lens.lens (\ProfilingGroupDescription' {computePlatform} -> computePlatform) (\s@ProfilingGroupDescription' {} a -> s {computePlatform = a} :: ProfilingGroupDescription)
+
+-- | The time when the profiling group was created. Specify using the ISO
+-- 8601 format. For example, 2020-06-01T13:15:02.001Z represents 1
+-- millisecond past June 1, 2020 1:15:02 PM UTC.
+profilingGroupDescription_createdAt :: Lens.Lens' ProfilingGroupDescription (Prelude.Maybe Prelude.UTCTime)
+profilingGroupDescription_createdAt = Lens.lens (\ProfilingGroupDescription' {createdAt} -> createdAt) (\s@ProfilingGroupDescription' {} a -> s {createdAt = a} :: ProfilingGroupDescription) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the profiling group.
+profilingGroupDescription_name :: Lens.Lens' ProfilingGroupDescription (Prelude.Maybe Prelude.Text)
+profilingGroupDescription_name = Lens.lens (\ProfilingGroupDescription' {name} -> name) (\s@ProfilingGroupDescription' {} a -> s {name = a} :: ProfilingGroupDescription)
+
+-- | A
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingStatus.html ProfilingStatus>
+-- object that includes information about the last time a profile agent
+-- pinged back, the last time a profile was received, and the aggregation
+-- period and start time for the most recent aggregated profile.
+profilingGroupDescription_profilingStatus :: Lens.Lens' ProfilingGroupDescription (Prelude.Maybe ProfilingStatus)
+profilingGroupDescription_profilingStatus = Lens.lens (\ProfilingGroupDescription' {profilingStatus} -> profilingStatus) (\s@ProfilingGroupDescription' {} a -> s {profilingStatus = a} :: ProfilingGroupDescription)
+
+-- | A list of the tags that belong to this profiling group.
+profilingGroupDescription_tags :: Lens.Lens' ProfilingGroupDescription (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+profilingGroupDescription_tags = Lens.lens (\ProfilingGroupDescription' {tags} -> tags) (\s@ProfilingGroupDescription' {} a -> s {tags = a} :: ProfilingGroupDescription) Prelude.. Lens.mapping Lens.coerced
+
+-- | The date and time when the profiling group was last updated. Specify
+-- using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
+-- represents 1 millisecond past June 1, 2020 1:15:02 PM UTC.
+profilingGroupDescription_updatedAt :: Lens.Lens' ProfilingGroupDescription (Prelude.Maybe Prelude.UTCTime)
+profilingGroupDescription_updatedAt = Lens.lens (\ProfilingGroupDescription' {updatedAt} -> updatedAt) (\s@ProfilingGroupDescription' {} a -> s {updatedAt = a} :: ProfilingGroupDescription) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON ProfilingGroupDescription where
+  parseJSON =
+    Data.withObject
+      "ProfilingGroupDescription"
+      ( \x ->
+          ProfilingGroupDescription'
+            Prelude.<$> (x Data..:? "agentOrchestrationConfig")
+            Prelude.<*> (x Data..:? "arn")
+            Prelude.<*> (x Data..:? "computePlatform")
+            Prelude.<*> (x Data..:? "createdAt")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "profilingStatus")
+            Prelude.<*> (x Data..:? "tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "updatedAt")
+      )
+
+instance Prelude.Hashable ProfilingGroupDescription where
+  hashWithSalt _salt ProfilingGroupDescription' {..} =
+    _salt
+      `Prelude.hashWithSalt` agentOrchestrationConfig
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` computePlatform
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` profilingStatus
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` updatedAt
+
+instance Prelude.NFData ProfilingGroupDescription where
+  rnf ProfilingGroupDescription' {..} =
+    Prelude.rnf agentOrchestrationConfig
+      `Prelude.seq` Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf computePlatform
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf profilingStatus
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf updatedAt
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/ProfilingStatus.hs b/gen/Amazonka/CodeGuruProfiler/Types/ProfilingStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/ProfilingStatus.hs
@@ -0,0 +1,122 @@
+{-# 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.CodeGuruProfiler.Types.ProfilingStatus
+-- 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.CodeGuruProfiler.Types.ProfilingStatus where
+
+import Amazonka.CodeGuruProfiler.Types.AggregatedProfileTime
+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
+
+-- | Profiling status includes information about the last time a profile
+-- agent pinged back, the last time a profile was received, and the
+-- aggregation period and start time for the most recent aggregated
+-- profile.
+--
+-- /See:/ 'newProfilingStatus' smart constructor.
+data ProfilingStatus = ProfilingStatus'
+  { -- | The date and time when the profiling agent most recently pinged back.
+    -- Specify using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
+    -- represents 1 millisecond past June 1, 2020 1:15:02 PM UTC.
+    latestAgentOrchestratedAt :: Prelude.Maybe Data.ISO8601,
+    -- | The date and time when the most recent profile was received. Specify
+    -- using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
+    -- represents 1 millisecond past June 1, 2020 1:15:02 PM UTC.
+    latestAgentProfileReportedAt :: Prelude.Maybe Data.ISO8601,
+    -- | An
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AggregatedProfileTime.html AggregatedProfileTime>
+    -- object that contains the aggregation period and start time for an
+    -- aggregated profile.
+    latestAggregatedProfile :: Prelude.Maybe AggregatedProfileTime
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ProfilingStatus' 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:
+--
+-- 'latestAgentOrchestratedAt', 'profilingStatus_latestAgentOrchestratedAt' - The date and time when the profiling agent most recently pinged back.
+-- Specify using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
+-- represents 1 millisecond past June 1, 2020 1:15:02 PM UTC.
+--
+-- 'latestAgentProfileReportedAt', 'profilingStatus_latestAgentProfileReportedAt' - The date and time when the most recent profile was received. Specify
+-- using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
+-- represents 1 millisecond past June 1, 2020 1:15:02 PM UTC.
+--
+-- 'latestAggregatedProfile', 'profilingStatus_latestAggregatedProfile' - An
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AggregatedProfileTime.html AggregatedProfileTime>
+-- object that contains the aggregation period and start time for an
+-- aggregated profile.
+newProfilingStatus ::
+  ProfilingStatus
+newProfilingStatus =
+  ProfilingStatus'
+    { latestAgentOrchestratedAt =
+        Prelude.Nothing,
+      latestAgentProfileReportedAt = Prelude.Nothing,
+      latestAggregatedProfile = Prelude.Nothing
+    }
+
+-- | The date and time when the profiling agent most recently pinged back.
+-- Specify using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
+-- represents 1 millisecond past June 1, 2020 1:15:02 PM UTC.
+profilingStatus_latestAgentOrchestratedAt :: Lens.Lens' ProfilingStatus (Prelude.Maybe Prelude.UTCTime)
+profilingStatus_latestAgentOrchestratedAt = Lens.lens (\ProfilingStatus' {latestAgentOrchestratedAt} -> latestAgentOrchestratedAt) (\s@ProfilingStatus' {} a -> s {latestAgentOrchestratedAt = a} :: ProfilingStatus) Prelude.. Lens.mapping Data._Time
+
+-- | The date and time when the most recent profile was received. Specify
+-- using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
+-- represents 1 millisecond past June 1, 2020 1:15:02 PM UTC.
+profilingStatus_latestAgentProfileReportedAt :: Lens.Lens' ProfilingStatus (Prelude.Maybe Prelude.UTCTime)
+profilingStatus_latestAgentProfileReportedAt = Lens.lens (\ProfilingStatus' {latestAgentProfileReportedAt} -> latestAgentProfileReportedAt) (\s@ProfilingStatus' {} a -> s {latestAgentProfileReportedAt = a} :: ProfilingStatus) Prelude.. Lens.mapping Data._Time
+
+-- | An
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_AggregatedProfileTime.html AggregatedProfileTime>
+-- object that contains the aggregation period and start time for an
+-- aggregated profile.
+profilingStatus_latestAggregatedProfile :: Lens.Lens' ProfilingStatus (Prelude.Maybe AggregatedProfileTime)
+profilingStatus_latestAggregatedProfile = Lens.lens (\ProfilingStatus' {latestAggregatedProfile} -> latestAggregatedProfile) (\s@ProfilingStatus' {} a -> s {latestAggregatedProfile = a} :: ProfilingStatus)
+
+instance Data.FromJSON ProfilingStatus where
+  parseJSON =
+    Data.withObject
+      "ProfilingStatus"
+      ( \x ->
+          ProfilingStatus'
+            Prelude.<$> (x Data..:? "latestAgentOrchestratedAt")
+            Prelude.<*> (x Data..:? "latestAgentProfileReportedAt")
+            Prelude.<*> (x Data..:? "latestAggregatedProfile")
+      )
+
+instance Prelude.Hashable ProfilingStatus where
+  hashWithSalt _salt ProfilingStatus' {..} =
+    _salt
+      `Prelude.hashWithSalt` latestAgentOrchestratedAt
+      `Prelude.hashWithSalt` latestAgentProfileReportedAt
+      `Prelude.hashWithSalt` latestAggregatedProfile
+
+instance Prelude.NFData ProfilingStatus where
+  rnf ProfilingStatus' {..} =
+    Prelude.rnf latestAgentOrchestratedAt
+      `Prelude.seq` Prelude.rnf latestAgentProfileReportedAt
+      `Prelude.seq` Prelude.rnf latestAggregatedProfile
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/Recommendation.hs b/gen/Amazonka/CodeGuruProfiler/Types/Recommendation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/Recommendation.hs
@@ -0,0 +1,172 @@
+{-# 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.CodeGuruProfiler.Types.Recommendation
+-- 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.CodeGuruProfiler.Types.Recommendation where
+
+import Amazonka.CodeGuruProfiler.Types.Match
+import Amazonka.CodeGuruProfiler.Types.Pattern
+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 potential improvement that was found from analyzing the profiling
+-- data.
+--
+-- /See:/ 'newRecommendation' smart constructor.
+data Recommendation = Recommendation'
+  { -- | How many different places in the profile graph triggered a match.
+    allMatchesCount :: Prelude.Int,
+    -- | How much of the total sample count is potentially affected.
+    allMatchesSum :: Prelude.Double,
+    -- | End time of the profile that was used by this analysis. This is
+    -- specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    endTime :: Data.ISO8601,
+    -- | The pattern that analysis recognized in the profile to make this
+    -- recommendation.
+    pattern' :: Pattern,
+    -- | The start time of the profile that was used by this analysis. This is
+    -- specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    startTime :: Data.ISO8601,
+    -- | List of the matches with most impact.
+    topMatches :: [Match]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Recommendation' 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:
+--
+-- 'allMatchesCount', 'recommendation_allMatchesCount' - How many different places in the profile graph triggered a match.
+--
+-- 'allMatchesSum', 'recommendation_allMatchesSum' - How much of the total sample count is potentially affected.
+--
+-- 'endTime', 'recommendation_endTime' - End time of the profile that was used by this analysis. This is
+-- specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+--
+-- 'pattern'', 'recommendation_pattern' - The pattern that analysis recognized in the profile to make this
+-- recommendation.
+--
+-- 'startTime', 'recommendation_startTime' - The start time of the profile that was used by this analysis. This is
+-- specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+--
+-- 'topMatches', 'recommendation_topMatches' - List of the matches with most impact.
+newRecommendation ::
+  -- | 'allMatchesCount'
+  Prelude.Int ->
+  -- | 'allMatchesSum'
+  Prelude.Double ->
+  -- | 'endTime'
+  Prelude.UTCTime ->
+  -- | 'pattern''
+  Pattern ->
+  -- | 'startTime'
+  Prelude.UTCTime ->
+  Recommendation
+newRecommendation
+  pAllMatchesCount_
+  pAllMatchesSum_
+  pEndTime_
+  pPattern_
+  pStartTime_ =
+    Recommendation'
+      { allMatchesCount =
+          pAllMatchesCount_,
+        allMatchesSum = pAllMatchesSum_,
+        endTime = Data._Time Lens.# pEndTime_,
+        pattern' = pPattern_,
+        startTime = Data._Time Lens.# pStartTime_,
+        topMatches = Prelude.mempty
+      }
+
+-- | How many different places in the profile graph triggered a match.
+recommendation_allMatchesCount :: Lens.Lens' Recommendation Prelude.Int
+recommendation_allMatchesCount = Lens.lens (\Recommendation' {allMatchesCount} -> allMatchesCount) (\s@Recommendation' {} a -> s {allMatchesCount = a} :: Recommendation)
+
+-- | How much of the total sample count is potentially affected.
+recommendation_allMatchesSum :: Lens.Lens' Recommendation Prelude.Double
+recommendation_allMatchesSum = Lens.lens (\Recommendation' {allMatchesSum} -> allMatchesSum) (\s@Recommendation' {} a -> s {allMatchesSum = a} :: Recommendation)
+
+-- | End time of the profile that was used by this analysis. This is
+-- specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+recommendation_endTime :: Lens.Lens' Recommendation Prelude.UTCTime
+recommendation_endTime = Lens.lens (\Recommendation' {endTime} -> endTime) (\s@Recommendation' {} a -> s {endTime = a} :: Recommendation) Prelude.. Data._Time
+
+-- | The pattern that analysis recognized in the profile to make this
+-- recommendation.
+recommendation_pattern :: Lens.Lens' Recommendation Pattern
+recommendation_pattern = Lens.lens (\Recommendation' {pattern'} -> pattern') (\s@Recommendation' {} a -> s {pattern' = a} :: Recommendation)
+
+-- | The start time of the profile that was used by this analysis. This is
+-- specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+recommendation_startTime :: Lens.Lens' Recommendation Prelude.UTCTime
+recommendation_startTime = Lens.lens (\Recommendation' {startTime} -> startTime) (\s@Recommendation' {} a -> s {startTime = a} :: Recommendation) Prelude.. Data._Time
+
+-- | List of the matches with most impact.
+recommendation_topMatches :: Lens.Lens' Recommendation [Match]
+recommendation_topMatches = Lens.lens (\Recommendation' {topMatches} -> topMatches) (\s@Recommendation' {} a -> s {topMatches = a} :: Recommendation) Prelude.. Lens.coerced
+
+instance Data.FromJSON Recommendation where
+  parseJSON =
+    Data.withObject
+      "Recommendation"
+      ( \x ->
+          Recommendation'
+            Prelude.<$> (x Data..: "allMatchesCount")
+            Prelude.<*> (x Data..: "allMatchesSum")
+            Prelude.<*> (x Data..: "endTime")
+            Prelude.<*> (x Data..: "pattern")
+            Prelude.<*> (x Data..: "startTime")
+            Prelude.<*> (x Data..:? "topMatches" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable Recommendation where
+  hashWithSalt _salt Recommendation' {..} =
+    _salt
+      `Prelude.hashWithSalt` allMatchesCount
+      `Prelude.hashWithSalt` allMatchesSum
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` pattern'
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` topMatches
+
+instance Prelude.NFData Recommendation where
+  rnf Recommendation' {..} =
+    Prelude.rnf allMatchesCount
+      `Prelude.seq` Prelude.rnf allMatchesSum
+      `Prelude.seq` Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf pattern'
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf topMatches
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/TimestampStructure.hs b/gen/Amazonka/CodeGuruProfiler/Types/TimestampStructure.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/TimestampStructure.hs
@@ -0,0 +1,80 @@
+{-# 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.CodeGuruProfiler.Types.TimestampStructure
+-- 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.CodeGuruProfiler.Types.TimestampStructure 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 data type that contains a @Timestamp@ object. This is specified using
+-- the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z represents 1
+-- millisecond past June 1, 2020 1:15:02 PM UTC.
+--
+-- /See:/ 'newTimestampStructure' smart constructor.
+data TimestampStructure = TimestampStructure'
+  { -- | A @Timestamp@. This is specified using the ISO 8601 format. For example,
+    -- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+    -- 1:15:02 PM UTC.
+    value :: Data.ISO8601
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TimestampStructure' 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:
+--
+-- 'value', 'timestampStructure_value' - A @Timestamp@. This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+newTimestampStructure ::
+  -- | 'value'
+  Prelude.UTCTime ->
+  TimestampStructure
+newTimestampStructure pValue_ =
+  TimestampStructure'
+    { value =
+        Data._Time Lens.# pValue_
+    }
+
+-- | A @Timestamp@. This is specified using the ISO 8601 format. For example,
+-- 2020-06-01T13:15:02.001Z represents 1 millisecond past June 1, 2020
+-- 1:15:02 PM UTC.
+timestampStructure_value :: Lens.Lens' TimestampStructure Prelude.UTCTime
+timestampStructure_value = Lens.lens (\TimestampStructure' {value} -> value) (\s@TimestampStructure' {} a -> s {value = a} :: TimestampStructure) Prelude.. Data._Time
+
+instance Data.FromJSON TimestampStructure where
+  parseJSON =
+    Data.withObject
+      "TimestampStructure"
+      ( \x ->
+          TimestampStructure' Prelude.<$> (x Data..: "value")
+      )
+
+instance Prelude.Hashable TimestampStructure where
+  hashWithSalt _salt TimestampStructure' {..} =
+    _salt `Prelude.hashWithSalt` value
+
+instance Prelude.NFData TimestampStructure where
+  rnf TimestampStructure' {..} = Prelude.rnf value
diff --git a/gen/Amazonka/CodeGuruProfiler/Types/UserFeedback.hs b/gen/Amazonka/CodeGuruProfiler/Types/UserFeedback.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/Types/UserFeedback.hs
@@ -0,0 +1,73 @@
+{-# 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.CodeGuruProfiler.Types.UserFeedback
+-- 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.CodeGuruProfiler.Types.UserFeedback where
+
+import Amazonka.CodeGuruProfiler.Types.FeedbackType
+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
+
+-- | Feedback that can be submitted for each instance of an anomaly by the
+-- user. Feedback is be used for improvements in generating recommendations
+-- for the application.
+--
+-- /See:/ 'newUserFeedback' smart constructor.
+data UserFeedback = UserFeedback'
+  { -- | Optional @Positive@ or @Negative@ feedback submitted by the user about
+    -- whether the recommendation is useful or not.
+    type' :: FeedbackType
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UserFeedback' 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:
+--
+-- 'type'', 'userFeedback_type' - Optional @Positive@ or @Negative@ feedback submitted by the user about
+-- whether the recommendation is useful or not.
+newUserFeedback ::
+  -- | 'type''
+  FeedbackType ->
+  UserFeedback
+newUserFeedback pType_ =
+  UserFeedback' {type' = pType_}
+
+-- | Optional @Positive@ or @Negative@ feedback submitted by the user about
+-- whether the recommendation is useful or not.
+userFeedback_type :: Lens.Lens' UserFeedback FeedbackType
+userFeedback_type = Lens.lens (\UserFeedback' {type'} -> type') (\s@UserFeedback' {} a -> s {type' = a} :: UserFeedback)
+
+instance Data.FromJSON UserFeedback where
+  parseJSON =
+    Data.withObject
+      "UserFeedback"
+      (\x -> UserFeedback' Prelude.<$> (x Data..: "type"))
+
+instance Prelude.Hashable UserFeedback where
+  hashWithSalt _salt UserFeedback' {..} =
+    _salt `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData UserFeedback where
+  rnf UserFeedback' {..} = Prelude.rnf type'
diff --git a/gen/Amazonka/CodeGuruProfiler/UntagResource.hs b/gen/Amazonka/CodeGuruProfiler/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/UntagResource.hs
@@ -0,0 +1,167 @@
+{-# 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.CodeGuruProfiler.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Use to remove one or more tags from a resource.
+module Amazonka.CodeGuruProfiler.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource that contains the tags to
+    -- remove.
+    resourceArn :: Prelude.Text,
+    -- | A list of tag keys. Existing tags of resources with keys in this list
+    -- are removed from the specified resource.
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' 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:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The Amazon Resource Name (ARN) of the resource that contains the tags to
+-- remove.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - A list of tag keys. Existing tags of resources with keys in this list
+-- are removed from the specified resource.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource that contains the tags to
+-- remove.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | A list of tag keys. Existing tags of resources with keys in this list
+-- are removed from the specified resource.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath UntagResource' {..} =
+    Prelude.mconcat ["/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat
+      ["tagKeys" Data.=: Data.toQueryList "member" tagKeys]
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' 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:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/CodeGuruProfiler/UpdateProfilingGroup.hs b/gen/Amazonka/CodeGuruProfiler/UpdateProfilingGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/UpdateProfilingGroup.hs
@@ -0,0 +1,208 @@
+{-# 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.CodeGuruProfiler.UpdateProfilingGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a profiling group.
+module Amazonka.CodeGuruProfiler.UpdateProfilingGroup
+  ( -- * Creating a Request
+    UpdateProfilingGroup (..),
+    newUpdateProfilingGroup,
+
+    -- * Request Lenses
+    updateProfilingGroup_agentOrchestrationConfig,
+    updateProfilingGroup_profilingGroupName,
+
+    -- * Destructuring the Response
+    UpdateProfilingGroupResponse (..),
+    newUpdateProfilingGroupResponse,
+
+    -- * Response Lenses
+    updateProfilingGroupResponse_httpStatus,
+    updateProfilingGroupResponse_profilingGroup,
+  )
+where
+
+import Amazonka.CodeGuruProfiler.Types
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | The structure representing the updateProfilingGroupRequest.
+--
+-- /See:/ 'newUpdateProfilingGroup' smart constructor.
+data UpdateProfilingGroup = UpdateProfilingGroup'
+  { -- | Specifies whether profiling is enabled or disabled for a profiling
+    -- group.
+    agentOrchestrationConfig :: AgentOrchestrationConfig,
+    -- | The name of the profiling group to update.
+    profilingGroupName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateProfilingGroup' 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:
+--
+-- 'agentOrchestrationConfig', 'updateProfilingGroup_agentOrchestrationConfig' - Specifies whether profiling is enabled or disabled for a profiling
+-- group.
+--
+-- 'profilingGroupName', 'updateProfilingGroup_profilingGroupName' - The name of the profiling group to update.
+newUpdateProfilingGroup ::
+  -- | 'agentOrchestrationConfig'
+  AgentOrchestrationConfig ->
+  -- | 'profilingGroupName'
+  Prelude.Text ->
+  UpdateProfilingGroup
+newUpdateProfilingGroup
+  pAgentOrchestrationConfig_
+  pProfilingGroupName_ =
+    UpdateProfilingGroup'
+      { agentOrchestrationConfig =
+          pAgentOrchestrationConfig_,
+        profilingGroupName = pProfilingGroupName_
+      }
+
+-- | Specifies whether profiling is enabled or disabled for a profiling
+-- group.
+updateProfilingGroup_agentOrchestrationConfig :: Lens.Lens' UpdateProfilingGroup AgentOrchestrationConfig
+updateProfilingGroup_agentOrchestrationConfig = Lens.lens (\UpdateProfilingGroup' {agentOrchestrationConfig} -> agentOrchestrationConfig) (\s@UpdateProfilingGroup' {} a -> s {agentOrchestrationConfig = a} :: UpdateProfilingGroup)
+
+-- | The name of the profiling group to update.
+updateProfilingGroup_profilingGroupName :: Lens.Lens' UpdateProfilingGroup Prelude.Text
+updateProfilingGroup_profilingGroupName = Lens.lens (\UpdateProfilingGroup' {profilingGroupName} -> profilingGroupName) (\s@UpdateProfilingGroup' {} a -> s {profilingGroupName = a} :: UpdateProfilingGroup)
+
+instance Core.AWSRequest UpdateProfilingGroup where
+  type
+    AWSResponse UpdateProfilingGroup =
+      UpdateProfilingGroupResponse
+  request overrides =
+    Request.putJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateProfilingGroupResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (Data.eitherParseJSON x)
+      )
+
+instance Prelude.Hashable UpdateProfilingGroup where
+  hashWithSalt _salt UpdateProfilingGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` agentOrchestrationConfig
+      `Prelude.hashWithSalt` profilingGroupName
+
+instance Prelude.NFData UpdateProfilingGroup where
+  rnf UpdateProfilingGroup' {..} =
+    Prelude.rnf agentOrchestrationConfig
+      `Prelude.seq` Prelude.rnf profilingGroupName
+
+instance Data.ToHeaders UpdateProfilingGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateProfilingGroup where
+  toJSON UpdateProfilingGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "agentOrchestrationConfig"
+                  Data..= agentOrchestrationConfig
+              )
+          ]
+      )
+
+instance Data.ToPath UpdateProfilingGroup where
+  toPath UpdateProfilingGroup' {..} =
+    Prelude.mconcat
+      ["/profilingGroups/", Data.toBS profilingGroupName]
+
+instance Data.ToQuery UpdateProfilingGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | The structure representing the updateProfilingGroupResponse.
+--
+-- /See:/ 'newUpdateProfilingGroupResponse' smart constructor.
+data UpdateProfilingGroupResponse = UpdateProfilingGroupResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | A
+    -- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+    -- that contains information about the returned updated profiling group.
+    profilingGroup :: ProfilingGroupDescription
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateProfilingGroupResponse' 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:
+--
+-- 'httpStatus', 'updateProfilingGroupResponse_httpStatus' - The response's http status code.
+--
+-- 'profilingGroup', 'updateProfilingGroupResponse_profilingGroup' - A
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- that contains information about the returned updated profiling group.
+newUpdateProfilingGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'profilingGroup'
+  ProfilingGroupDescription ->
+  UpdateProfilingGroupResponse
+newUpdateProfilingGroupResponse
+  pHttpStatus_
+  pProfilingGroup_ =
+    UpdateProfilingGroupResponse'
+      { httpStatus =
+          pHttpStatus_,
+        profilingGroup = pProfilingGroup_
+      }
+
+-- | The response's http status code.
+updateProfilingGroupResponse_httpStatus :: Lens.Lens' UpdateProfilingGroupResponse Prelude.Int
+updateProfilingGroupResponse_httpStatus = Lens.lens (\UpdateProfilingGroupResponse' {httpStatus} -> httpStatus) (\s@UpdateProfilingGroupResponse' {} a -> s {httpStatus = a} :: UpdateProfilingGroupResponse)
+
+-- | A
+-- <https://docs.aws.amazon.com/codeguru/latest/profiler-api/API_ProfilingGroupDescription.html ProfilingGroupDescription>
+-- that contains information about the returned updated profiling group.
+updateProfilingGroupResponse_profilingGroup :: Lens.Lens' UpdateProfilingGroupResponse ProfilingGroupDescription
+updateProfilingGroupResponse_profilingGroup = Lens.lens (\UpdateProfilingGroupResponse' {profilingGroup} -> profilingGroup) (\s@UpdateProfilingGroupResponse' {} a -> s {profilingGroup = a} :: UpdateProfilingGroupResponse)
+
+instance Prelude.NFData UpdateProfilingGroupResponse where
+  rnf UpdateProfilingGroupResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf profilingGroup
diff --git a/gen/Amazonka/CodeGuruProfiler/Waiters.hs b/gen/Amazonka/CodeGuruProfiler/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/CodeGuruProfiler/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.CodeGuruProfiler.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.CodeGuruProfiler.Waiters where
+
+import Amazonka.CodeGuruProfiler.Lens
+import Amazonka.CodeGuruProfiler.Types
+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
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.CodeGuruProfiler
+import Test.Amazonka.CodeGuruProfiler.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "CodeGuruProfiler"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/CodeGuruProfiler.hs b/test/Test/Amazonka/CodeGuruProfiler.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/CodeGuruProfiler.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.CodeGuruProfiler
+-- 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.CodeGuruProfiler
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/CodeGuruProfiler/Internal.hs b/test/Test/Amazonka/CodeGuruProfiler/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/CodeGuruProfiler/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.CodeGuruProfiler.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.CodeGuruProfiler.Internal where
diff --git a/test/Test/Amazonka/Gen/CodeGuruProfiler.hs b/test/Test/Amazonka/Gen/CodeGuruProfiler.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/CodeGuruProfiler.hs
@@ -0,0 +1,498 @@
+{-# 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.CodeGuruProfiler
+-- 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.CodeGuruProfiler where
+
+import Amazonka.CodeGuruProfiler
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.CodeGuruProfiler.Internal
+import Test.Amazonka.Fixture
+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"
+--         [ requestAddNotificationChannels $
+--             newAddNotificationChannels
+--
+--         , requestBatchGetFrameMetricData $
+--             newBatchGetFrameMetricData
+--
+--         , requestConfigureAgent $
+--             newConfigureAgent
+--
+--         , requestCreateProfilingGroup $
+--             newCreateProfilingGroup
+--
+--         , requestDeleteProfilingGroup $
+--             newDeleteProfilingGroup
+--
+--         , requestDescribeProfilingGroup $
+--             newDescribeProfilingGroup
+--
+--         , requestGetFindingsReportAccountSummary $
+--             newGetFindingsReportAccountSummary
+--
+--         , requestGetNotificationConfiguration $
+--             newGetNotificationConfiguration
+--
+--         , requestGetPolicy $
+--             newGetPolicy
+--
+--         , requestGetProfile $
+--             newGetProfile
+--
+--         , requestGetRecommendations $
+--             newGetRecommendations
+--
+--         , requestListFindingsReports $
+--             newListFindingsReports
+--
+--         , requestListProfileTimes $
+--             newListProfileTimes
+--
+--         , requestListProfilingGroups $
+--             newListProfilingGroups
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestPostAgentProfile $
+--             newPostAgentProfile
+--
+--         , requestPutPermission $
+--             newPutPermission
+--
+--         , requestRemoveNotificationChannel $
+--             newRemoveNotificationChannel
+--
+--         , requestRemovePermission $
+--             newRemovePermission
+--
+--         , requestSubmitFeedback $
+--             newSubmitFeedback
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateProfilingGroup $
+--             newUpdateProfilingGroup
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseAddNotificationChannels $
+--             newAddNotificationChannelsResponse
+--
+--         , responseBatchGetFrameMetricData $
+--             newBatchGetFrameMetricDataResponse
+--
+--         , responseConfigureAgent $
+--             newConfigureAgentResponse
+--
+--         , responseCreateProfilingGroup $
+--             newCreateProfilingGroupResponse
+--
+--         , responseDeleteProfilingGroup $
+--             newDeleteProfilingGroupResponse
+--
+--         , responseDescribeProfilingGroup $
+--             newDescribeProfilingGroupResponse
+--
+--         , responseGetFindingsReportAccountSummary $
+--             newGetFindingsReportAccountSummaryResponse
+--
+--         , responseGetNotificationConfiguration $
+--             newGetNotificationConfigurationResponse
+--
+--         , responseGetPolicy $
+--             newGetPolicyResponse
+--
+--         , responseGetProfile $
+--             newGetProfileResponse
+--
+--         , responseGetRecommendations $
+--             newGetRecommendationsResponse
+--
+--         , responseListFindingsReports $
+--             newListFindingsReportsResponse
+--
+--         , responseListProfileTimes $
+--             newListProfileTimesResponse
+--
+--         , responseListProfilingGroups $
+--             newListProfilingGroupsResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responsePostAgentProfile $
+--             newPostAgentProfileResponse
+--
+--         , responsePutPermission $
+--             newPutPermissionResponse
+--
+--         , responseRemoveNotificationChannel $
+--             newRemoveNotificationChannelResponse
+--
+--         , responseRemovePermission $
+--             newRemovePermissionResponse
+--
+--         , responseSubmitFeedback $
+--             newSubmitFeedbackResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateProfilingGroup $
+--             newUpdateProfilingGroupResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestAddNotificationChannels :: AddNotificationChannels -> TestTree
+requestAddNotificationChannels =
+  req
+    "AddNotificationChannels"
+    "fixture/AddNotificationChannels.yaml"
+
+requestBatchGetFrameMetricData :: BatchGetFrameMetricData -> TestTree
+requestBatchGetFrameMetricData =
+  req
+    "BatchGetFrameMetricData"
+    "fixture/BatchGetFrameMetricData.yaml"
+
+requestConfigureAgent :: ConfigureAgent -> TestTree
+requestConfigureAgent =
+  req
+    "ConfigureAgent"
+    "fixture/ConfigureAgent.yaml"
+
+requestCreateProfilingGroup :: CreateProfilingGroup -> TestTree
+requestCreateProfilingGroup =
+  req
+    "CreateProfilingGroup"
+    "fixture/CreateProfilingGroup.yaml"
+
+requestDeleteProfilingGroup :: DeleteProfilingGroup -> TestTree
+requestDeleteProfilingGroup =
+  req
+    "DeleteProfilingGroup"
+    "fixture/DeleteProfilingGroup.yaml"
+
+requestDescribeProfilingGroup :: DescribeProfilingGroup -> TestTree
+requestDescribeProfilingGroup =
+  req
+    "DescribeProfilingGroup"
+    "fixture/DescribeProfilingGroup.yaml"
+
+requestGetFindingsReportAccountSummary :: GetFindingsReportAccountSummary -> TestTree
+requestGetFindingsReportAccountSummary =
+  req
+    "GetFindingsReportAccountSummary"
+    "fixture/GetFindingsReportAccountSummary.yaml"
+
+requestGetNotificationConfiguration :: GetNotificationConfiguration -> TestTree
+requestGetNotificationConfiguration =
+  req
+    "GetNotificationConfiguration"
+    "fixture/GetNotificationConfiguration.yaml"
+
+requestGetPolicy :: GetPolicy -> TestTree
+requestGetPolicy =
+  req
+    "GetPolicy"
+    "fixture/GetPolicy.yaml"
+
+requestGetProfile :: GetProfile -> TestTree
+requestGetProfile =
+  req
+    "GetProfile"
+    "fixture/GetProfile.yaml"
+
+requestGetRecommendations :: GetRecommendations -> TestTree
+requestGetRecommendations =
+  req
+    "GetRecommendations"
+    "fixture/GetRecommendations.yaml"
+
+requestListFindingsReports :: ListFindingsReports -> TestTree
+requestListFindingsReports =
+  req
+    "ListFindingsReports"
+    "fixture/ListFindingsReports.yaml"
+
+requestListProfileTimes :: ListProfileTimes -> TestTree
+requestListProfileTimes =
+  req
+    "ListProfileTimes"
+    "fixture/ListProfileTimes.yaml"
+
+requestListProfilingGroups :: ListProfilingGroups -> TestTree
+requestListProfilingGroups =
+  req
+    "ListProfilingGroups"
+    "fixture/ListProfilingGroups.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestPostAgentProfile :: PostAgentProfile -> TestTree
+requestPostAgentProfile =
+  req
+    "PostAgentProfile"
+    "fixture/PostAgentProfile.yaml"
+
+requestPutPermission :: PutPermission -> TestTree
+requestPutPermission =
+  req
+    "PutPermission"
+    "fixture/PutPermission.yaml"
+
+requestRemoveNotificationChannel :: RemoveNotificationChannel -> TestTree
+requestRemoveNotificationChannel =
+  req
+    "RemoveNotificationChannel"
+    "fixture/RemoveNotificationChannel.yaml"
+
+requestRemovePermission :: RemovePermission -> TestTree
+requestRemovePermission =
+  req
+    "RemovePermission"
+    "fixture/RemovePermission.yaml"
+
+requestSubmitFeedback :: SubmitFeedback -> TestTree
+requestSubmitFeedback =
+  req
+    "SubmitFeedback"
+    "fixture/SubmitFeedback.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateProfilingGroup :: UpdateProfilingGroup -> TestTree
+requestUpdateProfilingGroup =
+  req
+    "UpdateProfilingGroup"
+    "fixture/UpdateProfilingGroup.yaml"
+
+-- Responses
+
+responseAddNotificationChannels :: AddNotificationChannelsResponse -> TestTree
+responseAddNotificationChannels =
+  res
+    "AddNotificationChannelsResponse"
+    "fixture/AddNotificationChannelsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy AddNotificationChannels)
+
+responseBatchGetFrameMetricData :: BatchGetFrameMetricDataResponse -> TestTree
+responseBatchGetFrameMetricData =
+  res
+    "BatchGetFrameMetricDataResponse"
+    "fixture/BatchGetFrameMetricDataResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchGetFrameMetricData)
+
+responseConfigureAgent :: ConfigureAgentResponse -> TestTree
+responseConfigureAgent =
+  res
+    "ConfigureAgentResponse"
+    "fixture/ConfigureAgentResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ConfigureAgent)
+
+responseCreateProfilingGroup :: CreateProfilingGroupResponse -> TestTree
+responseCreateProfilingGroup =
+  res
+    "CreateProfilingGroupResponse"
+    "fixture/CreateProfilingGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateProfilingGroup)
+
+responseDeleteProfilingGroup :: DeleteProfilingGroupResponse -> TestTree
+responseDeleteProfilingGroup =
+  res
+    "DeleteProfilingGroupResponse"
+    "fixture/DeleteProfilingGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteProfilingGroup)
+
+responseDescribeProfilingGroup :: DescribeProfilingGroupResponse -> TestTree
+responseDescribeProfilingGroup =
+  res
+    "DescribeProfilingGroupResponse"
+    "fixture/DescribeProfilingGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeProfilingGroup)
+
+responseGetFindingsReportAccountSummary :: GetFindingsReportAccountSummaryResponse -> TestTree
+responseGetFindingsReportAccountSummary =
+  res
+    "GetFindingsReportAccountSummaryResponse"
+    "fixture/GetFindingsReportAccountSummaryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetFindingsReportAccountSummary)
+
+responseGetNotificationConfiguration :: GetNotificationConfigurationResponse -> TestTree
+responseGetNotificationConfiguration =
+  res
+    "GetNotificationConfigurationResponse"
+    "fixture/GetNotificationConfigurationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetNotificationConfiguration)
+
+responseGetPolicy :: GetPolicyResponse -> TestTree
+responseGetPolicy =
+  res
+    "GetPolicyResponse"
+    "fixture/GetPolicyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetPolicy)
+
+responseGetProfile :: GetProfileResponse -> TestTree
+responseGetProfile =
+  res
+    "GetProfileResponse"
+    "fixture/GetProfileResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetProfile)
+
+responseGetRecommendations :: GetRecommendationsResponse -> TestTree
+responseGetRecommendations =
+  res
+    "GetRecommendationsResponse"
+    "fixture/GetRecommendationsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetRecommendations)
+
+responseListFindingsReports :: ListFindingsReportsResponse -> TestTree
+responseListFindingsReports =
+  res
+    "ListFindingsReportsResponse"
+    "fixture/ListFindingsReportsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListFindingsReports)
+
+responseListProfileTimes :: ListProfileTimesResponse -> TestTree
+responseListProfileTimes =
+  res
+    "ListProfileTimesResponse"
+    "fixture/ListProfileTimesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListProfileTimes)
+
+responseListProfilingGroups :: ListProfilingGroupsResponse -> TestTree
+responseListProfilingGroups =
+  res
+    "ListProfilingGroupsResponse"
+    "fixture/ListProfilingGroupsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListProfilingGroups)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responsePostAgentProfile :: PostAgentProfileResponse -> TestTree
+responsePostAgentProfile =
+  res
+    "PostAgentProfileResponse"
+    "fixture/PostAgentProfileResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PostAgentProfile)
+
+responsePutPermission :: PutPermissionResponse -> TestTree
+responsePutPermission =
+  res
+    "PutPermissionResponse"
+    "fixture/PutPermissionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutPermission)
+
+responseRemoveNotificationChannel :: RemoveNotificationChannelResponse -> TestTree
+responseRemoveNotificationChannel =
+  res
+    "RemoveNotificationChannelResponse"
+    "fixture/RemoveNotificationChannelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RemoveNotificationChannel)
+
+responseRemovePermission :: RemovePermissionResponse -> TestTree
+responseRemovePermission =
+  res
+    "RemovePermissionResponse"
+    "fixture/RemovePermissionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy RemovePermission)
+
+responseSubmitFeedback :: SubmitFeedbackResponse -> TestTree
+responseSubmitFeedback =
+  res
+    "SubmitFeedbackResponse"
+    "fixture/SubmitFeedbackResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy SubmitFeedback)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUpdateProfilingGroup :: UpdateProfilingGroupResponse -> TestTree
+responseUpdateProfilingGroup =
+  res
+    "UpdateProfilingGroupResponse"
+    "fixture/UpdateProfilingGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateProfilingGroup)
