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 CloudWatch RUM SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2018-05-10@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-rum)
+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.Rum](http://hackage.haskell.org/package/amazonka-rum/docs/Amazonka-Rum.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-rum` 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-rum.cabal b/amazonka-rum.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-rum.cabal
@@ -0,0 +1,120 @@
+cabal-version:      2.2
+name:               amazonka-rum
+version:            2.0
+synopsis:           Amazon CloudWatch RUM SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2018-05-10@ 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.Rum.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.Rum" 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-rum
+
+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.Rum
+    Amazonka.Rum.BatchCreateRumMetricDefinitions
+    Amazonka.Rum.BatchDeleteRumMetricDefinitions
+    Amazonka.Rum.BatchGetRumMetricDefinitions
+    Amazonka.Rum.CreateAppMonitor
+    Amazonka.Rum.DeleteAppMonitor
+    Amazonka.Rum.DeleteRumMetricsDestination
+    Amazonka.Rum.GetAppMonitor
+    Amazonka.Rum.GetAppMonitorData
+    Amazonka.Rum.Lens
+    Amazonka.Rum.ListAppMonitors
+    Amazonka.Rum.ListRumMetricsDestinations
+    Amazonka.Rum.ListTagsForResource
+    Amazonka.Rum.PutRumEvents
+    Amazonka.Rum.PutRumMetricsDestination
+    Amazonka.Rum.TagResource
+    Amazonka.Rum.Types
+    Amazonka.Rum.Types.AppMonitor
+    Amazonka.Rum.Types.AppMonitorConfiguration
+    Amazonka.Rum.Types.AppMonitorDetails
+    Amazonka.Rum.Types.AppMonitorSummary
+    Amazonka.Rum.Types.BatchCreateRumMetricDefinitionsError
+    Amazonka.Rum.Types.BatchDeleteRumMetricDefinitionsError
+    Amazonka.Rum.Types.CustomEvents
+    Amazonka.Rum.Types.CustomEventsStatus
+    Amazonka.Rum.Types.CwLog
+    Amazonka.Rum.Types.DataStorage
+    Amazonka.Rum.Types.MetricDefinition
+    Amazonka.Rum.Types.MetricDefinitionRequest
+    Amazonka.Rum.Types.MetricDestination
+    Amazonka.Rum.Types.MetricDestinationSummary
+    Amazonka.Rum.Types.QueryFilter
+    Amazonka.Rum.Types.RumEvent
+    Amazonka.Rum.Types.StateEnum
+    Amazonka.Rum.Types.Telemetry
+    Amazonka.Rum.Types.TimeRange
+    Amazonka.Rum.Types.UserDetails
+    Amazonka.Rum.UntagResource
+    Amazonka.Rum.UpdateAppMonitor
+    Amazonka.Rum.UpdateRumMetricDefinition
+    Amazonka.Rum.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-rum-test
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
+
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.Gen.Rum
+    Test.Amazonka.Rum
+    Test.Amazonka.Rum.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-rum
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/BatchCreateRumMetricDefinitions.yaml b/fixture/BatchCreateRumMetricDefinitions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchCreateRumMetricDefinitions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/BatchCreateRumMetricDefinitionsResponse.proto b/fixture/BatchCreateRumMetricDefinitionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchCreateRumMetricDefinitionsResponse.proto
diff --git a/fixture/BatchDeleteRumMetricDefinitions.yaml b/fixture/BatchDeleteRumMetricDefinitions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDeleteRumMetricDefinitions.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/BatchDeleteRumMetricDefinitionsResponse.proto b/fixture/BatchDeleteRumMetricDefinitionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchDeleteRumMetricDefinitionsResponse.proto
diff --git a/fixture/BatchGetRumMetricDefinitions.yaml b/fixture/BatchGetRumMetricDefinitions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetRumMetricDefinitions.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/BatchGetRumMetricDefinitionsResponse.proto b/fixture/BatchGetRumMetricDefinitionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/BatchGetRumMetricDefinitionsResponse.proto
diff --git a/fixture/CreateAppMonitor.yaml b/fixture/CreateAppMonitor.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateAppMonitor.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/CreateAppMonitorResponse.proto b/fixture/CreateAppMonitorResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateAppMonitorResponse.proto
diff --git a/fixture/DeleteAppMonitor.yaml b/fixture/DeleteAppMonitor.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAppMonitor.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/DeleteAppMonitorResponse.proto b/fixture/DeleteAppMonitorResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteAppMonitorResponse.proto
diff --git a/fixture/DeleteRumMetricsDestination.yaml b/fixture/DeleteRumMetricsDestination.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRumMetricsDestination.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/DeleteRumMetricsDestinationResponse.proto b/fixture/DeleteRumMetricsDestinationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRumMetricsDestinationResponse.proto
diff --git a/fixture/GetAppMonitor.yaml b/fixture/GetAppMonitor.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetAppMonitor.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/GetAppMonitorData.yaml b/fixture/GetAppMonitorData.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetAppMonitorData.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/GetAppMonitorDataResponse.proto b/fixture/GetAppMonitorDataResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetAppMonitorDataResponse.proto
diff --git a/fixture/GetAppMonitorResponse.proto b/fixture/GetAppMonitorResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetAppMonitorResponse.proto
diff --git a/fixture/ListAppMonitors.yaml b/fixture/ListAppMonitors.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListAppMonitors.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/ListAppMonitorsResponse.proto b/fixture/ListAppMonitorsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListAppMonitorsResponse.proto
diff --git a/fixture/ListRumMetricsDestinations.yaml b/fixture/ListRumMetricsDestinations.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListRumMetricsDestinations.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/ListRumMetricsDestinationsResponse.proto b/fixture/ListRumMetricsDestinationsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListRumMetricsDestinationsResponse.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/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/PutRumEvents.yaml b/fixture/PutRumEvents.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutRumEvents.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/PutRumEventsResponse.proto b/fixture/PutRumEventsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutRumEventsResponse.proto
diff --git a/fixture/PutRumMetricsDestination.yaml b/fixture/PutRumMetricsDestination.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/PutRumMetricsDestination.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/PutRumMetricsDestinationResponse.proto b/fixture/PutRumMetricsDestinationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/PutRumMetricsDestinationResponse.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/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/UpdateAppMonitor.yaml b/fixture/UpdateAppMonitor.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAppMonitor.yaml
@@ -0,0 +1,10 @@
+---
+method: PATCH
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/UpdateAppMonitorResponse.proto b/fixture/UpdateAppMonitorResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateAppMonitorResponse.proto
diff --git a/fixture/UpdateRumMetricDefinition.yaml b/fixture/UpdateRumMetricDefinition.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateRumMetricDefinition.yaml
@@ -0,0 +1,10 @@
+---
+method: PATCH
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/rum/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  rum.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/UpdateRumMetricDefinitionResponse.proto b/fixture/UpdateRumMetricDefinitionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateRumMetricDefinitionResponse.proto
diff --git a/gen/Amazonka/Rum.hs b/gen/Amazonka/Rum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum.hs
@@ -0,0 +1,289 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.Rum
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2018-05-10@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- With Amazon CloudWatch RUM, you can perform real-user monitoring to
+-- collect client-side data about your web application performance from
+-- actual user sessions in real time. The data collected includes page load
+-- times, client-side errors, and user behavior. When you view this data,
+-- you can see it all aggregated together and also see breakdowns by the
+-- browsers and devices that your customers use.
+--
+-- You can use the collected data to quickly identify and debug client-side
+-- performance issues. CloudWatch RUM helps you visualize anomalies in your
+-- application performance and find relevant debugging data such as error
+-- messages, stack traces, and user sessions. You can also use RUM to
+-- understand the range of end-user impact including the number of users,
+-- geolocations, and browsers used.
+module Amazonka.Rum
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** BatchCreateRumMetricDefinitions
+    BatchCreateRumMetricDefinitions (BatchCreateRumMetricDefinitions'),
+    newBatchCreateRumMetricDefinitions,
+    BatchCreateRumMetricDefinitionsResponse (BatchCreateRumMetricDefinitionsResponse'),
+    newBatchCreateRumMetricDefinitionsResponse,
+
+    -- ** BatchDeleteRumMetricDefinitions
+    BatchDeleteRumMetricDefinitions (BatchDeleteRumMetricDefinitions'),
+    newBatchDeleteRumMetricDefinitions,
+    BatchDeleteRumMetricDefinitionsResponse (BatchDeleteRumMetricDefinitionsResponse'),
+    newBatchDeleteRumMetricDefinitionsResponse,
+
+    -- ** BatchGetRumMetricDefinitions (Paginated)
+    BatchGetRumMetricDefinitions (BatchGetRumMetricDefinitions'),
+    newBatchGetRumMetricDefinitions,
+    BatchGetRumMetricDefinitionsResponse (BatchGetRumMetricDefinitionsResponse'),
+    newBatchGetRumMetricDefinitionsResponse,
+
+    -- ** CreateAppMonitor
+    CreateAppMonitor (CreateAppMonitor'),
+    newCreateAppMonitor,
+    CreateAppMonitorResponse (CreateAppMonitorResponse'),
+    newCreateAppMonitorResponse,
+
+    -- ** DeleteAppMonitor
+    DeleteAppMonitor (DeleteAppMonitor'),
+    newDeleteAppMonitor,
+    DeleteAppMonitorResponse (DeleteAppMonitorResponse'),
+    newDeleteAppMonitorResponse,
+
+    -- ** DeleteRumMetricsDestination
+    DeleteRumMetricsDestination (DeleteRumMetricsDestination'),
+    newDeleteRumMetricsDestination,
+    DeleteRumMetricsDestinationResponse (DeleteRumMetricsDestinationResponse'),
+    newDeleteRumMetricsDestinationResponse,
+
+    -- ** GetAppMonitor
+    GetAppMonitor (GetAppMonitor'),
+    newGetAppMonitor,
+    GetAppMonitorResponse (GetAppMonitorResponse'),
+    newGetAppMonitorResponse,
+
+    -- ** GetAppMonitorData (Paginated)
+    GetAppMonitorData (GetAppMonitorData'),
+    newGetAppMonitorData,
+    GetAppMonitorDataResponse (GetAppMonitorDataResponse'),
+    newGetAppMonitorDataResponse,
+
+    -- ** ListAppMonitors (Paginated)
+    ListAppMonitors (ListAppMonitors'),
+    newListAppMonitors,
+    ListAppMonitorsResponse (ListAppMonitorsResponse'),
+    newListAppMonitorsResponse,
+
+    -- ** ListRumMetricsDestinations (Paginated)
+    ListRumMetricsDestinations (ListRumMetricsDestinations'),
+    newListRumMetricsDestinations,
+    ListRumMetricsDestinationsResponse (ListRumMetricsDestinationsResponse'),
+    newListRumMetricsDestinationsResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** PutRumEvents
+    PutRumEvents (PutRumEvents'),
+    newPutRumEvents,
+    PutRumEventsResponse (PutRumEventsResponse'),
+    newPutRumEventsResponse,
+
+    -- ** PutRumMetricsDestination
+    PutRumMetricsDestination (PutRumMetricsDestination'),
+    newPutRumMetricsDestination,
+    PutRumMetricsDestinationResponse (PutRumMetricsDestinationResponse'),
+    newPutRumMetricsDestinationResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateAppMonitor
+    UpdateAppMonitor (UpdateAppMonitor'),
+    newUpdateAppMonitor,
+    UpdateAppMonitorResponse (UpdateAppMonitorResponse'),
+    newUpdateAppMonitorResponse,
+
+    -- ** UpdateRumMetricDefinition
+    UpdateRumMetricDefinition (UpdateRumMetricDefinition'),
+    newUpdateRumMetricDefinition,
+    UpdateRumMetricDefinitionResponse (UpdateRumMetricDefinitionResponse'),
+    newUpdateRumMetricDefinitionResponse,
+
+    -- * Types
+
+    -- ** CustomEventsStatus
+    CustomEventsStatus (..),
+
+    -- ** MetricDestination
+    MetricDestination (..),
+
+    -- ** StateEnum
+    StateEnum (..),
+
+    -- ** Telemetry
+    Telemetry (..),
+
+    -- ** AppMonitor
+    AppMonitor (AppMonitor'),
+    newAppMonitor,
+
+    -- ** AppMonitorConfiguration
+    AppMonitorConfiguration (AppMonitorConfiguration'),
+    newAppMonitorConfiguration,
+
+    -- ** AppMonitorDetails
+    AppMonitorDetails (AppMonitorDetails'),
+    newAppMonitorDetails,
+
+    -- ** AppMonitorSummary
+    AppMonitorSummary (AppMonitorSummary'),
+    newAppMonitorSummary,
+
+    -- ** BatchCreateRumMetricDefinitionsError
+    BatchCreateRumMetricDefinitionsError (BatchCreateRumMetricDefinitionsError'),
+    newBatchCreateRumMetricDefinitionsError,
+
+    -- ** BatchDeleteRumMetricDefinitionsError
+    BatchDeleteRumMetricDefinitionsError (BatchDeleteRumMetricDefinitionsError'),
+    newBatchDeleteRumMetricDefinitionsError,
+
+    -- ** CustomEvents
+    CustomEvents (CustomEvents'),
+    newCustomEvents,
+
+    -- ** CwLog
+    CwLog (CwLog'),
+    newCwLog,
+
+    -- ** DataStorage
+    DataStorage (DataStorage'),
+    newDataStorage,
+
+    -- ** MetricDefinition
+    MetricDefinition (MetricDefinition'),
+    newMetricDefinition,
+
+    -- ** MetricDefinitionRequest
+    MetricDefinitionRequest (MetricDefinitionRequest'),
+    newMetricDefinitionRequest,
+
+    -- ** MetricDestinationSummary
+    MetricDestinationSummary (MetricDestinationSummary'),
+    newMetricDestinationSummary,
+
+    -- ** QueryFilter
+    QueryFilter (QueryFilter'),
+    newQueryFilter,
+
+    -- ** RumEvent
+    RumEvent (RumEvent'),
+    newRumEvent,
+
+    -- ** TimeRange
+    TimeRange (TimeRange'),
+    newTimeRange,
+
+    -- ** UserDetails
+    UserDetails (UserDetails'),
+    newUserDetails,
+  )
+where
+
+import Amazonka.Rum.BatchCreateRumMetricDefinitions
+import Amazonka.Rum.BatchDeleteRumMetricDefinitions
+import Amazonka.Rum.BatchGetRumMetricDefinitions
+import Amazonka.Rum.CreateAppMonitor
+import Amazonka.Rum.DeleteAppMonitor
+import Amazonka.Rum.DeleteRumMetricsDestination
+import Amazonka.Rum.GetAppMonitor
+import Amazonka.Rum.GetAppMonitorData
+import Amazonka.Rum.Lens
+import Amazonka.Rum.ListAppMonitors
+import Amazonka.Rum.ListRumMetricsDestinations
+import Amazonka.Rum.ListTagsForResource
+import Amazonka.Rum.PutRumEvents
+import Amazonka.Rum.PutRumMetricsDestination
+import Amazonka.Rum.TagResource
+import Amazonka.Rum.Types
+import Amazonka.Rum.UntagResource
+import Amazonka.Rum.UpdateAppMonitor
+import Amazonka.Rum.UpdateRumMetricDefinition
+import Amazonka.Rum.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 'Rum'.
+
+-- $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/Rum/BatchCreateRumMetricDefinitions.hs b/gen/Amazonka/Rum/BatchCreateRumMetricDefinitions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/BatchCreateRumMetricDefinitions.hs
@@ -0,0 +1,312 @@
+{-# 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.Rum.BatchCreateRumMetricDefinitions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Specifies the extended metrics that you want a CloudWatch RUM app
+-- monitor to send to a destination. Valid destinations include CloudWatch
+-- and Evidently.
+--
+-- By default, RUM app monitors send some metrics to CloudWatch. These
+-- default metrics are listed in
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-metrics.html CloudWatch metrics that you can collect with CloudWatch RUM>.
+--
+-- If you also send extended metrics, you can send metrics to Evidently as
+-- well as CloudWatch, and you can also optionally send the metrics with
+-- additional dimensions. The valid dimension names for the additional
+-- dimensions are @BrowserName@, @CountryCode@, @DeviceType@, @FileType@,
+-- @OSName@, and @PageId@. For more information, see
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-vended-metrics.html Extended metrics that you can send to CloudWatch and CloudWatch Evidently>.
+--
+-- The maximum number of metric definitions that you can specify in one
+-- @BatchCreateRumMetricDefinitions@ operation is 200.
+--
+-- The maximum number of metric definitions that one destination can
+-- contain is 2000.
+--
+-- Extended metrics sent are charged as CloudWatch custom metrics. Each
+-- combination of additional dimension name and dimension value counts as a
+-- custom metric. For more information, see
+-- <https://aws.amazon.com/cloudwatch/pricing/ Amazon CloudWatch Pricing>.
+--
+-- You must have already created a destination for the metrics before you
+-- send them. For more information, see
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_PutRumMetricsDestination.html PutRumMetricsDestination>.
+--
+-- If some metric definitions specified in a
+-- @BatchCreateRumMetricDefinitions@ operations are not valid, those metric
+-- definitions fail and return errors, but all valid metric definitions in
+-- the same operation still succeed.
+module Amazonka.Rum.BatchCreateRumMetricDefinitions
+  ( -- * Creating a Request
+    BatchCreateRumMetricDefinitions (..),
+    newBatchCreateRumMetricDefinitions,
+
+    -- * Request Lenses
+    batchCreateRumMetricDefinitions_destinationArn,
+    batchCreateRumMetricDefinitions_appMonitorName,
+    batchCreateRumMetricDefinitions_destination,
+    batchCreateRumMetricDefinitions_metricDefinitions,
+
+    -- * Destructuring the Response
+    BatchCreateRumMetricDefinitionsResponse (..),
+    newBatchCreateRumMetricDefinitionsResponse,
+
+    -- * Response Lenses
+    batchCreateRumMetricDefinitionsResponse_metricDefinitions,
+    batchCreateRumMetricDefinitionsResponse_httpStatus,
+    batchCreateRumMetricDefinitionsResponse_errors,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newBatchCreateRumMetricDefinitions' smart constructor.
+data BatchCreateRumMetricDefinitions = BatchCreateRumMetricDefinitions'
+  { -- | This parameter is required if @Destination@ is @Evidently@. If
+    -- @Destination@ is @CloudWatch@, do not use this parameter.
+    --
+    -- This parameter specifies the ARN of the Evidently experiment that is to
+    -- receive the metrics. You must have already defined this experiment as a
+    -- valid destination. For more information, see
+    -- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_PutRumMetricsDestination.html PutRumMetricsDestination>.
+    destinationArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the CloudWatch RUM app monitor that is to send the metrics.
+    appMonitorName :: Prelude.Text,
+    -- | The destination to send the metrics to. Valid values are @CloudWatch@
+    -- and @Evidently@. If you specify @Evidently@, you must also specify the
+    -- ARN of the CloudWatchEvidently experiment that will receive the metrics
+    -- and an IAM role that has permission to write to the experiment.
+    destination :: MetricDestination,
+    -- | An array of structures which define the metrics that you want to send.
+    metricDefinitions :: [MetricDefinitionRequest]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchCreateRumMetricDefinitions' 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:
+--
+-- 'destinationArn', 'batchCreateRumMetricDefinitions_destinationArn' - This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter.
+--
+-- This parameter specifies the ARN of the Evidently experiment that is to
+-- receive the metrics. You must have already defined this experiment as a
+-- valid destination. For more information, see
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_PutRumMetricsDestination.html PutRumMetricsDestination>.
+--
+-- 'appMonitorName', 'batchCreateRumMetricDefinitions_appMonitorName' - The name of the CloudWatch RUM app monitor that is to send the metrics.
+--
+-- 'destination', 'batchCreateRumMetricDefinitions_destination' - The destination to send the metrics to. Valid values are @CloudWatch@
+-- and @Evidently@. If you specify @Evidently@, you must also specify the
+-- ARN of the CloudWatchEvidently experiment that will receive the metrics
+-- and an IAM role that has permission to write to the experiment.
+--
+-- 'metricDefinitions', 'batchCreateRumMetricDefinitions_metricDefinitions' - An array of structures which define the metrics that you want to send.
+newBatchCreateRumMetricDefinitions ::
+  -- | 'appMonitorName'
+  Prelude.Text ->
+  -- | 'destination'
+  MetricDestination ->
+  BatchCreateRumMetricDefinitions
+newBatchCreateRumMetricDefinitions
+  pAppMonitorName_
+  pDestination_ =
+    BatchCreateRumMetricDefinitions'
+      { destinationArn =
+          Prelude.Nothing,
+        appMonitorName = pAppMonitorName_,
+        destination = pDestination_,
+        metricDefinitions = Prelude.mempty
+      }
+
+-- | This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter.
+--
+-- This parameter specifies the ARN of the Evidently experiment that is to
+-- receive the metrics. You must have already defined this experiment as a
+-- valid destination. For more information, see
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_PutRumMetricsDestination.html PutRumMetricsDestination>.
+batchCreateRumMetricDefinitions_destinationArn :: Lens.Lens' BatchCreateRumMetricDefinitions (Prelude.Maybe Prelude.Text)
+batchCreateRumMetricDefinitions_destinationArn = Lens.lens (\BatchCreateRumMetricDefinitions' {destinationArn} -> destinationArn) (\s@BatchCreateRumMetricDefinitions' {} a -> s {destinationArn = a} :: BatchCreateRumMetricDefinitions)
+
+-- | The name of the CloudWatch RUM app monitor that is to send the metrics.
+batchCreateRumMetricDefinitions_appMonitorName :: Lens.Lens' BatchCreateRumMetricDefinitions Prelude.Text
+batchCreateRumMetricDefinitions_appMonitorName = Lens.lens (\BatchCreateRumMetricDefinitions' {appMonitorName} -> appMonitorName) (\s@BatchCreateRumMetricDefinitions' {} a -> s {appMonitorName = a} :: BatchCreateRumMetricDefinitions)
+
+-- | The destination to send the metrics to. Valid values are @CloudWatch@
+-- and @Evidently@. If you specify @Evidently@, you must also specify the
+-- ARN of the CloudWatchEvidently experiment that will receive the metrics
+-- and an IAM role that has permission to write to the experiment.
+batchCreateRumMetricDefinitions_destination :: Lens.Lens' BatchCreateRumMetricDefinitions MetricDestination
+batchCreateRumMetricDefinitions_destination = Lens.lens (\BatchCreateRumMetricDefinitions' {destination} -> destination) (\s@BatchCreateRumMetricDefinitions' {} a -> s {destination = a} :: BatchCreateRumMetricDefinitions)
+
+-- | An array of structures which define the metrics that you want to send.
+batchCreateRumMetricDefinitions_metricDefinitions :: Lens.Lens' BatchCreateRumMetricDefinitions [MetricDefinitionRequest]
+batchCreateRumMetricDefinitions_metricDefinitions = Lens.lens (\BatchCreateRumMetricDefinitions' {metricDefinitions} -> metricDefinitions) (\s@BatchCreateRumMetricDefinitions' {} a -> s {metricDefinitions = a} :: BatchCreateRumMetricDefinitions) Prelude.. Lens.coerced
+
+instance
+  Core.AWSRequest
+    BatchCreateRumMetricDefinitions
+  where
+  type
+    AWSResponse BatchCreateRumMetricDefinitions =
+      BatchCreateRumMetricDefinitionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchCreateRumMetricDefinitionsResponse'
+            Prelude.<$> ( x
+                            Data..?> "MetricDefinitions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "Errors" Core..!@ Prelude.mempty)
+      )
+
+instance
+  Prelude.Hashable
+    BatchCreateRumMetricDefinitions
+  where
+  hashWithSalt
+    _salt
+    BatchCreateRumMetricDefinitions' {..} =
+      _salt
+        `Prelude.hashWithSalt` destinationArn
+        `Prelude.hashWithSalt` appMonitorName
+        `Prelude.hashWithSalt` destination
+        `Prelude.hashWithSalt` metricDefinitions
+
+instance
+  Prelude.NFData
+    BatchCreateRumMetricDefinitions
+  where
+  rnf BatchCreateRumMetricDefinitions' {..} =
+    Prelude.rnf destinationArn
+      `Prelude.seq` Prelude.rnf appMonitorName
+      `Prelude.seq` Prelude.rnf destination
+      `Prelude.seq` Prelude.rnf metricDefinitions
+
+instance
+  Data.ToHeaders
+    BatchCreateRumMetricDefinitions
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON BatchCreateRumMetricDefinitions where
+  toJSON BatchCreateRumMetricDefinitions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DestinationArn" Data..=)
+              Prelude.<$> destinationArn,
+            Prelude.Just ("Destination" Data..= destination),
+            Prelude.Just
+              ("MetricDefinitions" Data..= metricDefinitions)
+          ]
+      )
+
+instance Data.ToPath BatchCreateRumMetricDefinitions where
+  toPath BatchCreateRumMetricDefinitions' {..} =
+    Prelude.mconcat
+      [ "/rummetrics/",
+        Data.toBS appMonitorName,
+        "/metrics"
+      ]
+
+instance Data.ToQuery BatchCreateRumMetricDefinitions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newBatchCreateRumMetricDefinitionsResponse' smart constructor.
+data BatchCreateRumMetricDefinitionsResponse = BatchCreateRumMetricDefinitionsResponse'
+  { -- | An array of structures that define the extended metrics.
+    metricDefinitions :: Prelude.Maybe [MetricDefinition],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | An array of error objects, if the operation caused any errors.
+    errors :: [BatchCreateRumMetricDefinitionsError]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchCreateRumMetricDefinitionsResponse' 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:
+--
+-- 'metricDefinitions', 'batchCreateRumMetricDefinitionsResponse_metricDefinitions' - An array of structures that define the extended metrics.
+--
+-- 'httpStatus', 'batchCreateRumMetricDefinitionsResponse_httpStatus' - The response's http status code.
+--
+-- 'errors', 'batchCreateRumMetricDefinitionsResponse_errors' - An array of error objects, if the operation caused any errors.
+newBatchCreateRumMetricDefinitionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchCreateRumMetricDefinitionsResponse
+newBatchCreateRumMetricDefinitionsResponse
+  pHttpStatus_ =
+    BatchCreateRumMetricDefinitionsResponse'
+      { metricDefinitions =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        errors = Prelude.mempty
+      }
+
+-- | An array of structures that define the extended metrics.
+batchCreateRumMetricDefinitionsResponse_metricDefinitions :: Lens.Lens' BatchCreateRumMetricDefinitionsResponse (Prelude.Maybe [MetricDefinition])
+batchCreateRumMetricDefinitionsResponse_metricDefinitions = Lens.lens (\BatchCreateRumMetricDefinitionsResponse' {metricDefinitions} -> metricDefinitions) (\s@BatchCreateRumMetricDefinitionsResponse' {} a -> s {metricDefinitions = a} :: BatchCreateRumMetricDefinitionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchCreateRumMetricDefinitionsResponse_httpStatus :: Lens.Lens' BatchCreateRumMetricDefinitionsResponse Prelude.Int
+batchCreateRumMetricDefinitionsResponse_httpStatus = Lens.lens (\BatchCreateRumMetricDefinitionsResponse' {httpStatus} -> httpStatus) (\s@BatchCreateRumMetricDefinitionsResponse' {} a -> s {httpStatus = a} :: BatchCreateRumMetricDefinitionsResponse)
+
+-- | An array of error objects, if the operation caused any errors.
+batchCreateRumMetricDefinitionsResponse_errors :: Lens.Lens' BatchCreateRumMetricDefinitionsResponse [BatchCreateRumMetricDefinitionsError]
+batchCreateRumMetricDefinitionsResponse_errors = Lens.lens (\BatchCreateRumMetricDefinitionsResponse' {errors} -> errors) (\s@BatchCreateRumMetricDefinitionsResponse' {} a -> s {errors = a} :: BatchCreateRumMetricDefinitionsResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    BatchCreateRumMetricDefinitionsResponse
+  where
+  rnf BatchCreateRumMetricDefinitionsResponse' {..} =
+    Prelude.rnf metricDefinitions
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf errors
diff --git a/gen/Amazonka/Rum/BatchDeleteRumMetricDefinitions.hs b/gen/Amazonka/Rum/BatchDeleteRumMetricDefinitions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/BatchDeleteRumMetricDefinitions.hs
@@ -0,0 +1,285 @@
+{-# 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.Rum.BatchDeleteRumMetricDefinitions
+-- 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 the specified metrics from being sent to an extended metrics
+-- destination.
+--
+-- If some metric definition IDs specified in a
+-- @BatchDeleteRumMetricDefinitions@ operations are not valid, those metric
+-- definitions fail and return errors, but all valid metric definition IDs
+-- in the same operation are still deleted.
+--
+-- The maximum number of metric definitions that you can specify in one
+-- @BatchDeleteRumMetricDefinitions@ operation is 200.
+module Amazonka.Rum.BatchDeleteRumMetricDefinitions
+  ( -- * Creating a Request
+    BatchDeleteRumMetricDefinitions (..),
+    newBatchDeleteRumMetricDefinitions,
+
+    -- * Request Lenses
+    batchDeleteRumMetricDefinitions_destinationArn,
+    batchDeleteRumMetricDefinitions_appMonitorName,
+    batchDeleteRumMetricDefinitions_destination,
+    batchDeleteRumMetricDefinitions_metricDefinitionIds,
+
+    -- * Destructuring the Response
+    BatchDeleteRumMetricDefinitionsResponse (..),
+    newBatchDeleteRumMetricDefinitionsResponse,
+
+    -- * Response Lenses
+    batchDeleteRumMetricDefinitionsResponse_metricDefinitionIds,
+    batchDeleteRumMetricDefinitionsResponse_httpStatus,
+    batchDeleteRumMetricDefinitionsResponse_errors,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newBatchDeleteRumMetricDefinitions' smart constructor.
+data BatchDeleteRumMetricDefinitions = BatchDeleteRumMetricDefinitions'
+  { -- | This parameter is required if @Destination@ is @Evidently@. If
+    -- @Destination@ is @CloudWatch@, do not use this parameter.
+    --
+    -- This parameter specifies the ARN of the Evidently experiment that was
+    -- receiving the metrics that are being deleted.
+    destinationArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the CloudWatch RUM app monitor that is sending these
+    -- metrics.
+    appMonitorName :: Prelude.Text,
+    -- | Defines the destination where you want to stop sending the specified
+    -- metrics. Valid values are @CloudWatch@ and @Evidently@. If you specify
+    -- @Evidently@, you must also specify the ARN of the CloudWatchEvidently
+    -- experiment that is to be the destination and an IAM role that has
+    -- permission to write to the experiment.
+    destination :: MetricDestination,
+    -- | An array of structures which define the metrics that you want to stop
+    -- sending.
+    metricDefinitionIds :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDeleteRumMetricDefinitions' 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:
+--
+-- 'destinationArn', 'batchDeleteRumMetricDefinitions_destinationArn' - This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter.
+--
+-- This parameter specifies the ARN of the Evidently experiment that was
+-- receiving the metrics that are being deleted.
+--
+-- 'appMonitorName', 'batchDeleteRumMetricDefinitions_appMonitorName' - The name of the CloudWatch RUM app monitor that is sending these
+-- metrics.
+--
+-- 'destination', 'batchDeleteRumMetricDefinitions_destination' - Defines the destination where you want to stop sending the specified
+-- metrics. Valid values are @CloudWatch@ and @Evidently@. If you specify
+-- @Evidently@, you must also specify the ARN of the CloudWatchEvidently
+-- experiment that is to be the destination and an IAM role that has
+-- permission to write to the experiment.
+--
+-- 'metricDefinitionIds', 'batchDeleteRumMetricDefinitions_metricDefinitionIds' - An array of structures which define the metrics that you want to stop
+-- sending.
+newBatchDeleteRumMetricDefinitions ::
+  -- | 'appMonitorName'
+  Prelude.Text ->
+  -- | 'destination'
+  MetricDestination ->
+  BatchDeleteRumMetricDefinitions
+newBatchDeleteRumMetricDefinitions
+  pAppMonitorName_
+  pDestination_ =
+    BatchDeleteRumMetricDefinitions'
+      { destinationArn =
+          Prelude.Nothing,
+        appMonitorName = pAppMonitorName_,
+        destination = pDestination_,
+        metricDefinitionIds = Prelude.mempty
+      }
+
+-- | This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter.
+--
+-- This parameter specifies the ARN of the Evidently experiment that was
+-- receiving the metrics that are being deleted.
+batchDeleteRumMetricDefinitions_destinationArn :: Lens.Lens' BatchDeleteRumMetricDefinitions (Prelude.Maybe Prelude.Text)
+batchDeleteRumMetricDefinitions_destinationArn = Lens.lens (\BatchDeleteRumMetricDefinitions' {destinationArn} -> destinationArn) (\s@BatchDeleteRumMetricDefinitions' {} a -> s {destinationArn = a} :: BatchDeleteRumMetricDefinitions)
+
+-- | The name of the CloudWatch RUM app monitor that is sending these
+-- metrics.
+batchDeleteRumMetricDefinitions_appMonitorName :: Lens.Lens' BatchDeleteRumMetricDefinitions Prelude.Text
+batchDeleteRumMetricDefinitions_appMonitorName = Lens.lens (\BatchDeleteRumMetricDefinitions' {appMonitorName} -> appMonitorName) (\s@BatchDeleteRumMetricDefinitions' {} a -> s {appMonitorName = a} :: BatchDeleteRumMetricDefinitions)
+
+-- | Defines the destination where you want to stop sending the specified
+-- metrics. Valid values are @CloudWatch@ and @Evidently@. If you specify
+-- @Evidently@, you must also specify the ARN of the CloudWatchEvidently
+-- experiment that is to be the destination and an IAM role that has
+-- permission to write to the experiment.
+batchDeleteRumMetricDefinitions_destination :: Lens.Lens' BatchDeleteRumMetricDefinitions MetricDestination
+batchDeleteRumMetricDefinitions_destination = Lens.lens (\BatchDeleteRumMetricDefinitions' {destination} -> destination) (\s@BatchDeleteRumMetricDefinitions' {} a -> s {destination = a} :: BatchDeleteRumMetricDefinitions)
+
+-- | An array of structures which define the metrics that you want to stop
+-- sending.
+batchDeleteRumMetricDefinitions_metricDefinitionIds :: Lens.Lens' BatchDeleteRumMetricDefinitions [Prelude.Text]
+batchDeleteRumMetricDefinitions_metricDefinitionIds = Lens.lens (\BatchDeleteRumMetricDefinitions' {metricDefinitionIds} -> metricDefinitionIds) (\s@BatchDeleteRumMetricDefinitions' {} a -> s {metricDefinitionIds = a} :: BatchDeleteRumMetricDefinitions) Prelude.. Lens.coerced
+
+instance
+  Core.AWSRequest
+    BatchDeleteRumMetricDefinitions
+  where
+  type
+    AWSResponse BatchDeleteRumMetricDefinitions =
+      BatchDeleteRumMetricDefinitionsResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchDeleteRumMetricDefinitionsResponse'
+            Prelude.<$> ( x
+                            Data..?> "MetricDefinitionIds"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..?> "Errors" Core..!@ Prelude.mempty)
+      )
+
+instance
+  Prelude.Hashable
+    BatchDeleteRumMetricDefinitions
+  where
+  hashWithSalt
+    _salt
+    BatchDeleteRumMetricDefinitions' {..} =
+      _salt
+        `Prelude.hashWithSalt` destinationArn
+        `Prelude.hashWithSalt` appMonitorName
+        `Prelude.hashWithSalt` destination
+        `Prelude.hashWithSalt` metricDefinitionIds
+
+instance
+  Prelude.NFData
+    BatchDeleteRumMetricDefinitions
+  where
+  rnf BatchDeleteRumMetricDefinitions' {..} =
+    Prelude.rnf destinationArn
+      `Prelude.seq` Prelude.rnf appMonitorName
+      `Prelude.seq` Prelude.rnf destination
+      `Prelude.seq` Prelude.rnf metricDefinitionIds
+
+instance
+  Data.ToHeaders
+    BatchDeleteRumMetricDefinitions
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath BatchDeleteRumMetricDefinitions where
+  toPath BatchDeleteRumMetricDefinitions' {..} =
+    Prelude.mconcat
+      [ "/rummetrics/",
+        Data.toBS appMonitorName,
+        "/metrics"
+      ]
+
+instance Data.ToQuery BatchDeleteRumMetricDefinitions where
+  toQuery BatchDeleteRumMetricDefinitions' {..} =
+    Prelude.mconcat
+      [ "destinationArn" Data.=: destinationArn,
+        "destination" Data.=: destination,
+        "metricDefinitionIds"
+          Data.=: Data.toQueryList "member" metricDefinitionIds
+      ]
+
+-- | /See:/ 'newBatchDeleteRumMetricDefinitionsResponse' smart constructor.
+data BatchDeleteRumMetricDefinitionsResponse = BatchDeleteRumMetricDefinitionsResponse'
+  { -- | The IDs of the metric definitions that were deleted.
+    metricDefinitionIds :: Prelude.Maybe [Prelude.Text],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | An array of error objects, if the operation caused any errors.
+    errors :: [BatchDeleteRumMetricDefinitionsError]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDeleteRumMetricDefinitionsResponse' 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:
+--
+-- 'metricDefinitionIds', 'batchDeleteRumMetricDefinitionsResponse_metricDefinitionIds' - The IDs of the metric definitions that were deleted.
+--
+-- 'httpStatus', 'batchDeleteRumMetricDefinitionsResponse_httpStatus' - The response's http status code.
+--
+-- 'errors', 'batchDeleteRumMetricDefinitionsResponse_errors' - An array of error objects, if the operation caused any errors.
+newBatchDeleteRumMetricDefinitionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchDeleteRumMetricDefinitionsResponse
+newBatchDeleteRumMetricDefinitionsResponse
+  pHttpStatus_ =
+    BatchDeleteRumMetricDefinitionsResponse'
+      { metricDefinitionIds =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_,
+        errors = Prelude.mempty
+      }
+
+-- | The IDs of the metric definitions that were deleted.
+batchDeleteRumMetricDefinitionsResponse_metricDefinitionIds :: Lens.Lens' BatchDeleteRumMetricDefinitionsResponse (Prelude.Maybe [Prelude.Text])
+batchDeleteRumMetricDefinitionsResponse_metricDefinitionIds = Lens.lens (\BatchDeleteRumMetricDefinitionsResponse' {metricDefinitionIds} -> metricDefinitionIds) (\s@BatchDeleteRumMetricDefinitionsResponse' {} a -> s {metricDefinitionIds = a} :: BatchDeleteRumMetricDefinitionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+batchDeleteRumMetricDefinitionsResponse_httpStatus :: Lens.Lens' BatchDeleteRumMetricDefinitionsResponse Prelude.Int
+batchDeleteRumMetricDefinitionsResponse_httpStatus = Lens.lens (\BatchDeleteRumMetricDefinitionsResponse' {httpStatus} -> httpStatus) (\s@BatchDeleteRumMetricDefinitionsResponse' {} a -> s {httpStatus = a} :: BatchDeleteRumMetricDefinitionsResponse)
+
+-- | An array of error objects, if the operation caused any errors.
+batchDeleteRumMetricDefinitionsResponse_errors :: Lens.Lens' BatchDeleteRumMetricDefinitionsResponse [BatchDeleteRumMetricDefinitionsError]
+batchDeleteRumMetricDefinitionsResponse_errors = Lens.lens (\BatchDeleteRumMetricDefinitionsResponse' {errors} -> errors) (\s@BatchDeleteRumMetricDefinitionsResponse' {} a -> s {errors = a} :: BatchDeleteRumMetricDefinitionsResponse) Prelude.. Lens.coerced
+
+instance
+  Prelude.NFData
+    BatchDeleteRumMetricDefinitionsResponse
+  where
+  rnf BatchDeleteRumMetricDefinitionsResponse' {..} =
+    Prelude.rnf metricDefinitionIds
+      `Prelude.seq` Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf errors
diff --git a/gen/Amazonka/Rum/BatchGetRumMetricDefinitions.hs b/gen/Amazonka/Rum/BatchGetRumMetricDefinitions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/BatchGetRumMetricDefinitions.hs
@@ -0,0 +1,307 @@
+{-# 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.Rum.BatchGetRumMetricDefinitions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the list of metrics and dimensions that a RUM app monitor is
+-- sending to a single destination.
+--
+-- This operation returns paginated results.
+module Amazonka.Rum.BatchGetRumMetricDefinitions
+  ( -- * Creating a Request
+    BatchGetRumMetricDefinitions (..),
+    newBatchGetRumMetricDefinitions,
+
+    -- * Request Lenses
+    batchGetRumMetricDefinitions_destinationArn,
+    batchGetRumMetricDefinitions_maxResults,
+    batchGetRumMetricDefinitions_nextToken,
+    batchGetRumMetricDefinitions_appMonitorName,
+    batchGetRumMetricDefinitions_destination,
+
+    -- * Destructuring the Response
+    BatchGetRumMetricDefinitionsResponse (..),
+    newBatchGetRumMetricDefinitionsResponse,
+
+    -- * Response Lenses
+    batchGetRumMetricDefinitionsResponse_metricDefinitions,
+    batchGetRumMetricDefinitionsResponse_nextToken,
+    batchGetRumMetricDefinitionsResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newBatchGetRumMetricDefinitions' smart constructor.
+data BatchGetRumMetricDefinitions = BatchGetRumMetricDefinitions'
+  { -- | This parameter is required if @Destination@ is @Evidently@. If
+    -- @Destination@ is @CloudWatch@, do not use this parameter.
+    --
+    -- This parameter specifies the ARN of the Evidently experiment that
+    -- corresponds to the destination.
+    destinationArn :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of results to return in one operation. The default is
+    -- 50. The maximum that you can specify is 100.
+    --
+    -- To retrieve the remaining results, make another call with the returned
+    -- @NextToken@ value.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Use the token returned by the previous operation to request the next
+    -- page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the CloudWatch RUM app monitor that is sending the metrics.
+    appMonitorName :: Prelude.Text,
+    -- | The type of destination that you want to view metrics for. Valid values
+    -- are @CloudWatch@ and @Evidently@.
+    destination :: MetricDestination
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetRumMetricDefinitions' 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:
+--
+-- 'destinationArn', 'batchGetRumMetricDefinitions_destinationArn' - This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter.
+--
+-- This parameter specifies the ARN of the Evidently experiment that
+-- corresponds to the destination.
+--
+-- 'maxResults', 'batchGetRumMetricDefinitions_maxResults' - The maximum number of results to return in one operation. The default is
+-- 50. The maximum that you can specify is 100.
+--
+-- To retrieve the remaining results, make another call with the returned
+-- @NextToken@ value.
+--
+-- 'nextToken', 'batchGetRumMetricDefinitions_nextToken' - Use the token returned by the previous operation to request the next
+-- page of results.
+--
+-- 'appMonitorName', 'batchGetRumMetricDefinitions_appMonitorName' - The name of the CloudWatch RUM app monitor that is sending the metrics.
+--
+-- 'destination', 'batchGetRumMetricDefinitions_destination' - The type of destination that you want to view metrics for. Valid values
+-- are @CloudWatch@ and @Evidently@.
+newBatchGetRumMetricDefinitions ::
+  -- | 'appMonitorName'
+  Prelude.Text ->
+  -- | 'destination'
+  MetricDestination ->
+  BatchGetRumMetricDefinitions
+newBatchGetRumMetricDefinitions
+  pAppMonitorName_
+  pDestination_ =
+    BatchGetRumMetricDefinitions'
+      { destinationArn =
+          Prelude.Nothing,
+        maxResults = Prelude.Nothing,
+        nextToken = Prelude.Nothing,
+        appMonitorName = pAppMonitorName_,
+        destination = pDestination_
+      }
+
+-- | This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter.
+--
+-- This parameter specifies the ARN of the Evidently experiment that
+-- corresponds to the destination.
+batchGetRumMetricDefinitions_destinationArn :: Lens.Lens' BatchGetRumMetricDefinitions (Prelude.Maybe Prelude.Text)
+batchGetRumMetricDefinitions_destinationArn = Lens.lens (\BatchGetRumMetricDefinitions' {destinationArn} -> destinationArn) (\s@BatchGetRumMetricDefinitions' {} a -> s {destinationArn = a} :: BatchGetRumMetricDefinitions)
+
+-- | The maximum number of results to return in one operation. The default is
+-- 50. The maximum that you can specify is 100.
+--
+-- To retrieve the remaining results, make another call with the returned
+-- @NextToken@ value.
+batchGetRumMetricDefinitions_maxResults :: Lens.Lens' BatchGetRumMetricDefinitions (Prelude.Maybe Prelude.Natural)
+batchGetRumMetricDefinitions_maxResults = Lens.lens (\BatchGetRumMetricDefinitions' {maxResults} -> maxResults) (\s@BatchGetRumMetricDefinitions' {} a -> s {maxResults = a} :: BatchGetRumMetricDefinitions)
+
+-- | Use the token returned by the previous operation to request the next
+-- page of results.
+batchGetRumMetricDefinitions_nextToken :: Lens.Lens' BatchGetRumMetricDefinitions (Prelude.Maybe Prelude.Text)
+batchGetRumMetricDefinitions_nextToken = Lens.lens (\BatchGetRumMetricDefinitions' {nextToken} -> nextToken) (\s@BatchGetRumMetricDefinitions' {} a -> s {nextToken = a} :: BatchGetRumMetricDefinitions)
+
+-- | The name of the CloudWatch RUM app monitor that is sending the metrics.
+batchGetRumMetricDefinitions_appMonitorName :: Lens.Lens' BatchGetRumMetricDefinitions Prelude.Text
+batchGetRumMetricDefinitions_appMonitorName = Lens.lens (\BatchGetRumMetricDefinitions' {appMonitorName} -> appMonitorName) (\s@BatchGetRumMetricDefinitions' {} a -> s {appMonitorName = a} :: BatchGetRumMetricDefinitions)
+
+-- | The type of destination that you want to view metrics for. Valid values
+-- are @CloudWatch@ and @Evidently@.
+batchGetRumMetricDefinitions_destination :: Lens.Lens' BatchGetRumMetricDefinitions MetricDestination
+batchGetRumMetricDefinitions_destination = Lens.lens (\BatchGetRumMetricDefinitions' {destination} -> destination) (\s@BatchGetRumMetricDefinitions' {} a -> s {destination = a} :: BatchGetRumMetricDefinitions)
+
+instance Core.AWSPager BatchGetRumMetricDefinitions where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? batchGetRumMetricDefinitionsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? batchGetRumMetricDefinitionsResponse_metricDefinitions
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& batchGetRumMetricDefinitions_nextToken
+          Lens..~ rs
+          Lens.^? batchGetRumMetricDefinitionsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest BatchGetRumMetricDefinitions where
+  type
+    AWSResponse BatchGetRumMetricDefinitions =
+      BatchGetRumMetricDefinitionsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          BatchGetRumMetricDefinitionsResponse'
+            Prelude.<$> ( x
+                            Data..?> "MetricDefinitions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    BatchGetRumMetricDefinitions
+  where
+  hashWithSalt _salt BatchGetRumMetricDefinitions' {..} =
+    _salt
+      `Prelude.hashWithSalt` destinationArn
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` appMonitorName
+      `Prelude.hashWithSalt` destination
+
+instance Prelude.NFData BatchGetRumMetricDefinitions where
+  rnf BatchGetRumMetricDefinitions' {..} =
+    Prelude.rnf destinationArn
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf appMonitorName
+      `Prelude.seq` Prelude.rnf destination
+
+instance Data.ToHeaders BatchGetRumMetricDefinitions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath BatchGetRumMetricDefinitions where
+  toPath BatchGetRumMetricDefinitions' {..} =
+    Prelude.mconcat
+      [ "/rummetrics/",
+        Data.toBS appMonitorName,
+        "/metrics"
+      ]
+
+instance Data.ToQuery BatchGetRumMetricDefinitions where
+  toQuery BatchGetRumMetricDefinitions' {..} =
+    Prelude.mconcat
+      [ "destinationArn" Data.=: destinationArn,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "destination" Data.=: destination
+      ]
+
+-- | /See:/ 'newBatchGetRumMetricDefinitionsResponse' smart constructor.
+data BatchGetRumMetricDefinitionsResponse = BatchGetRumMetricDefinitionsResponse'
+  { -- | An array of structures that display information about the metrics that
+    -- are sent by the specified app monitor to the specified destination.
+    metricDefinitions :: Prelude.Maybe [MetricDefinition],
+    -- | A token that you can use in a subsequent operation to retrieve the next
+    -- set of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchGetRumMetricDefinitionsResponse' 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:
+--
+-- 'metricDefinitions', 'batchGetRumMetricDefinitionsResponse_metricDefinitions' - An array of structures that display information about the metrics that
+-- are sent by the specified app monitor to the specified destination.
+--
+-- 'nextToken', 'batchGetRumMetricDefinitionsResponse_nextToken' - A token that you can use in a subsequent operation to retrieve the next
+-- set of results.
+--
+-- 'httpStatus', 'batchGetRumMetricDefinitionsResponse_httpStatus' - The response's http status code.
+newBatchGetRumMetricDefinitionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  BatchGetRumMetricDefinitionsResponse
+newBatchGetRumMetricDefinitionsResponse pHttpStatus_ =
+  BatchGetRumMetricDefinitionsResponse'
+    { metricDefinitions =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of structures that display information about the metrics that
+-- are sent by the specified app monitor to the specified destination.
+batchGetRumMetricDefinitionsResponse_metricDefinitions :: Lens.Lens' BatchGetRumMetricDefinitionsResponse (Prelude.Maybe [MetricDefinition])
+batchGetRumMetricDefinitionsResponse_metricDefinitions = Lens.lens (\BatchGetRumMetricDefinitionsResponse' {metricDefinitions} -> metricDefinitions) (\s@BatchGetRumMetricDefinitionsResponse' {} a -> s {metricDefinitions = a} :: BatchGetRumMetricDefinitionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token that you can use in a subsequent operation to retrieve the next
+-- set of results.
+batchGetRumMetricDefinitionsResponse_nextToken :: Lens.Lens' BatchGetRumMetricDefinitionsResponse (Prelude.Maybe Prelude.Text)
+batchGetRumMetricDefinitionsResponse_nextToken = Lens.lens (\BatchGetRumMetricDefinitionsResponse' {nextToken} -> nextToken) (\s@BatchGetRumMetricDefinitionsResponse' {} a -> s {nextToken = a} :: BatchGetRumMetricDefinitionsResponse)
+
+-- | The response's http status code.
+batchGetRumMetricDefinitionsResponse_httpStatus :: Lens.Lens' BatchGetRumMetricDefinitionsResponse Prelude.Int
+batchGetRumMetricDefinitionsResponse_httpStatus = Lens.lens (\BatchGetRumMetricDefinitionsResponse' {httpStatus} -> httpStatus) (\s@BatchGetRumMetricDefinitionsResponse' {} a -> s {httpStatus = a} :: BatchGetRumMetricDefinitionsResponse)
+
+instance
+  Prelude.NFData
+    BatchGetRumMetricDefinitionsResponse
+  where
+  rnf BatchGetRumMetricDefinitionsResponse' {..} =
+    Prelude.rnf metricDefinitions
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/CreateAppMonitor.hs b/gen/Amazonka/Rum/CreateAppMonitor.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/CreateAppMonitor.hs
@@ -0,0 +1,348 @@
+{-# 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.Rum.CreateAppMonitor
+-- 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 Amazon CloudWatch RUM app monitor, which collects telemetry
+-- data from your application and sends that data to RUM. The data includes
+-- performance and reliability information such as page load time,
+-- client-side errors, and user behavior.
+--
+-- You use this operation only to create a new app monitor. To update an
+-- existing app monitor, use
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_UpdateAppMonitor.html UpdateAppMonitor>
+-- instead.
+--
+-- After you create an app monitor, sign in to the CloudWatch RUM console
+-- to get the JavaScript code snippet to add to your web application. For
+-- more information, see
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-find-code-snippet.html How do I find a code snippet that I\'ve already generated?>
+module Amazonka.Rum.CreateAppMonitor
+  ( -- * Creating a Request
+    CreateAppMonitor (..),
+    newCreateAppMonitor,
+
+    -- * Request Lenses
+    createAppMonitor_appMonitorConfiguration,
+    createAppMonitor_customEvents,
+    createAppMonitor_cwLogEnabled,
+    createAppMonitor_tags,
+    createAppMonitor_domain,
+    createAppMonitor_name,
+
+    -- * Destructuring the Response
+    CreateAppMonitorResponse (..),
+    newCreateAppMonitorResponse,
+
+    -- * Response Lenses
+    createAppMonitorResponse_id,
+    createAppMonitorResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newCreateAppMonitor' smart constructor.
+data CreateAppMonitor = CreateAppMonitor'
+  { -- | A structure that contains much of the configuration data for the app
+    -- monitor. If you are using Amazon Cognito for authorization, you must
+    -- include this structure in your request, and it must include the ID of
+    -- the Amazon Cognito identity pool to use for authorization. If you don\'t
+    -- include @AppMonitorConfiguration@, you must set up your own
+    -- authorization method. For more information, see
+    -- <https://docs.aws.amazon.com/monitoring/CloudWatch-RUM-get-started-authorization.html Authorize your application to send data to Amazon Web Services>.
+    --
+    -- If you omit this argument, the sample rate used for RUM is set to 10% of
+    -- the user sessions.
+    appMonitorConfiguration :: Prelude.Maybe AppMonitorConfiguration,
+    -- | Specifies whether this app monitor allows the web client to define and
+    -- send custom events. If you omit this parameter, custom events are
+    -- @DISABLED@.
+    --
+    -- For more information about custom events, see
+    -- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-custom-events.html Send custom events>.
+    customEvents :: Prelude.Maybe CustomEvents,
+    -- | Data collected by RUM is kept by RUM for 30 days and then deleted. This
+    -- parameter specifies whether RUM sends a copy of this telemetry data to
+    -- Amazon CloudWatch Logs in your account. This enables you to keep the
+    -- telemetry data for more than 30 days, but it does incur Amazon
+    -- CloudWatch Logs charges.
+    --
+    -- If you omit this parameter, the default is @false@.
+    cwLogEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | Assigns one or more tags (key-value pairs) to the app monitor.
+    --
+    -- Tags can help you organize and categorize your resources. You can also
+    -- use them to scope user permissions by granting a user permission to
+    -- access or change only resources with certain tag values.
+    --
+    -- Tags don\'t have any semantic meaning to Amazon Web Services and are
+    -- interpreted strictly as strings of characters.
+    --
+    -- You can associate as many as 50 tags with an app monitor.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services resources>.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The top-level internet domain name for which your application has
+    -- administrative authority.
+    domain :: Prelude.Text,
+    -- | A name for the app monitor.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateAppMonitor' 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:
+--
+-- 'appMonitorConfiguration', 'createAppMonitor_appMonitorConfiguration' - A structure that contains much of the configuration data for the app
+-- monitor. If you are using Amazon Cognito for authorization, you must
+-- include this structure in your request, and it must include the ID of
+-- the Amazon Cognito identity pool to use for authorization. If you don\'t
+-- include @AppMonitorConfiguration@, you must set up your own
+-- authorization method. For more information, see
+-- <https://docs.aws.amazon.com/monitoring/CloudWatch-RUM-get-started-authorization.html Authorize your application to send data to Amazon Web Services>.
+--
+-- If you omit this argument, the sample rate used for RUM is set to 10% of
+-- the user sessions.
+--
+-- 'customEvents', 'createAppMonitor_customEvents' - Specifies whether this app monitor allows the web client to define and
+-- send custom events. If you omit this parameter, custom events are
+-- @DISABLED@.
+--
+-- For more information about custom events, see
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-custom-events.html Send custom events>.
+--
+-- 'cwLogEnabled', 'createAppMonitor_cwLogEnabled' - Data collected by RUM is kept by RUM for 30 days and then deleted. This
+-- parameter specifies whether RUM sends a copy of this telemetry data to
+-- Amazon CloudWatch Logs in your account. This enables you to keep the
+-- telemetry data for more than 30 days, but it does incur Amazon
+-- CloudWatch Logs charges.
+--
+-- If you omit this parameter, the default is @false@.
+--
+-- 'tags', 'createAppMonitor_tags' - Assigns one or more tags (key-value pairs) to the app monitor.
+--
+-- Tags can help you organize and categorize your resources. You can also
+-- use them to scope user permissions by granting a user permission to
+-- access or change only resources with certain tag values.
+--
+-- Tags don\'t have any semantic meaning to Amazon Web Services and are
+-- interpreted strictly as strings of characters.
+--
+-- You can associate as many as 50 tags with an app monitor.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services resources>.
+--
+-- 'domain', 'createAppMonitor_domain' - The top-level internet domain name for which your application has
+-- administrative authority.
+--
+-- 'name', 'createAppMonitor_name' - A name for the app monitor.
+newCreateAppMonitor ::
+  -- | 'domain'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  CreateAppMonitor
+newCreateAppMonitor pDomain_ pName_ =
+  CreateAppMonitor'
+    { appMonitorConfiguration =
+        Prelude.Nothing,
+      customEvents = Prelude.Nothing,
+      cwLogEnabled = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      domain = pDomain_,
+      name = pName_
+    }
+
+-- | A structure that contains much of the configuration data for the app
+-- monitor. If you are using Amazon Cognito for authorization, you must
+-- include this structure in your request, and it must include the ID of
+-- the Amazon Cognito identity pool to use for authorization. If you don\'t
+-- include @AppMonitorConfiguration@, you must set up your own
+-- authorization method. For more information, see
+-- <https://docs.aws.amazon.com/monitoring/CloudWatch-RUM-get-started-authorization.html Authorize your application to send data to Amazon Web Services>.
+--
+-- If you omit this argument, the sample rate used for RUM is set to 10% of
+-- the user sessions.
+createAppMonitor_appMonitorConfiguration :: Lens.Lens' CreateAppMonitor (Prelude.Maybe AppMonitorConfiguration)
+createAppMonitor_appMonitorConfiguration = Lens.lens (\CreateAppMonitor' {appMonitorConfiguration} -> appMonitorConfiguration) (\s@CreateAppMonitor' {} a -> s {appMonitorConfiguration = a} :: CreateAppMonitor)
+
+-- | Specifies whether this app monitor allows the web client to define and
+-- send custom events. If you omit this parameter, custom events are
+-- @DISABLED@.
+--
+-- For more information about custom events, see
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-custom-events.html Send custom events>.
+createAppMonitor_customEvents :: Lens.Lens' CreateAppMonitor (Prelude.Maybe CustomEvents)
+createAppMonitor_customEvents = Lens.lens (\CreateAppMonitor' {customEvents} -> customEvents) (\s@CreateAppMonitor' {} a -> s {customEvents = a} :: CreateAppMonitor)
+
+-- | Data collected by RUM is kept by RUM for 30 days and then deleted. This
+-- parameter specifies whether RUM sends a copy of this telemetry data to
+-- Amazon CloudWatch Logs in your account. This enables you to keep the
+-- telemetry data for more than 30 days, but it does incur Amazon
+-- CloudWatch Logs charges.
+--
+-- If you omit this parameter, the default is @false@.
+createAppMonitor_cwLogEnabled :: Lens.Lens' CreateAppMonitor (Prelude.Maybe Prelude.Bool)
+createAppMonitor_cwLogEnabled = Lens.lens (\CreateAppMonitor' {cwLogEnabled} -> cwLogEnabled) (\s@CreateAppMonitor' {} a -> s {cwLogEnabled = a} :: CreateAppMonitor)
+
+-- | Assigns one or more tags (key-value pairs) to the app monitor.
+--
+-- Tags can help you organize and categorize your resources. You can also
+-- use them to scope user permissions by granting a user permission to
+-- access or change only resources with certain tag values.
+--
+-- Tags don\'t have any semantic meaning to Amazon Web Services and are
+-- interpreted strictly as strings of characters.
+--
+-- You can associate as many as 50 tags with an app monitor.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services resources>.
+createAppMonitor_tags :: Lens.Lens' CreateAppMonitor (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+createAppMonitor_tags = Lens.lens (\CreateAppMonitor' {tags} -> tags) (\s@CreateAppMonitor' {} a -> s {tags = a} :: CreateAppMonitor) Prelude.. Lens.mapping Lens.coerced
+
+-- | The top-level internet domain name for which your application has
+-- administrative authority.
+createAppMonitor_domain :: Lens.Lens' CreateAppMonitor Prelude.Text
+createAppMonitor_domain = Lens.lens (\CreateAppMonitor' {domain} -> domain) (\s@CreateAppMonitor' {} a -> s {domain = a} :: CreateAppMonitor)
+
+-- | A name for the app monitor.
+createAppMonitor_name :: Lens.Lens' CreateAppMonitor Prelude.Text
+createAppMonitor_name = Lens.lens (\CreateAppMonitor' {name} -> name) (\s@CreateAppMonitor' {} a -> s {name = a} :: CreateAppMonitor)
+
+instance Core.AWSRequest CreateAppMonitor where
+  type
+    AWSResponse CreateAppMonitor =
+      CreateAppMonitorResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateAppMonitorResponse'
+            Prelude.<$> (x Data..?> "Id")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateAppMonitor where
+  hashWithSalt _salt CreateAppMonitor' {..} =
+    _salt
+      `Prelude.hashWithSalt` appMonitorConfiguration
+      `Prelude.hashWithSalt` customEvents
+      `Prelude.hashWithSalt` cwLogEnabled
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` domain
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData CreateAppMonitor where
+  rnf CreateAppMonitor' {..} =
+    Prelude.rnf appMonitorConfiguration
+      `Prelude.seq` Prelude.rnf customEvents
+      `Prelude.seq` Prelude.rnf cwLogEnabled
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToHeaders CreateAppMonitor where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateAppMonitor where
+  toJSON CreateAppMonitor' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AppMonitorConfiguration" Data..=)
+              Prelude.<$> appMonitorConfiguration,
+            ("CustomEvents" Data..=) Prelude.<$> customEvents,
+            ("CwLogEnabled" Data..=) Prelude.<$> cwLogEnabled,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("Domain" Data..= domain),
+            Prelude.Just ("Name" Data..= name)
+          ]
+      )
+
+instance Data.ToPath CreateAppMonitor where
+  toPath = Prelude.const "/appmonitor"
+
+instance Data.ToQuery CreateAppMonitor where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateAppMonitorResponse' smart constructor.
+data CreateAppMonitorResponse = CreateAppMonitorResponse'
+  { -- | The unique ID of the new app monitor.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateAppMonitorResponse' 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', 'createAppMonitorResponse_id' - The unique ID of the new app monitor.
+--
+-- 'httpStatus', 'createAppMonitorResponse_httpStatus' - The response's http status code.
+newCreateAppMonitorResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateAppMonitorResponse
+newCreateAppMonitorResponse pHttpStatus_ =
+  CreateAppMonitorResponse'
+    { id = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The unique ID of the new app monitor.
+createAppMonitorResponse_id :: Lens.Lens' CreateAppMonitorResponse (Prelude.Maybe Prelude.Text)
+createAppMonitorResponse_id = Lens.lens (\CreateAppMonitorResponse' {id} -> id) (\s@CreateAppMonitorResponse' {} a -> s {id = a} :: CreateAppMonitorResponse)
+
+-- | The response's http status code.
+createAppMonitorResponse_httpStatus :: Lens.Lens' CreateAppMonitorResponse Prelude.Int
+createAppMonitorResponse_httpStatus = Lens.lens (\CreateAppMonitorResponse' {httpStatus} -> httpStatus) (\s@CreateAppMonitorResponse' {} a -> s {httpStatus = a} :: CreateAppMonitorResponse)
+
+instance Prelude.NFData CreateAppMonitorResponse where
+  rnf CreateAppMonitorResponse' {..} =
+    Prelude.rnf id `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/DeleteAppMonitor.hs b/gen/Amazonka/Rum/DeleteAppMonitor.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/DeleteAppMonitor.hs
@@ -0,0 +1,147 @@
+{-# 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.Rum.DeleteAppMonitor
+-- 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 an existing app monitor. This immediately stops the collection
+-- of data.
+module Amazonka.Rum.DeleteAppMonitor
+  ( -- * Creating a Request
+    DeleteAppMonitor (..),
+    newDeleteAppMonitor,
+
+    -- * Request Lenses
+    deleteAppMonitor_name,
+
+    -- * Destructuring the Response
+    DeleteAppMonitorResponse (..),
+    newDeleteAppMonitorResponse,
+
+    -- * Response Lenses
+    deleteAppMonitorResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newDeleteAppMonitor' smart constructor.
+data DeleteAppMonitor = DeleteAppMonitor'
+  { -- | The name of the app monitor to delete.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteAppMonitor' 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:
+--
+-- 'name', 'deleteAppMonitor_name' - The name of the app monitor to delete.
+newDeleteAppMonitor ::
+  -- | 'name'
+  Prelude.Text ->
+  DeleteAppMonitor
+newDeleteAppMonitor pName_ =
+  DeleteAppMonitor' {name = pName_}
+
+-- | The name of the app monitor to delete.
+deleteAppMonitor_name :: Lens.Lens' DeleteAppMonitor Prelude.Text
+deleteAppMonitor_name = Lens.lens (\DeleteAppMonitor' {name} -> name) (\s@DeleteAppMonitor' {} a -> s {name = a} :: DeleteAppMonitor)
+
+instance Core.AWSRequest DeleteAppMonitor where
+  type
+    AWSResponse DeleteAppMonitor =
+      DeleteAppMonitorResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteAppMonitorResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteAppMonitor where
+  hashWithSalt _salt DeleteAppMonitor' {..} =
+    _salt `Prelude.hashWithSalt` name
+
+instance Prelude.NFData DeleteAppMonitor where
+  rnf DeleteAppMonitor' {..} = Prelude.rnf name
+
+instance Data.ToHeaders DeleteAppMonitor where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteAppMonitor where
+  toPath DeleteAppMonitor' {..} =
+    Prelude.mconcat ["/appmonitor/", Data.toBS name]
+
+instance Data.ToQuery DeleteAppMonitor where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteAppMonitorResponse' smart constructor.
+data DeleteAppMonitorResponse = DeleteAppMonitorResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteAppMonitorResponse' 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', 'deleteAppMonitorResponse_httpStatus' - The response's http status code.
+newDeleteAppMonitorResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteAppMonitorResponse
+newDeleteAppMonitorResponse pHttpStatus_ =
+  DeleteAppMonitorResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteAppMonitorResponse_httpStatus :: Lens.Lens' DeleteAppMonitorResponse Prelude.Int
+deleteAppMonitorResponse_httpStatus = Lens.lens (\DeleteAppMonitorResponse' {httpStatus} -> httpStatus) (\s@DeleteAppMonitorResponse' {} a -> s {httpStatus = a} :: DeleteAppMonitorResponse)
+
+instance Prelude.NFData DeleteAppMonitorResponse where
+  rnf DeleteAppMonitorResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/DeleteRumMetricsDestination.hs b/gen/Amazonka/Rum/DeleteRumMetricsDestination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/DeleteRumMetricsDestination.hs
@@ -0,0 +1,207 @@
+{-# 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.Rum.DeleteRumMetricsDestination
+-- 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 destination for CloudWatch RUM extended metrics, so that the
+-- specified app monitor stops sending extended metrics to that
+-- destination.
+module Amazonka.Rum.DeleteRumMetricsDestination
+  ( -- * Creating a Request
+    DeleteRumMetricsDestination (..),
+    newDeleteRumMetricsDestination,
+
+    -- * Request Lenses
+    deleteRumMetricsDestination_destinationArn,
+    deleteRumMetricsDestination_appMonitorName,
+    deleteRumMetricsDestination_destination,
+
+    -- * Destructuring the Response
+    DeleteRumMetricsDestinationResponse (..),
+    newDeleteRumMetricsDestinationResponse,
+
+    -- * Response Lenses
+    deleteRumMetricsDestinationResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newDeleteRumMetricsDestination' smart constructor.
+data DeleteRumMetricsDestination = DeleteRumMetricsDestination'
+  { -- | This parameter is required if @Destination@ is @Evidently@. If
+    -- @Destination@ is @CloudWatch@, do not use this parameter. This parameter
+    -- specifies the ARN of the Evidently experiment that corresponds to the
+    -- destination to delete.
+    destinationArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the app monitor that is sending metrics to the destination
+    -- that you want to delete.
+    appMonitorName :: Prelude.Text,
+    -- | The type of destination to delete. Valid values are @CloudWatch@ and
+    -- @Evidently@.
+    destination :: MetricDestination
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRumMetricsDestination' 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:
+--
+-- 'destinationArn', 'deleteRumMetricsDestination_destinationArn' - This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter. This parameter
+-- specifies the ARN of the Evidently experiment that corresponds to the
+-- destination to delete.
+--
+-- 'appMonitorName', 'deleteRumMetricsDestination_appMonitorName' - The name of the app monitor that is sending metrics to the destination
+-- that you want to delete.
+--
+-- 'destination', 'deleteRumMetricsDestination_destination' - The type of destination to delete. Valid values are @CloudWatch@ and
+-- @Evidently@.
+newDeleteRumMetricsDestination ::
+  -- | 'appMonitorName'
+  Prelude.Text ->
+  -- | 'destination'
+  MetricDestination ->
+  DeleteRumMetricsDestination
+newDeleteRumMetricsDestination
+  pAppMonitorName_
+  pDestination_ =
+    DeleteRumMetricsDestination'
+      { destinationArn =
+          Prelude.Nothing,
+        appMonitorName = pAppMonitorName_,
+        destination = pDestination_
+      }
+
+-- | This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter. This parameter
+-- specifies the ARN of the Evidently experiment that corresponds to the
+-- destination to delete.
+deleteRumMetricsDestination_destinationArn :: Lens.Lens' DeleteRumMetricsDestination (Prelude.Maybe Prelude.Text)
+deleteRumMetricsDestination_destinationArn = Lens.lens (\DeleteRumMetricsDestination' {destinationArn} -> destinationArn) (\s@DeleteRumMetricsDestination' {} a -> s {destinationArn = a} :: DeleteRumMetricsDestination)
+
+-- | The name of the app monitor that is sending metrics to the destination
+-- that you want to delete.
+deleteRumMetricsDestination_appMonitorName :: Lens.Lens' DeleteRumMetricsDestination Prelude.Text
+deleteRumMetricsDestination_appMonitorName = Lens.lens (\DeleteRumMetricsDestination' {appMonitorName} -> appMonitorName) (\s@DeleteRumMetricsDestination' {} a -> s {appMonitorName = a} :: DeleteRumMetricsDestination)
+
+-- | The type of destination to delete. Valid values are @CloudWatch@ and
+-- @Evidently@.
+deleteRumMetricsDestination_destination :: Lens.Lens' DeleteRumMetricsDestination MetricDestination
+deleteRumMetricsDestination_destination = Lens.lens (\DeleteRumMetricsDestination' {destination} -> destination) (\s@DeleteRumMetricsDestination' {} a -> s {destination = a} :: DeleteRumMetricsDestination)
+
+instance Core.AWSRequest DeleteRumMetricsDestination where
+  type
+    AWSResponse DeleteRumMetricsDestination =
+      DeleteRumMetricsDestinationResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteRumMetricsDestinationResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteRumMetricsDestination where
+  hashWithSalt _salt DeleteRumMetricsDestination' {..} =
+    _salt
+      `Prelude.hashWithSalt` destinationArn
+      `Prelude.hashWithSalt` appMonitorName
+      `Prelude.hashWithSalt` destination
+
+instance Prelude.NFData DeleteRumMetricsDestination where
+  rnf DeleteRumMetricsDestination' {..} =
+    Prelude.rnf destinationArn
+      `Prelude.seq` Prelude.rnf appMonitorName
+      `Prelude.seq` Prelude.rnf destination
+
+instance Data.ToHeaders DeleteRumMetricsDestination where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DeleteRumMetricsDestination where
+  toPath DeleteRumMetricsDestination' {..} =
+    Prelude.mconcat
+      [ "/rummetrics/",
+        Data.toBS appMonitorName,
+        "/metricsdestination"
+      ]
+
+instance Data.ToQuery DeleteRumMetricsDestination where
+  toQuery DeleteRumMetricsDestination' {..} =
+    Prelude.mconcat
+      [ "destinationArn" Data.=: destinationArn,
+        "destination" Data.=: destination
+      ]
+
+-- | /See:/ 'newDeleteRumMetricsDestinationResponse' smart constructor.
+data DeleteRumMetricsDestinationResponse = DeleteRumMetricsDestinationResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRumMetricsDestinationResponse' 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', 'deleteRumMetricsDestinationResponse_httpStatus' - The response's http status code.
+newDeleteRumMetricsDestinationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteRumMetricsDestinationResponse
+newDeleteRumMetricsDestinationResponse pHttpStatus_ =
+  DeleteRumMetricsDestinationResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteRumMetricsDestinationResponse_httpStatus :: Lens.Lens' DeleteRumMetricsDestinationResponse Prelude.Int
+deleteRumMetricsDestinationResponse_httpStatus = Lens.lens (\DeleteRumMetricsDestinationResponse' {httpStatus} -> httpStatus) (\s@DeleteRumMetricsDestinationResponse' {} a -> s {httpStatus = a} :: DeleteRumMetricsDestinationResponse)
+
+instance
+  Prelude.NFData
+    DeleteRumMetricsDestinationResponse
+  where
+  rnf DeleteRumMetricsDestinationResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/GetAppMonitor.hs b/gen/Amazonka/Rum/GetAppMonitor.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/GetAppMonitor.hs
@@ -0,0 +1,161 @@
+{-# 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.Rum.GetAppMonitor
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the complete configuration information for one app monitor.
+module Amazonka.Rum.GetAppMonitor
+  ( -- * Creating a Request
+    GetAppMonitor (..),
+    newGetAppMonitor,
+
+    -- * Request Lenses
+    getAppMonitor_name,
+
+    -- * Destructuring the Response
+    GetAppMonitorResponse (..),
+    newGetAppMonitorResponse,
+
+    -- * Response Lenses
+    getAppMonitorResponse_appMonitor,
+    getAppMonitorResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newGetAppMonitor' smart constructor.
+data GetAppMonitor = GetAppMonitor'
+  { -- | The app monitor to retrieve information for.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAppMonitor' 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:
+--
+-- 'name', 'getAppMonitor_name' - The app monitor to retrieve information for.
+newGetAppMonitor ::
+  -- | 'name'
+  Prelude.Text ->
+  GetAppMonitor
+newGetAppMonitor pName_ =
+  GetAppMonitor' {name = pName_}
+
+-- | The app monitor to retrieve information for.
+getAppMonitor_name :: Lens.Lens' GetAppMonitor Prelude.Text
+getAppMonitor_name = Lens.lens (\GetAppMonitor' {name} -> name) (\s@GetAppMonitor' {} a -> s {name = a} :: GetAppMonitor)
+
+instance Core.AWSRequest GetAppMonitor where
+  type
+    AWSResponse GetAppMonitor =
+      GetAppMonitorResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetAppMonitorResponse'
+            Prelude.<$> (x Data..?> "AppMonitor")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetAppMonitor where
+  hashWithSalt _salt GetAppMonitor' {..} =
+    _salt `Prelude.hashWithSalt` name
+
+instance Prelude.NFData GetAppMonitor where
+  rnf GetAppMonitor' {..} = Prelude.rnf name
+
+instance Data.ToHeaders GetAppMonitor where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath GetAppMonitor where
+  toPath GetAppMonitor' {..} =
+    Prelude.mconcat ["/appmonitor/", Data.toBS name]
+
+instance Data.ToQuery GetAppMonitor where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetAppMonitorResponse' smart constructor.
+data GetAppMonitorResponse = GetAppMonitorResponse'
+  { -- | A structure containing all the configuration information for the app
+    -- monitor.
+    appMonitor :: Prelude.Maybe AppMonitor,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAppMonitorResponse' 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:
+--
+-- 'appMonitor', 'getAppMonitorResponse_appMonitor' - A structure containing all the configuration information for the app
+-- monitor.
+--
+-- 'httpStatus', 'getAppMonitorResponse_httpStatus' - The response's http status code.
+newGetAppMonitorResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetAppMonitorResponse
+newGetAppMonitorResponse pHttpStatus_ =
+  GetAppMonitorResponse'
+    { appMonitor =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A structure containing all the configuration information for the app
+-- monitor.
+getAppMonitorResponse_appMonitor :: Lens.Lens' GetAppMonitorResponse (Prelude.Maybe AppMonitor)
+getAppMonitorResponse_appMonitor = Lens.lens (\GetAppMonitorResponse' {appMonitor} -> appMonitor) (\s@GetAppMonitorResponse' {} a -> s {appMonitor = a} :: GetAppMonitorResponse)
+
+-- | The response's http status code.
+getAppMonitorResponse_httpStatus :: Lens.Lens' GetAppMonitorResponse Prelude.Int
+getAppMonitorResponse_httpStatus = Lens.lens (\GetAppMonitorResponse' {httpStatus} -> httpStatus) (\s@GetAppMonitorResponse' {} a -> s {httpStatus = a} :: GetAppMonitorResponse)
+
+instance Prelude.NFData GetAppMonitorResponse where
+  rnf GetAppMonitorResponse' {..} =
+    Prelude.rnf appMonitor
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/GetAppMonitorData.hs b/gen/Amazonka/Rum/GetAppMonitorData.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/GetAppMonitorData.hs
@@ -0,0 +1,277 @@
+{-# 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.Rum.GetAppMonitorData
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Retrieves the raw performance events that RUM has collected from your
+-- web application, so that you can do your own processing or analysis of
+-- this data.
+--
+-- This operation returns paginated results.
+module Amazonka.Rum.GetAppMonitorData
+  ( -- * Creating a Request
+    GetAppMonitorData (..),
+    newGetAppMonitorData,
+
+    -- * Request Lenses
+    getAppMonitorData_filters,
+    getAppMonitorData_maxResults,
+    getAppMonitorData_nextToken,
+    getAppMonitorData_name,
+    getAppMonitorData_timeRange,
+
+    -- * Destructuring the Response
+    GetAppMonitorDataResponse (..),
+    newGetAppMonitorDataResponse,
+
+    -- * Response Lenses
+    getAppMonitorDataResponse_events,
+    getAppMonitorDataResponse_nextToken,
+    getAppMonitorDataResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newGetAppMonitorData' smart constructor.
+data GetAppMonitorData = GetAppMonitorData'
+  { -- | An array of structures that you can use to filter the results to those
+    -- that match one or more sets of key-value pairs that you specify.
+    filters :: Prelude.Maybe [QueryFilter],
+    -- | The maximum number of results to return in one operation.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Use the token returned by the previous operation to request the next
+    -- page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the app monitor that collected the data that you want to
+    -- retrieve.
+    name :: Prelude.Text,
+    -- | A structure that defines the time range that you want to retrieve
+    -- results from.
+    timeRange :: TimeRange
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAppMonitorData' 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:
+--
+-- 'filters', 'getAppMonitorData_filters' - An array of structures that you can use to filter the results to those
+-- that match one or more sets of key-value pairs that you specify.
+--
+-- 'maxResults', 'getAppMonitorData_maxResults' - The maximum number of results to return in one operation.
+--
+-- 'nextToken', 'getAppMonitorData_nextToken' - Use the token returned by the previous operation to request the next
+-- page of results.
+--
+-- 'name', 'getAppMonitorData_name' - The name of the app monitor that collected the data that you want to
+-- retrieve.
+--
+-- 'timeRange', 'getAppMonitorData_timeRange' - A structure that defines the time range that you want to retrieve
+-- results from.
+newGetAppMonitorData ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'timeRange'
+  TimeRange ->
+  GetAppMonitorData
+newGetAppMonitorData pName_ pTimeRange_ =
+  GetAppMonitorData'
+    { filters = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      name = pName_,
+      timeRange = pTimeRange_
+    }
+
+-- | An array of structures that you can use to filter the results to those
+-- that match one or more sets of key-value pairs that you specify.
+getAppMonitorData_filters :: Lens.Lens' GetAppMonitorData (Prelude.Maybe [QueryFilter])
+getAppMonitorData_filters = Lens.lens (\GetAppMonitorData' {filters} -> filters) (\s@GetAppMonitorData' {} a -> s {filters = a} :: GetAppMonitorData) Prelude.. Lens.mapping Lens.coerced
+
+-- | The maximum number of results to return in one operation.
+getAppMonitorData_maxResults :: Lens.Lens' GetAppMonitorData (Prelude.Maybe Prelude.Natural)
+getAppMonitorData_maxResults = Lens.lens (\GetAppMonitorData' {maxResults} -> maxResults) (\s@GetAppMonitorData' {} a -> s {maxResults = a} :: GetAppMonitorData)
+
+-- | Use the token returned by the previous operation to request the next
+-- page of results.
+getAppMonitorData_nextToken :: Lens.Lens' GetAppMonitorData (Prelude.Maybe Prelude.Text)
+getAppMonitorData_nextToken = Lens.lens (\GetAppMonitorData' {nextToken} -> nextToken) (\s@GetAppMonitorData' {} a -> s {nextToken = a} :: GetAppMonitorData)
+
+-- | The name of the app monitor that collected the data that you want to
+-- retrieve.
+getAppMonitorData_name :: Lens.Lens' GetAppMonitorData Prelude.Text
+getAppMonitorData_name = Lens.lens (\GetAppMonitorData' {name} -> name) (\s@GetAppMonitorData' {} a -> s {name = a} :: GetAppMonitorData)
+
+-- | A structure that defines the time range that you want to retrieve
+-- results from.
+getAppMonitorData_timeRange :: Lens.Lens' GetAppMonitorData TimeRange
+getAppMonitorData_timeRange = Lens.lens (\GetAppMonitorData' {timeRange} -> timeRange) (\s@GetAppMonitorData' {} a -> s {timeRange = a} :: GetAppMonitorData)
+
+instance Core.AWSPager GetAppMonitorData where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? getAppMonitorDataResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? getAppMonitorDataResponse_events
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& getAppMonitorData_nextToken
+          Lens..~ rs
+          Lens.^? getAppMonitorDataResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest GetAppMonitorData where
+  type
+    AWSResponse GetAppMonitorData =
+      GetAppMonitorDataResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetAppMonitorDataResponse'
+            Prelude.<$> (x Data..?> "Events" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetAppMonitorData where
+  hashWithSalt _salt GetAppMonitorData' {..} =
+    _salt
+      `Prelude.hashWithSalt` filters
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` timeRange
+
+instance Prelude.NFData GetAppMonitorData where
+  rnf GetAppMonitorData' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf timeRange
+
+instance Data.ToHeaders GetAppMonitorData where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetAppMonitorData where
+  toJSON GetAppMonitorData' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Filters" Data..=) Prelude.<$> filters,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("TimeRange" Data..= timeRange)
+          ]
+      )
+
+instance Data.ToPath GetAppMonitorData where
+  toPath GetAppMonitorData' {..} =
+    Prelude.mconcat
+      ["/appmonitor/", Data.toBS name, "/data"]
+
+instance Data.ToQuery GetAppMonitorData where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetAppMonitorDataResponse' smart constructor.
+data GetAppMonitorDataResponse = GetAppMonitorDataResponse'
+  { -- | The events that RUM collected that match your request.
+    events :: Prelude.Maybe [Prelude.Text],
+    -- | A token that you can use in a subsequent operation to retrieve the next
+    -- set of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetAppMonitorDataResponse' 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:
+--
+-- 'events', 'getAppMonitorDataResponse_events' - The events that RUM collected that match your request.
+--
+-- 'nextToken', 'getAppMonitorDataResponse_nextToken' - A token that you can use in a subsequent operation to retrieve the next
+-- set of results.
+--
+-- 'httpStatus', 'getAppMonitorDataResponse_httpStatus' - The response's http status code.
+newGetAppMonitorDataResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetAppMonitorDataResponse
+newGetAppMonitorDataResponse pHttpStatus_ =
+  GetAppMonitorDataResponse'
+    { events =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The events that RUM collected that match your request.
+getAppMonitorDataResponse_events :: Lens.Lens' GetAppMonitorDataResponse (Prelude.Maybe [Prelude.Text])
+getAppMonitorDataResponse_events = Lens.lens (\GetAppMonitorDataResponse' {events} -> events) (\s@GetAppMonitorDataResponse' {} a -> s {events = a} :: GetAppMonitorDataResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token that you can use in a subsequent operation to retrieve the next
+-- set of results.
+getAppMonitorDataResponse_nextToken :: Lens.Lens' GetAppMonitorDataResponse (Prelude.Maybe Prelude.Text)
+getAppMonitorDataResponse_nextToken = Lens.lens (\GetAppMonitorDataResponse' {nextToken} -> nextToken) (\s@GetAppMonitorDataResponse' {} a -> s {nextToken = a} :: GetAppMonitorDataResponse)
+
+-- | The response's http status code.
+getAppMonitorDataResponse_httpStatus :: Lens.Lens' GetAppMonitorDataResponse Prelude.Int
+getAppMonitorDataResponse_httpStatus = Lens.lens (\GetAppMonitorDataResponse' {httpStatus} -> httpStatus) (\s@GetAppMonitorDataResponse' {} a -> s {httpStatus = a} :: GetAppMonitorDataResponse)
+
+instance Prelude.NFData GetAppMonitorDataResponse where
+  rnf GetAppMonitorDataResponse' {..} =
+    Prelude.rnf events
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/Lens.hs b/gen/Amazonka/Rum/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Lens.hs
@@ -0,0 +1,272 @@
+{-# 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.Rum.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.Rum.Lens
+  ( -- * Operations
+
+    -- ** BatchCreateRumMetricDefinitions
+    batchCreateRumMetricDefinitions_destinationArn,
+    batchCreateRumMetricDefinitions_appMonitorName,
+    batchCreateRumMetricDefinitions_destination,
+    batchCreateRumMetricDefinitions_metricDefinitions,
+    batchCreateRumMetricDefinitionsResponse_metricDefinitions,
+    batchCreateRumMetricDefinitionsResponse_httpStatus,
+    batchCreateRumMetricDefinitionsResponse_errors,
+
+    -- ** BatchDeleteRumMetricDefinitions
+    batchDeleteRumMetricDefinitions_destinationArn,
+    batchDeleteRumMetricDefinitions_appMonitorName,
+    batchDeleteRumMetricDefinitions_destination,
+    batchDeleteRumMetricDefinitions_metricDefinitionIds,
+    batchDeleteRumMetricDefinitionsResponse_metricDefinitionIds,
+    batchDeleteRumMetricDefinitionsResponse_httpStatus,
+    batchDeleteRumMetricDefinitionsResponse_errors,
+
+    -- ** BatchGetRumMetricDefinitions
+    batchGetRumMetricDefinitions_destinationArn,
+    batchGetRumMetricDefinitions_maxResults,
+    batchGetRumMetricDefinitions_nextToken,
+    batchGetRumMetricDefinitions_appMonitorName,
+    batchGetRumMetricDefinitions_destination,
+    batchGetRumMetricDefinitionsResponse_metricDefinitions,
+    batchGetRumMetricDefinitionsResponse_nextToken,
+    batchGetRumMetricDefinitionsResponse_httpStatus,
+
+    -- ** CreateAppMonitor
+    createAppMonitor_appMonitorConfiguration,
+    createAppMonitor_customEvents,
+    createAppMonitor_cwLogEnabled,
+    createAppMonitor_tags,
+    createAppMonitor_domain,
+    createAppMonitor_name,
+    createAppMonitorResponse_id,
+    createAppMonitorResponse_httpStatus,
+
+    -- ** DeleteAppMonitor
+    deleteAppMonitor_name,
+    deleteAppMonitorResponse_httpStatus,
+
+    -- ** DeleteRumMetricsDestination
+    deleteRumMetricsDestination_destinationArn,
+    deleteRumMetricsDestination_appMonitorName,
+    deleteRumMetricsDestination_destination,
+    deleteRumMetricsDestinationResponse_httpStatus,
+
+    -- ** GetAppMonitor
+    getAppMonitor_name,
+    getAppMonitorResponse_appMonitor,
+    getAppMonitorResponse_httpStatus,
+
+    -- ** GetAppMonitorData
+    getAppMonitorData_filters,
+    getAppMonitorData_maxResults,
+    getAppMonitorData_nextToken,
+    getAppMonitorData_name,
+    getAppMonitorData_timeRange,
+    getAppMonitorDataResponse_events,
+    getAppMonitorDataResponse_nextToken,
+    getAppMonitorDataResponse_httpStatus,
+
+    -- ** ListAppMonitors
+    listAppMonitors_maxResults,
+    listAppMonitors_nextToken,
+    listAppMonitorsResponse_appMonitorSummaries,
+    listAppMonitorsResponse_nextToken,
+    listAppMonitorsResponse_httpStatus,
+
+    -- ** ListRumMetricsDestinations
+    listRumMetricsDestinations_maxResults,
+    listRumMetricsDestinations_nextToken,
+    listRumMetricsDestinations_appMonitorName,
+    listRumMetricsDestinationsResponse_destinations,
+    listRumMetricsDestinationsResponse_nextToken,
+    listRumMetricsDestinationsResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_httpStatus,
+    listTagsForResourceResponse_resourceArn,
+    listTagsForResourceResponse_tags,
+
+    -- ** PutRumEvents
+    putRumEvents_appMonitorDetails,
+    putRumEvents_batchId,
+    putRumEvents_id,
+    putRumEvents_rumEvents,
+    putRumEvents_userDetails,
+    putRumEventsResponse_httpStatus,
+
+    -- ** PutRumMetricsDestination
+    putRumMetricsDestination_destinationArn,
+    putRumMetricsDestination_iamRoleArn,
+    putRumMetricsDestination_appMonitorName,
+    putRumMetricsDestination_destination,
+    putRumMetricsDestinationResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateAppMonitor
+    updateAppMonitor_appMonitorConfiguration,
+    updateAppMonitor_customEvents,
+    updateAppMonitor_cwLogEnabled,
+    updateAppMonitor_domain,
+    updateAppMonitor_name,
+    updateAppMonitorResponse_httpStatus,
+
+    -- ** UpdateRumMetricDefinition
+    updateRumMetricDefinition_destinationArn,
+    updateRumMetricDefinition_appMonitorName,
+    updateRumMetricDefinition_destination,
+    updateRumMetricDefinition_metricDefinition,
+    updateRumMetricDefinition_metricDefinitionId,
+    updateRumMetricDefinitionResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AppMonitor
+    appMonitor_appMonitorConfiguration,
+    appMonitor_created,
+    appMonitor_customEvents,
+    appMonitor_dataStorage,
+    appMonitor_domain,
+    appMonitor_id,
+    appMonitor_lastModified,
+    appMonitor_name,
+    appMonitor_state,
+    appMonitor_tags,
+
+    -- ** AppMonitorConfiguration
+    appMonitorConfiguration_allowCookies,
+    appMonitorConfiguration_enableXRay,
+    appMonitorConfiguration_excludedPages,
+    appMonitorConfiguration_favoritePages,
+    appMonitorConfiguration_guestRoleArn,
+    appMonitorConfiguration_identityPoolId,
+    appMonitorConfiguration_includedPages,
+    appMonitorConfiguration_sessionSampleRate,
+    appMonitorConfiguration_telemetries,
+
+    -- ** AppMonitorDetails
+    appMonitorDetails_id,
+    appMonitorDetails_name,
+    appMonitorDetails_version,
+
+    -- ** AppMonitorSummary
+    appMonitorSummary_created,
+    appMonitorSummary_id,
+    appMonitorSummary_lastModified,
+    appMonitorSummary_name,
+    appMonitorSummary_state,
+
+    -- ** BatchCreateRumMetricDefinitionsError
+    batchCreateRumMetricDefinitionsError_errorCode,
+    batchCreateRumMetricDefinitionsError_errorMessage,
+    batchCreateRumMetricDefinitionsError_metricDefinition,
+
+    -- ** BatchDeleteRumMetricDefinitionsError
+    batchDeleteRumMetricDefinitionsError_errorCode,
+    batchDeleteRumMetricDefinitionsError_errorMessage,
+    batchDeleteRumMetricDefinitionsError_metricDefinitionId,
+
+    -- ** CustomEvents
+    customEvents_status,
+
+    -- ** CwLog
+    cwLog_cwLogEnabled,
+    cwLog_cwLogGroup,
+
+    -- ** DataStorage
+    dataStorage_cwLog,
+
+    -- ** MetricDefinition
+    metricDefinition_dimensionKeys,
+    metricDefinition_eventPattern,
+    metricDefinition_unitLabel,
+    metricDefinition_valueKey,
+    metricDefinition_metricDefinitionId,
+    metricDefinition_name,
+
+    -- ** MetricDefinitionRequest
+    metricDefinitionRequest_dimensionKeys,
+    metricDefinitionRequest_eventPattern,
+    metricDefinitionRequest_unitLabel,
+    metricDefinitionRequest_valueKey,
+    metricDefinitionRequest_name,
+
+    -- ** MetricDestinationSummary
+    metricDestinationSummary_destination,
+    metricDestinationSummary_destinationArn,
+    metricDestinationSummary_iamRoleArn,
+
+    -- ** QueryFilter
+    queryFilter_name,
+    queryFilter_values,
+
+    -- ** RumEvent
+    rumEvent_metadata,
+    rumEvent_details,
+    rumEvent_id,
+    rumEvent_timestamp,
+    rumEvent_type,
+
+    -- ** TimeRange
+    timeRange_before,
+    timeRange_after,
+
+    -- ** UserDetails
+    userDetails_sessionId,
+    userDetails_userId,
+  )
+where
+
+import Amazonka.Rum.BatchCreateRumMetricDefinitions
+import Amazonka.Rum.BatchDeleteRumMetricDefinitions
+import Amazonka.Rum.BatchGetRumMetricDefinitions
+import Amazonka.Rum.CreateAppMonitor
+import Amazonka.Rum.DeleteAppMonitor
+import Amazonka.Rum.DeleteRumMetricsDestination
+import Amazonka.Rum.GetAppMonitor
+import Amazonka.Rum.GetAppMonitorData
+import Amazonka.Rum.ListAppMonitors
+import Amazonka.Rum.ListRumMetricsDestinations
+import Amazonka.Rum.ListTagsForResource
+import Amazonka.Rum.PutRumEvents
+import Amazonka.Rum.PutRumMetricsDestination
+import Amazonka.Rum.TagResource
+import Amazonka.Rum.Types.AppMonitor
+import Amazonka.Rum.Types.AppMonitorConfiguration
+import Amazonka.Rum.Types.AppMonitorDetails
+import Amazonka.Rum.Types.AppMonitorSummary
+import Amazonka.Rum.Types.BatchCreateRumMetricDefinitionsError
+import Amazonka.Rum.Types.BatchDeleteRumMetricDefinitionsError
+import Amazonka.Rum.Types.CustomEvents
+import Amazonka.Rum.Types.CwLog
+import Amazonka.Rum.Types.DataStorage
+import Amazonka.Rum.Types.MetricDefinition
+import Amazonka.Rum.Types.MetricDefinitionRequest
+import Amazonka.Rum.Types.MetricDestinationSummary
+import Amazonka.Rum.Types.QueryFilter
+import Amazonka.Rum.Types.RumEvent
+import Amazonka.Rum.Types.TimeRange
+import Amazonka.Rum.Types.UserDetails
+import Amazonka.Rum.UntagResource
+import Amazonka.Rum.UpdateAppMonitor
+import Amazonka.Rum.UpdateRumMetricDefinition
diff --git a/gen/Amazonka/Rum/ListAppMonitors.hs b/gen/Amazonka/Rum/ListAppMonitors.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/ListAppMonitors.hs
@@ -0,0 +1,229 @@
+{-# 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.Rum.ListAppMonitors
+-- 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 Amazon CloudWatch RUM app monitors in the account.
+--
+-- This operation returns paginated results.
+module Amazonka.Rum.ListAppMonitors
+  ( -- * Creating a Request
+    ListAppMonitors (..),
+    newListAppMonitors,
+
+    -- * Request Lenses
+    listAppMonitors_maxResults,
+    listAppMonitors_nextToken,
+
+    -- * Destructuring the Response
+    ListAppMonitorsResponse (..),
+    newListAppMonitorsResponse,
+
+    -- * Response Lenses
+    listAppMonitorsResponse_appMonitorSummaries,
+    listAppMonitorsResponse_nextToken,
+    listAppMonitorsResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newListAppMonitors' smart constructor.
+data ListAppMonitors = ListAppMonitors'
+  { -- | The maximum number of results to return in one operation. The default is
+    -- 50. The maximum that you can specify is 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Use the token returned by the previous operation to request the next
+    -- page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAppMonitors' 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', 'listAppMonitors_maxResults' - The maximum number of results to return in one operation. The default is
+-- 50. The maximum that you can specify is 100.
+--
+-- 'nextToken', 'listAppMonitors_nextToken' - Use the token returned by the previous operation to request the next
+-- page of results.
+newListAppMonitors ::
+  ListAppMonitors
+newListAppMonitors =
+  ListAppMonitors'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return in one operation. The default is
+-- 50. The maximum that you can specify is 100.
+listAppMonitors_maxResults :: Lens.Lens' ListAppMonitors (Prelude.Maybe Prelude.Natural)
+listAppMonitors_maxResults = Lens.lens (\ListAppMonitors' {maxResults} -> maxResults) (\s@ListAppMonitors' {} a -> s {maxResults = a} :: ListAppMonitors)
+
+-- | Use the token returned by the previous operation to request the next
+-- page of results.
+listAppMonitors_nextToken :: Lens.Lens' ListAppMonitors (Prelude.Maybe Prelude.Text)
+listAppMonitors_nextToken = Lens.lens (\ListAppMonitors' {nextToken} -> nextToken) (\s@ListAppMonitors' {} a -> s {nextToken = a} :: ListAppMonitors)
+
+instance Core.AWSPager ListAppMonitors where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listAppMonitorsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listAppMonitorsResponse_appMonitorSummaries
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listAppMonitors_nextToken
+          Lens..~ rs
+          Lens.^? listAppMonitorsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListAppMonitors where
+  type
+    AWSResponse ListAppMonitors =
+      ListAppMonitorsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListAppMonitorsResponse'
+            Prelude.<$> ( x
+                            Data..?> "AppMonitorSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListAppMonitors where
+  hashWithSalt _salt ListAppMonitors' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListAppMonitors where
+  rnf ListAppMonitors' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListAppMonitors where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListAppMonitors where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath ListAppMonitors where
+  toPath = Prelude.const "/appmonitors"
+
+instance Data.ToQuery ListAppMonitors where
+  toQuery ListAppMonitors' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListAppMonitorsResponse' smart constructor.
+data ListAppMonitorsResponse = ListAppMonitorsResponse'
+  { -- | An array of structures that contain information about the returned app
+    -- monitors.
+    appMonitorSummaries :: Prelude.Maybe [AppMonitorSummary],
+    -- | A token that you can use in a subsequent operation to retrieve the next
+    -- set of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListAppMonitorsResponse' 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:
+--
+-- 'appMonitorSummaries', 'listAppMonitorsResponse_appMonitorSummaries' - An array of structures that contain information about the returned app
+-- monitors.
+--
+-- 'nextToken', 'listAppMonitorsResponse_nextToken' - A token that you can use in a subsequent operation to retrieve the next
+-- set of results.
+--
+-- 'httpStatus', 'listAppMonitorsResponse_httpStatus' - The response's http status code.
+newListAppMonitorsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListAppMonitorsResponse
+newListAppMonitorsResponse pHttpStatus_ =
+  ListAppMonitorsResponse'
+    { appMonitorSummaries =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of structures that contain information about the returned app
+-- monitors.
+listAppMonitorsResponse_appMonitorSummaries :: Lens.Lens' ListAppMonitorsResponse (Prelude.Maybe [AppMonitorSummary])
+listAppMonitorsResponse_appMonitorSummaries = Lens.lens (\ListAppMonitorsResponse' {appMonitorSummaries} -> appMonitorSummaries) (\s@ListAppMonitorsResponse' {} a -> s {appMonitorSummaries = a} :: ListAppMonitorsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token that you can use in a subsequent operation to retrieve the next
+-- set of results.
+listAppMonitorsResponse_nextToken :: Lens.Lens' ListAppMonitorsResponse (Prelude.Maybe Prelude.Text)
+listAppMonitorsResponse_nextToken = Lens.lens (\ListAppMonitorsResponse' {nextToken} -> nextToken) (\s@ListAppMonitorsResponse' {} a -> s {nextToken = a} :: ListAppMonitorsResponse)
+
+-- | The response's http status code.
+listAppMonitorsResponse_httpStatus :: Lens.Lens' ListAppMonitorsResponse Prelude.Int
+listAppMonitorsResponse_httpStatus = Lens.lens (\ListAppMonitorsResponse' {httpStatus} -> httpStatus) (\s@ListAppMonitorsResponse' {} a -> s {httpStatus = a} :: ListAppMonitorsResponse)
+
+instance Prelude.NFData ListAppMonitorsResponse where
+  rnf ListAppMonitorsResponse' {..} =
+    Prelude.rnf appMonitorSummaries
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/ListRumMetricsDestinations.hs b/gen/Amazonka/Rum/ListRumMetricsDestinations.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/ListRumMetricsDestinations.hs
@@ -0,0 +1,262 @@
+{-# 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.Rum.ListRumMetricsDestinations
+-- 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 destinations that you have created to receive RUM
+-- extended metrics, for the specified app monitor.
+--
+-- For more information about extended metrics, see
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_AddRumMetrcs.html AddRumMetrics>.
+--
+-- This operation returns paginated results.
+module Amazonka.Rum.ListRumMetricsDestinations
+  ( -- * Creating a Request
+    ListRumMetricsDestinations (..),
+    newListRumMetricsDestinations,
+
+    -- * Request Lenses
+    listRumMetricsDestinations_maxResults,
+    listRumMetricsDestinations_nextToken,
+    listRumMetricsDestinations_appMonitorName,
+
+    -- * Destructuring the Response
+    ListRumMetricsDestinationsResponse (..),
+    newListRumMetricsDestinationsResponse,
+
+    -- * Response Lenses
+    listRumMetricsDestinationsResponse_destinations,
+    listRumMetricsDestinationsResponse_nextToken,
+    listRumMetricsDestinationsResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newListRumMetricsDestinations' smart constructor.
+data ListRumMetricsDestinations = ListRumMetricsDestinations'
+  { -- | The maximum number of results to return in one operation. The default is
+    -- 50. The maximum that you can specify is 100.
+    --
+    -- To retrieve the remaining results, make another call with the returned
+    -- @NextToken@ value.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Use the token returned by the previous operation to request the next
+    -- page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the app monitor associated with the destinations that you
+    -- want to retrieve.
+    appMonitorName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRumMetricsDestinations' 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', 'listRumMetricsDestinations_maxResults' - The maximum number of results to return in one operation. The default is
+-- 50. The maximum that you can specify is 100.
+--
+-- To retrieve the remaining results, make another call with the returned
+-- @NextToken@ value.
+--
+-- 'nextToken', 'listRumMetricsDestinations_nextToken' - Use the token returned by the previous operation to request the next
+-- page of results.
+--
+-- 'appMonitorName', 'listRumMetricsDestinations_appMonitorName' - The name of the app monitor associated with the destinations that you
+-- want to retrieve.
+newListRumMetricsDestinations ::
+  -- | 'appMonitorName'
+  Prelude.Text ->
+  ListRumMetricsDestinations
+newListRumMetricsDestinations pAppMonitorName_ =
+  ListRumMetricsDestinations'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      appMonitorName = pAppMonitorName_
+    }
+
+-- | The maximum number of results to return in one operation. The default is
+-- 50. The maximum that you can specify is 100.
+--
+-- To retrieve the remaining results, make another call with the returned
+-- @NextToken@ value.
+listRumMetricsDestinations_maxResults :: Lens.Lens' ListRumMetricsDestinations (Prelude.Maybe Prelude.Natural)
+listRumMetricsDestinations_maxResults = Lens.lens (\ListRumMetricsDestinations' {maxResults} -> maxResults) (\s@ListRumMetricsDestinations' {} a -> s {maxResults = a} :: ListRumMetricsDestinations)
+
+-- | Use the token returned by the previous operation to request the next
+-- page of results.
+listRumMetricsDestinations_nextToken :: Lens.Lens' ListRumMetricsDestinations (Prelude.Maybe Prelude.Text)
+listRumMetricsDestinations_nextToken = Lens.lens (\ListRumMetricsDestinations' {nextToken} -> nextToken) (\s@ListRumMetricsDestinations' {} a -> s {nextToken = a} :: ListRumMetricsDestinations)
+
+-- | The name of the app monitor associated with the destinations that you
+-- want to retrieve.
+listRumMetricsDestinations_appMonitorName :: Lens.Lens' ListRumMetricsDestinations Prelude.Text
+listRumMetricsDestinations_appMonitorName = Lens.lens (\ListRumMetricsDestinations' {appMonitorName} -> appMonitorName) (\s@ListRumMetricsDestinations' {} a -> s {appMonitorName = a} :: ListRumMetricsDestinations)
+
+instance Core.AWSPager ListRumMetricsDestinations where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listRumMetricsDestinationsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listRumMetricsDestinationsResponse_destinations
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listRumMetricsDestinations_nextToken
+          Lens..~ rs
+          Lens.^? listRumMetricsDestinationsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListRumMetricsDestinations where
+  type
+    AWSResponse ListRumMetricsDestinations =
+      ListRumMetricsDestinationsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListRumMetricsDestinationsResponse'
+            Prelude.<$> (x Data..?> "Destinations" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListRumMetricsDestinations where
+  hashWithSalt _salt ListRumMetricsDestinations' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` appMonitorName
+
+instance Prelude.NFData ListRumMetricsDestinations where
+  rnf ListRumMetricsDestinations' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf appMonitorName
+
+instance Data.ToHeaders ListRumMetricsDestinations where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListRumMetricsDestinations where
+  toPath ListRumMetricsDestinations' {..} =
+    Prelude.mconcat
+      [ "/rummetrics/",
+        Data.toBS appMonitorName,
+        "/metricsdestination"
+      ]
+
+instance Data.ToQuery ListRumMetricsDestinations where
+  toQuery ListRumMetricsDestinations' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListRumMetricsDestinationsResponse' smart constructor.
+data ListRumMetricsDestinationsResponse = ListRumMetricsDestinationsResponse'
+  { -- | The list of CloudWatch RUM extended metrics destinations associated with
+    -- the app monitor that you specified.
+    destinations :: Prelude.Maybe [MetricDestinationSummary],
+    -- | A token that you can use in a subsequent operation to retrieve the next
+    -- set of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRumMetricsDestinationsResponse' 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:
+--
+-- 'destinations', 'listRumMetricsDestinationsResponse_destinations' - The list of CloudWatch RUM extended metrics destinations associated with
+-- the app monitor that you specified.
+--
+-- 'nextToken', 'listRumMetricsDestinationsResponse_nextToken' - A token that you can use in a subsequent operation to retrieve the next
+-- set of results.
+--
+-- 'httpStatus', 'listRumMetricsDestinationsResponse_httpStatus' - The response's http status code.
+newListRumMetricsDestinationsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListRumMetricsDestinationsResponse
+newListRumMetricsDestinationsResponse pHttpStatus_ =
+  ListRumMetricsDestinationsResponse'
+    { destinations =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of CloudWatch RUM extended metrics destinations associated with
+-- the app monitor that you specified.
+listRumMetricsDestinationsResponse_destinations :: Lens.Lens' ListRumMetricsDestinationsResponse (Prelude.Maybe [MetricDestinationSummary])
+listRumMetricsDestinationsResponse_destinations = Lens.lens (\ListRumMetricsDestinationsResponse' {destinations} -> destinations) (\s@ListRumMetricsDestinationsResponse' {} a -> s {destinations = a} :: ListRumMetricsDestinationsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token that you can use in a subsequent operation to retrieve the next
+-- set of results.
+listRumMetricsDestinationsResponse_nextToken :: Lens.Lens' ListRumMetricsDestinationsResponse (Prelude.Maybe Prelude.Text)
+listRumMetricsDestinationsResponse_nextToken = Lens.lens (\ListRumMetricsDestinationsResponse' {nextToken} -> nextToken) (\s@ListRumMetricsDestinationsResponse' {} a -> s {nextToken = a} :: ListRumMetricsDestinationsResponse)
+
+-- | The response's http status code.
+listRumMetricsDestinationsResponse_httpStatus :: Lens.Lens' ListRumMetricsDestinationsResponse Prelude.Int
+listRumMetricsDestinationsResponse_httpStatus = Lens.lens (\ListRumMetricsDestinationsResponse' {httpStatus} -> httpStatus) (\s@ListRumMetricsDestinationsResponse' {} a -> s {httpStatus = a} :: ListRumMetricsDestinationsResponse)
+
+instance
+  Prelude.NFData
+    ListRumMetricsDestinationsResponse
+  where
+  rnf ListRumMetricsDestinationsResponse' {..} =
+    Prelude.rnf destinations
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/ListTagsForResource.hs b/gen/Amazonka/Rum/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/ListTagsForResource.hs
@@ -0,0 +1,178 @@
+{-# 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.Rum.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)
+--
+-- Displays the tags associated with a CloudWatch RUM resource.
+module Amazonka.Rum.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_httpStatus,
+    listTagsForResourceResponse_resourceArn,
+    listTagsForResourceResponse_tags,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The ARN of the resource that you want to see the tags of.
+    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 ARN of the resource that you want to see the tags of.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The ARN of the resource that you want to see the tags of.
+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.<$> (Prelude.pure (Prelude.fromEnum s))
+            Prelude.<*> (x Data..:> "ResourceArn")
+            Prelude.<*> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+      )
+
+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 response's http status code.
+    httpStatus :: Prelude.Int,
+    -- | The ARN of the resource that you are viewing.
+    resourceArn :: Prelude.Text,
+    -- | The list of tag keys and values associated with the resource you
+    -- specified.
+    tags :: Prelude.HashMap Prelude.Text Prelude.Text
+  }
+  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:
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+--
+-- 'resourceArn', 'listTagsForResourceResponse_resourceArn' - The ARN of the resource that you are viewing.
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The list of tag keys and values associated with the resource you
+-- specified.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse
+  pHttpStatus_
+  pResourceArn_ =
+    ListTagsForResourceResponse'
+      { httpStatus =
+          pHttpStatus_,
+        resourceArn = pResourceArn_,
+        tags = Prelude.mempty
+      }
+
+-- | 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)
+
+-- | The ARN of the resource that you are viewing.
+listTagsForResourceResponse_resourceArn :: Lens.Lens' ListTagsForResourceResponse Prelude.Text
+listTagsForResourceResponse_resourceArn = Lens.lens (\ListTagsForResourceResponse' {resourceArn} -> resourceArn) (\s@ListTagsForResourceResponse' {} a -> s {resourceArn = a} :: ListTagsForResourceResponse)
+
+-- | The list of tag keys and values associated with the resource you
+-- specified.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.HashMap Prelude.Text Prelude.Text)
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.coerced
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf httpStatus
+      `Prelude.seq` Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/Rum/PutRumEvents.hs b/gen/Amazonka/Rum/PutRumEvents.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/PutRumEvents.hs
@@ -0,0 +1,229 @@
+{-# 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.Rum.PutRumEvents
+-- 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 telemetry events about your application performance and user
+-- behavior to CloudWatch RUM. The code snippet that RUM generates for you
+-- to add to your application includes @PutRumEvents@ operations to send
+-- this data to RUM.
+--
+-- Each @PutRumEvents@ operation can send a batch of events from one user
+-- session.
+module Amazonka.Rum.PutRumEvents
+  ( -- * Creating a Request
+    PutRumEvents (..),
+    newPutRumEvents,
+
+    -- * Request Lenses
+    putRumEvents_appMonitorDetails,
+    putRumEvents_batchId,
+    putRumEvents_id,
+    putRumEvents_rumEvents,
+    putRumEvents_userDetails,
+
+    -- * Destructuring the Response
+    PutRumEventsResponse (..),
+    newPutRumEventsResponse,
+
+    -- * Response Lenses
+    putRumEventsResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newPutRumEvents' smart constructor.
+data PutRumEvents = PutRumEvents'
+  { -- | A structure that contains information about the app monitor that
+    -- collected this telemetry information.
+    appMonitorDetails :: AppMonitorDetails,
+    -- | A unique identifier for this batch of RUM event data.
+    batchId :: Prelude.Text,
+    -- | The ID of the app monitor that is sending this data.
+    id :: Prelude.Text,
+    -- | An array of structures that contain the telemetry event data.
+    rumEvents :: [RumEvent],
+    -- | A structure that contains information about the user session that this
+    -- batch of events was collected from.
+    userDetails :: UserDetails
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutRumEvents' 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:
+--
+-- 'appMonitorDetails', 'putRumEvents_appMonitorDetails' - A structure that contains information about the app monitor that
+-- collected this telemetry information.
+--
+-- 'batchId', 'putRumEvents_batchId' - A unique identifier for this batch of RUM event data.
+--
+-- 'id', 'putRumEvents_id' - The ID of the app monitor that is sending this data.
+--
+-- 'rumEvents', 'putRumEvents_rumEvents' - An array of structures that contain the telemetry event data.
+--
+-- 'userDetails', 'putRumEvents_userDetails' - A structure that contains information about the user session that this
+-- batch of events was collected from.
+newPutRumEvents ::
+  -- | 'appMonitorDetails'
+  AppMonitorDetails ->
+  -- | 'batchId'
+  Prelude.Text ->
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'userDetails'
+  UserDetails ->
+  PutRumEvents
+newPutRumEvents
+  pAppMonitorDetails_
+  pBatchId_
+  pId_
+  pUserDetails_ =
+    PutRumEvents'
+      { appMonitorDetails =
+          pAppMonitorDetails_,
+        batchId = pBatchId_,
+        id = pId_,
+        rumEvents = Prelude.mempty,
+        userDetails = pUserDetails_
+      }
+
+-- | A structure that contains information about the app monitor that
+-- collected this telemetry information.
+putRumEvents_appMonitorDetails :: Lens.Lens' PutRumEvents AppMonitorDetails
+putRumEvents_appMonitorDetails = Lens.lens (\PutRumEvents' {appMonitorDetails} -> appMonitorDetails) (\s@PutRumEvents' {} a -> s {appMonitorDetails = a} :: PutRumEvents)
+
+-- | A unique identifier for this batch of RUM event data.
+putRumEvents_batchId :: Lens.Lens' PutRumEvents Prelude.Text
+putRumEvents_batchId = Lens.lens (\PutRumEvents' {batchId} -> batchId) (\s@PutRumEvents' {} a -> s {batchId = a} :: PutRumEvents)
+
+-- | The ID of the app monitor that is sending this data.
+putRumEvents_id :: Lens.Lens' PutRumEvents Prelude.Text
+putRumEvents_id = Lens.lens (\PutRumEvents' {id} -> id) (\s@PutRumEvents' {} a -> s {id = a} :: PutRumEvents)
+
+-- | An array of structures that contain the telemetry event data.
+putRumEvents_rumEvents :: Lens.Lens' PutRumEvents [RumEvent]
+putRumEvents_rumEvents = Lens.lens (\PutRumEvents' {rumEvents} -> rumEvents) (\s@PutRumEvents' {} a -> s {rumEvents = a} :: PutRumEvents) Prelude.. Lens.coerced
+
+-- | A structure that contains information about the user session that this
+-- batch of events was collected from.
+putRumEvents_userDetails :: Lens.Lens' PutRumEvents UserDetails
+putRumEvents_userDetails = Lens.lens (\PutRumEvents' {userDetails} -> userDetails) (\s@PutRumEvents' {} a -> s {userDetails = a} :: PutRumEvents)
+
+instance Core.AWSRequest PutRumEvents where
+  type AWSResponse PutRumEvents = PutRumEventsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          PutRumEventsResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutRumEvents where
+  hashWithSalt _salt PutRumEvents' {..} =
+    _salt
+      `Prelude.hashWithSalt` appMonitorDetails
+      `Prelude.hashWithSalt` batchId
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` rumEvents
+      `Prelude.hashWithSalt` userDetails
+
+instance Prelude.NFData PutRumEvents where
+  rnf PutRumEvents' {..} =
+    Prelude.rnf appMonitorDetails
+      `Prelude.seq` Prelude.rnf batchId
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf rumEvents
+      `Prelude.seq` Prelude.rnf userDetails
+
+instance Data.ToHeaders PutRumEvents where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutRumEvents where
+  toJSON PutRumEvents' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("AppMonitorDetails" Data..= appMonitorDetails),
+            Prelude.Just ("BatchId" Data..= batchId),
+            Prelude.Just ("RumEvents" Data..= rumEvents),
+            Prelude.Just ("UserDetails" Data..= userDetails)
+          ]
+      )
+
+instance Data.ToPath PutRumEvents where
+  toPath PutRumEvents' {..} =
+    Prelude.mconcat
+      ["/appmonitors/", Data.toBS id, "/"]
+
+instance Data.ToQuery PutRumEvents where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutRumEventsResponse' smart constructor.
+data PutRumEventsResponse = PutRumEventsResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutRumEventsResponse' 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', 'putRumEventsResponse_httpStatus' - The response's http status code.
+newPutRumEventsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutRumEventsResponse
+newPutRumEventsResponse pHttpStatus_ =
+  PutRumEventsResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+putRumEventsResponse_httpStatus :: Lens.Lens' PutRumEventsResponse Prelude.Int
+putRumEventsResponse_httpStatus = Lens.lens (\PutRumEventsResponse' {httpStatus} -> httpStatus) (\s@PutRumEventsResponse' {} a -> s {httpStatus = a} :: PutRumEventsResponse)
+
+instance Prelude.NFData PutRumEventsResponse where
+  rnf PutRumEventsResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/PutRumMetricsDestination.hs b/gen/Amazonka/Rum/PutRumMetricsDestination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/PutRumMetricsDestination.hs
@@ -0,0 +1,247 @@
+{-# 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.Rum.PutRumMetricsDestination
+-- 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 or updates a destination to receive extended metrics from
+-- CloudWatch RUM. You can send extended metrics to CloudWatch or to a
+-- CloudWatch Evidently experiment.
+--
+-- For more information about extended metrics, see
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_AddRumMetrics.html AddRumMetrics>.
+module Amazonka.Rum.PutRumMetricsDestination
+  ( -- * Creating a Request
+    PutRumMetricsDestination (..),
+    newPutRumMetricsDestination,
+
+    -- * Request Lenses
+    putRumMetricsDestination_destinationArn,
+    putRumMetricsDestination_iamRoleArn,
+    putRumMetricsDestination_appMonitorName,
+    putRumMetricsDestination_destination,
+
+    -- * Destructuring the Response
+    PutRumMetricsDestinationResponse (..),
+    newPutRumMetricsDestinationResponse,
+
+    -- * Response Lenses
+    putRumMetricsDestinationResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newPutRumMetricsDestination' smart constructor.
+data PutRumMetricsDestination = PutRumMetricsDestination'
+  { -- | Use this parameter only if @Destination@ is @Evidently@. This parameter
+    -- specifies the ARN of the Evidently experiment that will receive the
+    -- extended metrics.
+    destinationArn :: Prelude.Maybe Prelude.Text,
+    -- | This parameter is required if @Destination@ is @Evidently@. If
+    -- @Destination@ is @CloudWatch@, do not use this parameter.
+    --
+    -- This parameter specifies the ARN of an IAM role that RUM will assume to
+    -- write to the Evidently experiment that you are sending metrics to. This
+    -- role must have permission to write to that experiment.
+    iamRoleArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the CloudWatch RUM app monitor that will send the metrics.
+    appMonitorName :: Prelude.Text,
+    -- | Defines the destination to send the metrics to. Valid values are
+    -- @CloudWatch@ and @Evidently@. If you specify @Evidently@, you must also
+    -- specify the ARN of the CloudWatchEvidently experiment that is to be the
+    -- destination and an IAM role that has permission to write to the
+    -- experiment.
+    destination :: MetricDestination
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutRumMetricsDestination' 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:
+--
+-- 'destinationArn', 'putRumMetricsDestination_destinationArn' - Use this parameter only if @Destination@ is @Evidently@. This parameter
+-- specifies the ARN of the Evidently experiment that will receive the
+-- extended metrics.
+--
+-- 'iamRoleArn', 'putRumMetricsDestination_iamRoleArn' - This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter.
+--
+-- This parameter specifies the ARN of an IAM role that RUM will assume to
+-- write to the Evidently experiment that you are sending metrics to. This
+-- role must have permission to write to that experiment.
+--
+-- 'appMonitorName', 'putRumMetricsDestination_appMonitorName' - The name of the CloudWatch RUM app monitor that will send the metrics.
+--
+-- 'destination', 'putRumMetricsDestination_destination' - Defines the destination to send the metrics to. Valid values are
+-- @CloudWatch@ and @Evidently@. If you specify @Evidently@, you must also
+-- specify the ARN of the CloudWatchEvidently experiment that is to be the
+-- destination and an IAM role that has permission to write to the
+-- experiment.
+newPutRumMetricsDestination ::
+  -- | 'appMonitorName'
+  Prelude.Text ->
+  -- | 'destination'
+  MetricDestination ->
+  PutRumMetricsDestination
+newPutRumMetricsDestination
+  pAppMonitorName_
+  pDestination_ =
+    PutRumMetricsDestination'
+      { destinationArn =
+          Prelude.Nothing,
+        iamRoleArn = Prelude.Nothing,
+        appMonitorName = pAppMonitorName_,
+        destination = pDestination_
+      }
+
+-- | Use this parameter only if @Destination@ is @Evidently@. This parameter
+-- specifies the ARN of the Evidently experiment that will receive the
+-- extended metrics.
+putRumMetricsDestination_destinationArn :: Lens.Lens' PutRumMetricsDestination (Prelude.Maybe Prelude.Text)
+putRumMetricsDestination_destinationArn = Lens.lens (\PutRumMetricsDestination' {destinationArn} -> destinationArn) (\s@PutRumMetricsDestination' {} a -> s {destinationArn = a} :: PutRumMetricsDestination)
+
+-- | This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter.
+--
+-- This parameter specifies the ARN of an IAM role that RUM will assume to
+-- write to the Evidently experiment that you are sending metrics to. This
+-- role must have permission to write to that experiment.
+putRumMetricsDestination_iamRoleArn :: Lens.Lens' PutRumMetricsDestination (Prelude.Maybe Prelude.Text)
+putRumMetricsDestination_iamRoleArn = Lens.lens (\PutRumMetricsDestination' {iamRoleArn} -> iamRoleArn) (\s@PutRumMetricsDestination' {} a -> s {iamRoleArn = a} :: PutRumMetricsDestination)
+
+-- | The name of the CloudWatch RUM app monitor that will send the metrics.
+putRumMetricsDestination_appMonitorName :: Lens.Lens' PutRumMetricsDestination Prelude.Text
+putRumMetricsDestination_appMonitorName = Lens.lens (\PutRumMetricsDestination' {appMonitorName} -> appMonitorName) (\s@PutRumMetricsDestination' {} a -> s {appMonitorName = a} :: PutRumMetricsDestination)
+
+-- | Defines the destination to send the metrics to. Valid values are
+-- @CloudWatch@ and @Evidently@. If you specify @Evidently@, you must also
+-- specify the ARN of the CloudWatchEvidently experiment that is to be the
+-- destination and an IAM role that has permission to write to the
+-- experiment.
+putRumMetricsDestination_destination :: Lens.Lens' PutRumMetricsDestination MetricDestination
+putRumMetricsDestination_destination = Lens.lens (\PutRumMetricsDestination' {destination} -> destination) (\s@PutRumMetricsDestination' {} a -> s {destination = a} :: PutRumMetricsDestination)
+
+instance Core.AWSRequest PutRumMetricsDestination where
+  type
+    AWSResponse PutRumMetricsDestination =
+      PutRumMetricsDestinationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          PutRumMetricsDestinationResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable PutRumMetricsDestination where
+  hashWithSalt _salt PutRumMetricsDestination' {..} =
+    _salt
+      `Prelude.hashWithSalt` destinationArn
+      `Prelude.hashWithSalt` iamRoleArn
+      `Prelude.hashWithSalt` appMonitorName
+      `Prelude.hashWithSalt` destination
+
+instance Prelude.NFData PutRumMetricsDestination where
+  rnf PutRumMetricsDestination' {..} =
+    Prelude.rnf destinationArn
+      `Prelude.seq` Prelude.rnf iamRoleArn
+      `Prelude.seq` Prelude.rnf appMonitorName
+      `Prelude.seq` Prelude.rnf destination
+
+instance Data.ToHeaders PutRumMetricsDestination where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON PutRumMetricsDestination where
+  toJSON PutRumMetricsDestination' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DestinationArn" Data..=)
+              Prelude.<$> destinationArn,
+            ("IamRoleArn" Data..=) Prelude.<$> iamRoleArn,
+            Prelude.Just ("Destination" Data..= destination)
+          ]
+      )
+
+instance Data.ToPath PutRumMetricsDestination where
+  toPath PutRumMetricsDestination' {..} =
+    Prelude.mconcat
+      [ "/rummetrics/",
+        Data.toBS appMonitorName,
+        "/metricsdestination"
+      ]
+
+instance Data.ToQuery PutRumMetricsDestination where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newPutRumMetricsDestinationResponse' smart constructor.
+data PutRumMetricsDestinationResponse = PutRumMetricsDestinationResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PutRumMetricsDestinationResponse' 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', 'putRumMetricsDestinationResponse_httpStatus' - The response's http status code.
+newPutRumMetricsDestinationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  PutRumMetricsDestinationResponse
+newPutRumMetricsDestinationResponse pHttpStatus_ =
+  PutRumMetricsDestinationResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+putRumMetricsDestinationResponse_httpStatus :: Lens.Lens' PutRumMetricsDestinationResponse Prelude.Int
+putRumMetricsDestinationResponse_httpStatus = Lens.lens (\PutRumMetricsDestinationResponse' {httpStatus} -> httpStatus) (\s@PutRumMetricsDestinationResponse' {} a -> s {httpStatus = a} :: PutRumMetricsDestinationResponse)
+
+instance
+  Prelude.NFData
+    PutRumMetricsDestinationResponse
+  where
+  rnf PutRumMetricsDestinationResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/TagResource.hs b/gen/Amazonka/Rum/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/TagResource.hs
@@ -0,0 +1,183 @@
+{-# 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.Rum.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)
+--
+-- Assigns one or more tags (key-value pairs) to the specified CloudWatch
+-- RUM resource. Currently, the only resources that can be tagged app
+-- monitors.
+--
+-- Tags can help you organize and categorize your resources. You can also
+-- use them to scope user permissions by granting a user permission to
+-- access or change only resources with certain tag values.
+--
+-- Tags don\'t have any semantic meaning to Amazon Web Services and are
+-- interpreted strictly as strings of characters.
+--
+-- You can use the @TagResource@ action with a resource that already has
+-- tags. If you specify a new tag key for the resource, this tag is
+-- appended to the list of tags associated with the alarm. If you specify a
+-- tag key that is already associated with the resource, the new tag value
+-- that you specify replaces the previous value for that tag.
+--
+-- You can associate as many as 50 tags with a resource.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html Tagging Amazon Web Services resources>.
+module Amazonka.Rum.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The ARN of the CloudWatch RUM resource that you\'re adding tags to.
+    resourceArn :: Prelude.Text,
+    -- | The list of key-value pairs to associate with the 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 ARN of the CloudWatch RUM resource that you\'re adding tags to.
+--
+-- 'tags', 'tagResource_tags' - The list of key-value pairs to associate with the resource.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The ARN of the CloudWatch RUM resource that you\'re adding tags 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 key-value pairs to associate with the 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/Rum/Types.hs b/gen/Amazonka/Rum/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types.hs
@@ -0,0 +1,318 @@
+{-# 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.Rum.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.Rum.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _InternalServerException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * CustomEventsStatus
+    CustomEventsStatus (..),
+
+    -- * MetricDestination
+    MetricDestination (..),
+
+    -- * StateEnum
+    StateEnum (..),
+
+    -- * Telemetry
+    Telemetry (..),
+
+    -- * AppMonitor
+    AppMonitor (..),
+    newAppMonitor,
+    appMonitor_appMonitorConfiguration,
+    appMonitor_created,
+    appMonitor_customEvents,
+    appMonitor_dataStorage,
+    appMonitor_domain,
+    appMonitor_id,
+    appMonitor_lastModified,
+    appMonitor_name,
+    appMonitor_state,
+    appMonitor_tags,
+
+    -- * AppMonitorConfiguration
+    AppMonitorConfiguration (..),
+    newAppMonitorConfiguration,
+    appMonitorConfiguration_allowCookies,
+    appMonitorConfiguration_enableXRay,
+    appMonitorConfiguration_excludedPages,
+    appMonitorConfiguration_favoritePages,
+    appMonitorConfiguration_guestRoleArn,
+    appMonitorConfiguration_identityPoolId,
+    appMonitorConfiguration_includedPages,
+    appMonitorConfiguration_sessionSampleRate,
+    appMonitorConfiguration_telemetries,
+
+    -- * AppMonitorDetails
+    AppMonitorDetails (..),
+    newAppMonitorDetails,
+    appMonitorDetails_id,
+    appMonitorDetails_name,
+    appMonitorDetails_version,
+
+    -- * AppMonitorSummary
+    AppMonitorSummary (..),
+    newAppMonitorSummary,
+    appMonitorSummary_created,
+    appMonitorSummary_id,
+    appMonitorSummary_lastModified,
+    appMonitorSummary_name,
+    appMonitorSummary_state,
+
+    -- * BatchCreateRumMetricDefinitionsError
+    BatchCreateRumMetricDefinitionsError (..),
+    newBatchCreateRumMetricDefinitionsError,
+    batchCreateRumMetricDefinitionsError_errorCode,
+    batchCreateRumMetricDefinitionsError_errorMessage,
+    batchCreateRumMetricDefinitionsError_metricDefinition,
+
+    -- * BatchDeleteRumMetricDefinitionsError
+    BatchDeleteRumMetricDefinitionsError (..),
+    newBatchDeleteRumMetricDefinitionsError,
+    batchDeleteRumMetricDefinitionsError_errorCode,
+    batchDeleteRumMetricDefinitionsError_errorMessage,
+    batchDeleteRumMetricDefinitionsError_metricDefinitionId,
+
+    -- * CustomEvents
+    CustomEvents (..),
+    newCustomEvents,
+    customEvents_status,
+
+    -- * CwLog
+    CwLog (..),
+    newCwLog,
+    cwLog_cwLogEnabled,
+    cwLog_cwLogGroup,
+
+    -- * DataStorage
+    DataStorage (..),
+    newDataStorage,
+    dataStorage_cwLog,
+
+    -- * MetricDefinition
+    MetricDefinition (..),
+    newMetricDefinition,
+    metricDefinition_dimensionKeys,
+    metricDefinition_eventPattern,
+    metricDefinition_unitLabel,
+    metricDefinition_valueKey,
+    metricDefinition_metricDefinitionId,
+    metricDefinition_name,
+
+    -- * MetricDefinitionRequest
+    MetricDefinitionRequest (..),
+    newMetricDefinitionRequest,
+    metricDefinitionRequest_dimensionKeys,
+    metricDefinitionRequest_eventPattern,
+    metricDefinitionRequest_unitLabel,
+    metricDefinitionRequest_valueKey,
+    metricDefinitionRequest_name,
+
+    -- * MetricDestinationSummary
+    MetricDestinationSummary (..),
+    newMetricDestinationSummary,
+    metricDestinationSummary_destination,
+    metricDestinationSummary_destinationArn,
+    metricDestinationSummary_iamRoleArn,
+
+    -- * QueryFilter
+    QueryFilter (..),
+    newQueryFilter,
+    queryFilter_name,
+    queryFilter_values,
+
+    -- * RumEvent
+    RumEvent (..),
+    newRumEvent,
+    rumEvent_metadata,
+    rumEvent_details,
+    rumEvent_id,
+    rumEvent_timestamp,
+    rumEvent_type,
+
+    -- * TimeRange
+    TimeRange (..),
+    newTimeRange,
+    timeRange_before,
+    timeRange_after,
+
+    -- * UserDetails
+    UserDetails (..),
+    newUserDetails,
+    userDetails_sessionId,
+    userDetails_userId,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.Rum.Types.AppMonitor
+import Amazonka.Rum.Types.AppMonitorConfiguration
+import Amazonka.Rum.Types.AppMonitorDetails
+import Amazonka.Rum.Types.AppMonitorSummary
+import Amazonka.Rum.Types.BatchCreateRumMetricDefinitionsError
+import Amazonka.Rum.Types.BatchDeleteRumMetricDefinitionsError
+import Amazonka.Rum.Types.CustomEvents
+import Amazonka.Rum.Types.CustomEventsStatus
+import Amazonka.Rum.Types.CwLog
+import Amazonka.Rum.Types.DataStorage
+import Amazonka.Rum.Types.MetricDefinition
+import Amazonka.Rum.Types.MetricDefinitionRequest
+import Amazonka.Rum.Types.MetricDestination
+import Amazonka.Rum.Types.MetricDestinationSummary
+import Amazonka.Rum.Types.QueryFilter
+import Amazonka.Rum.Types.RumEvent
+import Amazonka.Rum.Types.StateEnum
+import Amazonka.Rum.Types.Telemetry
+import Amazonka.Rum.Types.TimeRange
+import Amazonka.Rum.Types.UserDetails
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2018-05-10@ of the Amazon CloudWatch RUM SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "Rum",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "rum",
+      Core.signingName = "rum",
+      Core.version = "2018-05-10",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "Rum",
+      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
+
+-- | You don\'t have sufficient permissions to perform this action.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+-- | This operation attempted to create a resource that already exists.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | Internal service exception.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+-- | Resource not found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | This request exceeds a service quota.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+    Prelude.. Core.hasStatus 402
+
+-- | The request was throttled because of quota limits.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+-- | One of the arguments for the request 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/Rum/Types/AppMonitor.hs b/gen/Amazonka/Rum/Types/AppMonitor.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/AppMonitor.hs
@@ -0,0 +1,215 @@
+{-# 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.Rum.Types.AppMonitor
+-- 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.Rum.Types.AppMonitor 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
+import Amazonka.Rum.Types.AppMonitorConfiguration
+import Amazonka.Rum.Types.CustomEvents
+import Amazonka.Rum.Types.DataStorage
+import Amazonka.Rum.Types.StateEnum
+
+-- | A RUM app monitor collects telemetry data from your application and
+-- sends that data to RUM. The data includes performance and reliability
+-- information such as page load time, client-side errors, and user
+-- behavior.
+--
+-- /See:/ 'newAppMonitor' smart constructor.
+data AppMonitor = AppMonitor'
+  { -- | A structure that contains much of the configuration data for the app
+    -- monitor.
+    appMonitorConfiguration :: Prelude.Maybe AppMonitorConfiguration,
+    -- | The date and time that this app monitor was created.
+    created :: Prelude.Maybe Prelude.Text,
+    -- | Specifies whether this app monitor allows the web client to define and
+    -- send custom events.
+    --
+    -- For more information about custom events, see
+    -- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-custom-events.html Send custom events>.
+    customEvents :: Prelude.Maybe CustomEvents,
+    -- | A structure that contains information about whether this app monitor
+    -- stores a copy of the telemetry data that RUM collects using CloudWatch
+    -- Logs.
+    dataStorage :: Prelude.Maybe DataStorage,
+    -- | The top-level internet domain name for which your application has
+    -- administrative authority.
+    domain :: Prelude.Maybe Prelude.Text,
+    -- | The unique ID of this app monitor.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The date and time of the most recent changes to this app monitor\'s
+    -- configuration.
+    lastModified :: Prelude.Maybe Prelude.Text,
+    -- | The name of the app monitor.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The current state of the app monitor.
+    state :: Prelude.Maybe StateEnum,
+    -- | The list of tag keys and values associated with this app monitor.
+    tags :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AppMonitor' 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:
+--
+-- 'appMonitorConfiguration', 'appMonitor_appMonitorConfiguration' - A structure that contains much of the configuration data for the app
+-- monitor.
+--
+-- 'created', 'appMonitor_created' - The date and time that this app monitor was created.
+--
+-- 'customEvents', 'appMonitor_customEvents' - Specifies whether this app monitor allows the web client to define and
+-- send custom events.
+--
+-- For more information about custom events, see
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-custom-events.html Send custom events>.
+--
+-- 'dataStorage', 'appMonitor_dataStorage' - A structure that contains information about whether this app monitor
+-- stores a copy of the telemetry data that RUM collects using CloudWatch
+-- Logs.
+--
+-- 'domain', 'appMonitor_domain' - The top-level internet domain name for which your application has
+-- administrative authority.
+--
+-- 'id', 'appMonitor_id' - The unique ID of this app monitor.
+--
+-- 'lastModified', 'appMonitor_lastModified' - The date and time of the most recent changes to this app monitor\'s
+-- configuration.
+--
+-- 'name', 'appMonitor_name' - The name of the app monitor.
+--
+-- 'state', 'appMonitor_state' - The current state of the app monitor.
+--
+-- 'tags', 'appMonitor_tags' - The list of tag keys and values associated with this app monitor.
+newAppMonitor ::
+  AppMonitor
+newAppMonitor =
+  AppMonitor'
+    { appMonitorConfiguration =
+        Prelude.Nothing,
+      created = Prelude.Nothing,
+      customEvents = Prelude.Nothing,
+      dataStorage = Prelude.Nothing,
+      domain = Prelude.Nothing,
+      id = Prelude.Nothing,
+      lastModified = Prelude.Nothing,
+      name = Prelude.Nothing,
+      state = Prelude.Nothing,
+      tags = Prelude.Nothing
+    }
+
+-- | A structure that contains much of the configuration data for the app
+-- monitor.
+appMonitor_appMonitorConfiguration :: Lens.Lens' AppMonitor (Prelude.Maybe AppMonitorConfiguration)
+appMonitor_appMonitorConfiguration = Lens.lens (\AppMonitor' {appMonitorConfiguration} -> appMonitorConfiguration) (\s@AppMonitor' {} a -> s {appMonitorConfiguration = a} :: AppMonitor)
+
+-- | The date and time that this app monitor was created.
+appMonitor_created :: Lens.Lens' AppMonitor (Prelude.Maybe Prelude.Text)
+appMonitor_created = Lens.lens (\AppMonitor' {created} -> created) (\s@AppMonitor' {} a -> s {created = a} :: AppMonitor)
+
+-- | Specifies whether this app monitor allows the web client to define and
+-- send custom events.
+--
+-- For more information about custom events, see
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-custom-events.html Send custom events>.
+appMonitor_customEvents :: Lens.Lens' AppMonitor (Prelude.Maybe CustomEvents)
+appMonitor_customEvents = Lens.lens (\AppMonitor' {customEvents} -> customEvents) (\s@AppMonitor' {} a -> s {customEvents = a} :: AppMonitor)
+
+-- | A structure that contains information about whether this app monitor
+-- stores a copy of the telemetry data that RUM collects using CloudWatch
+-- Logs.
+appMonitor_dataStorage :: Lens.Lens' AppMonitor (Prelude.Maybe DataStorage)
+appMonitor_dataStorage = Lens.lens (\AppMonitor' {dataStorage} -> dataStorage) (\s@AppMonitor' {} a -> s {dataStorage = a} :: AppMonitor)
+
+-- | The top-level internet domain name for which your application has
+-- administrative authority.
+appMonitor_domain :: Lens.Lens' AppMonitor (Prelude.Maybe Prelude.Text)
+appMonitor_domain = Lens.lens (\AppMonitor' {domain} -> domain) (\s@AppMonitor' {} a -> s {domain = a} :: AppMonitor)
+
+-- | The unique ID of this app monitor.
+appMonitor_id :: Lens.Lens' AppMonitor (Prelude.Maybe Prelude.Text)
+appMonitor_id = Lens.lens (\AppMonitor' {id} -> id) (\s@AppMonitor' {} a -> s {id = a} :: AppMonitor)
+
+-- | The date and time of the most recent changes to this app monitor\'s
+-- configuration.
+appMonitor_lastModified :: Lens.Lens' AppMonitor (Prelude.Maybe Prelude.Text)
+appMonitor_lastModified = Lens.lens (\AppMonitor' {lastModified} -> lastModified) (\s@AppMonitor' {} a -> s {lastModified = a} :: AppMonitor)
+
+-- | The name of the app monitor.
+appMonitor_name :: Lens.Lens' AppMonitor (Prelude.Maybe Prelude.Text)
+appMonitor_name = Lens.lens (\AppMonitor' {name} -> name) (\s@AppMonitor' {} a -> s {name = a} :: AppMonitor)
+
+-- | The current state of the app monitor.
+appMonitor_state :: Lens.Lens' AppMonitor (Prelude.Maybe StateEnum)
+appMonitor_state = Lens.lens (\AppMonitor' {state} -> state) (\s@AppMonitor' {} a -> s {state = a} :: AppMonitor)
+
+-- | The list of tag keys and values associated with this app monitor.
+appMonitor_tags :: Lens.Lens' AppMonitor (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+appMonitor_tags = Lens.lens (\AppMonitor' {tags} -> tags) (\s@AppMonitor' {} a -> s {tags = a} :: AppMonitor) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON AppMonitor where
+  parseJSON =
+    Data.withObject
+      "AppMonitor"
+      ( \x ->
+          AppMonitor'
+            Prelude.<$> (x Data..:? "AppMonitorConfiguration")
+            Prelude.<*> (x Data..:? "Created")
+            Prelude.<*> (x Data..:? "CustomEvents")
+            Prelude.<*> (x Data..:? "DataStorage")
+            Prelude.<*> (x Data..:? "Domain")
+            Prelude.<*> (x Data..:? "Id")
+            Prelude.<*> (x Data..:? "LastModified")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "State")
+            Prelude.<*> (x Data..:? "Tags" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable AppMonitor where
+  hashWithSalt _salt AppMonitor' {..} =
+    _salt
+      `Prelude.hashWithSalt` appMonitorConfiguration
+      `Prelude.hashWithSalt` created
+      `Prelude.hashWithSalt` customEvents
+      `Prelude.hashWithSalt` dataStorage
+      `Prelude.hashWithSalt` domain
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` lastModified
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` state
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData AppMonitor where
+  rnf AppMonitor' {..} =
+    Prelude.rnf appMonitorConfiguration
+      `Prelude.seq` Prelude.rnf created
+      `Prelude.seq` Prelude.rnf customEvents
+      `Prelude.seq` Prelude.rnf dataStorage
+      `Prelude.seq` Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf lastModified
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf state
+      `Prelude.seq` Prelude.rnf tags
diff --git a/gen/Amazonka/Rum/Types/AppMonitorConfiguration.hs b/gen/Amazonka/Rum/Types/AppMonitorConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/AppMonitorConfiguration.hs
@@ -0,0 +1,312 @@
+{-# 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.Rum.Types.AppMonitorConfiguration
+-- 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.Rum.Types.AppMonitorConfiguration 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
+import Amazonka.Rum.Types.Telemetry
+
+-- | This structure contains much of the configuration data for the app
+-- monitor.
+--
+-- /See:/ 'newAppMonitorConfiguration' smart constructor.
+data AppMonitorConfiguration = AppMonitorConfiguration'
+  { -- | If you set this to @true@, the RUM web client sets two cookies, a
+    -- session cookie and a user cookie. The cookies allow the RUM web client
+    -- to collect data relating to the number of users an application has and
+    -- the behavior of the application across a sequence of events. Cookies are
+    -- stored in the top-level domain of the current page.
+    allowCookies :: Prelude.Maybe Prelude.Bool,
+    -- | If you set this to @true@, RUM enables X-Ray tracing for the user
+    -- sessions that RUM samples. RUM adds an X-Ray trace header to allowed
+    -- HTTP requests. It also records an X-Ray segment for allowed HTTP
+    -- requests. You can see traces and segments from these user sessions in
+    -- the X-Ray console and the CloudWatch ServiceLens console. For more
+    -- information, see
+    -- <https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html What is X-Ray?>
+    enableXRay :: Prelude.Maybe Prelude.Bool,
+    -- | A list of URLs in your website or application to exclude from RUM data
+    -- collection.
+    --
+    -- You can\'t include both @ExcludedPages@ and @IncludedPages@ in the same
+    -- operation.
+    excludedPages :: Prelude.Maybe [Prelude.Text],
+    -- | A list of pages in your application that are to be displayed with a
+    -- \"favorite\" icon in the CloudWatch RUM console.
+    favoritePages :: Prelude.Maybe [Prelude.Text],
+    -- | The ARN of the guest IAM role that is attached to the Amazon Cognito
+    -- identity pool that is used to authorize the sending of data to RUM.
+    guestRoleArn :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the Amazon Cognito identity pool that is used to authorize the
+    -- sending of data to RUM.
+    identityPoolId :: Prelude.Maybe Prelude.Text,
+    -- | If this app monitor is to collect data from only certain pages in your
+    -- application, this structure lists those pages.
+    --
+    -- You can\'t include both @ExcludedPages@ and @IncludedPages@ in the same
+    -- operation.
+    includedPages :: Prelude.Maybe [Prelude.Text],
+    -- | Specifies the portion of user sessions to use for RUM data collection.
+    -- Choosing a higher portion gives you more data but also incurs more
+    -- costs.
+    --
+    -- The range for this value is 0 to 1 inclusive. Setting this to 1 means
+    -- that 100% of user sessions are sampled, and setting it to 0.1 means that
+    -- 10% of user sessions are sampled.
+    --
+    -- If you omit this parameter, the default of 0.1 is used, and 10% of
+    -- sessions will be sampled.
+    sessionSampleRate :: Prelude.Maybe Prelude.Double,
+    -- | An array that lists the types of telemetry data that this app monitor is
+    -- to collect.
+    --
+    -- -   @errors@ indicates that RUM collects data about unhandled JavaScript
+    --     errors raised by your application.
+    --
+    -- -   @performance@ indicates that RUM collects performance data about how
+    --     your application and its resources are loaded and rendered. This
+    --     includes Core Web Vitals.
+    --
+    -- -   @http@ indicates that RUM collects data about HTTP errors thrown by
+    --     your application.
+    telemetries :: Prelude.Maybe [Telemetry]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AppMonitorConfiguration' 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:
+--
+-- 'allowCookies', 'appMonitorConfiguration_allowCookies' - If you set this to @true@, the RUM web client sets two cookies, a
+-- session cookie and a user cookie. The cookies allow the RUM web client
+-- to collect data relating to the number of users an application has and
+-- the behavior of the application across a sequence of events. Cookies are
+-- stored in the top-level domain of the current page.
+--
+-- 'enableXRay', 'appMonitorConfiguration_enableXRay' - If you set this to @true@, RUM enables X-Ray tracing for the user
+-- sessions that RUM samples. RUM adds an X-Ray trace header to allowed
+-- HTTP requests. It also records an X-Ray segment for allowed HTTP
+-- requests. You can see traces and segments from these user sessions in
+-- the X-Ray console and the CloudWatch ServiceLens console. For more
+-- information, see
+-- <https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html What is X-Ray?>
+--
+-- 'excludedPages', 'appMonitorConfiguration_excludedPages' - A list of URLs in your website or application to exclude from RUM data
+-- collection.
+--
+-- You can\'t include both @ExcludedPages@ and @IncludedPages@ in the same
+-- operation.
+--
+-- 'favoritePages', 'appMonitorConfiguration_favoritePages' - A list of pages in your application that are to be displayed with a
+-- \"favorite\" icon in the CloudWatch RUM console.
+--
+-- 'guestRoleArn', 'appMonitorConfiguration_guestRoleArn' - The ARN of the guest IAM role that is attached to the Amazon Cognito
+-- identity pool that is used to authorize the sending of data to RUM.
+--
+-- 'identityPoolId', 'appMonitorConfiguration_identityPoolId' - The ID of the Amazon Cognito identity pool that is used to authorize the
+-- sending of data to RUM.
+--
+-- 'includedPages', 'appMonitorConfiguration_includedPages' - If this app monitor is to collect data from only certain pages in your
+-- application, this structure lists those pages.
+--
+-- You can\'t include both @ExcludedPages@ and @IncludedPages@ in the same
+-- operation.
+--
+-- 'sessionSampleRate', 'appMonitorConfiguration_sessionSampleRate' - Specifies the portion of user sessions to use for RUM data collection.
+-- Choosing a higher portion gives you more data but also incurs more
+-- costs.
+--
+-- The range for this value is 0 to 1 inclusive. Setting this to 1 means
+-- that 100% of user sessions are sampled, and setting it to 0.1 means that
+-- 10% of user sessions are sampled.
+--
+-- If you omit this parameter, the default of 0.1 is used, and 10% of
+-- sessions will be sampled.
+--
+-- 'telemetries', 'appMonitorConfiguration_telemetries' - An array that lists the types of telemetry data that this app monitor is
+-- to collect.
+--
+-- -   @errors@ indicates that RUM collects data about unhandled JavaScript
+--     errors raised by your application.
+--
+-- -   @performance@ indicates that RUM collects performance data about how
+--     your application and its resources are loaded and rendered. This
+--     includes Core Web Vitals.
+--
+-- -   @http@ indicates that RUM collects data about HTTP errors thrown by
+--     your application.
+newAppMonitorConfiguration ::
+  AppMonitorConfiguration
+newAppMonitorConfiguration =
+  AppMonitorConfiguration'
+    { allowCookies =
+        Prelude.Nothing,
+      enableXRay = Prelude.Nothing,
+      excludedPages = Prelude.Nothing,
+      favoritePages = Prelude.Nothing,
+      guestRoleArn = Prelude.Nothing,
+      identityPoolId = Prelude.Nothing,
+      includedPages = Prelude.Nothing,
+      sessionSampleRate = Prelude.Nothing,
+      telemetries = Prelude.Nothing
+    }
+
+-- | If you set this to @true@, the RUM web client sets two cookies, a
+-- session cookie and a user cookie. The cookies allow the RUM web client
+-- to collect data relating to the number of users an application has and
+-- the behavior of the application across a sequence of events. Cookies are
+-- stored in the top-level domain of the current page.
+appMonitorConfiguration_allowCookies :: Lens.Lens' AppMonitorConfiguration (Prelude.Maybe Prelude.Bool)
+appMonitorConfiguration_allowCookies = Lens.lens (\AppMonitorConfiguration' {allowCookies} -> allowCookies) (\s@AppMonitorConfiguration' {} a -> s {allowCookies = a} :: AppMonitorConfiguration)
+
+-- | If you set this to @true@, RUM enables X-Ray tracing for the user
+-- sessions that RUM samples. RUM adds an X-Ray trace header to allowed
+-- HTTP requests. It also records an X-Ray segment for allowed HTTP
+-- requests. You can see traces and segments from these user sessions in
+-- the X-Ray console and the CloudWatch ServiceLens console. For more
+-- information, see
+-- <https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html What is X-Ray?>
+appMonitorConfiguration_enableXRay :: Lens.Lens' AppMonitorConfiguration (Prelude.Maybe Prelude.Bool)
+appMonitorConfiguration_enableXRay = Lens.lens (\AppMonitorConfiguration' {enableXRay} -> enableXRay) (\s@AppMonitorConfiguration' {} a -> s {enableXRay = a} :: AppMonitorConfiguration)
+
+-- | A list of URLs in your website or application to exclude from RUM data
+-- collection.
+--
+-- You can\'t include both @ExcludedPages@ and @IncludedPages@ in the same
+-- operation.
+appMonitorConfiguration_excludedPages :: Lens.Lens' AppMonitorConfiguration (Prelude.Maybe [Prelude.Text])
+appMonitorConfiguration_excludedPages = Lens.lens (\AppMonitorConfiguration' {excludedPages} -> excludedPages) (\s@AppMonitorConfiguration' {} a -> s {excludedPages = a} :: AppMonitorConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | A list of pages in your application that are to be displayed with a
+-- \"favorite\" icon in the CloudWatch RUM console.
+appMonitorConfiguration_favoritePages :: Lens.Lens' AppMonitorConfiguration (Prelude.Maybe [Prelude.Text])
+appMonitorConfiguration_favoritePages = Lens.lens (\AppMonitorConfiguration' {favoritePages} -> favoritePages) (\s@AppMonitorConfiguration' {} a -> s {favoritePages = a} :: AppMonitorConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | The ARN of the guest IAM role that is attached to the Amazon Cognito
+-- identity pool that is used to authorize the sending of data to RUM.
+appMonitorConfiguration_guestRoleArn :: Lens.Lens' AppMonitorConfiguration (Prelude.Maybe Prelude.Text)
+appMonitorConfiguration_guestRoleArn = Lens.lens (\AppMonitorConfiguration' {guestRoleArn} -> guestRoleArn) (\s@AppMonitorConfiguration' {} a -> s {guestRoleArn = a} :: AppMonitorConfiguration)
+
+-- | The ID of the Amazon Cognito identity pool that is used to authorize the
+-- sending of data to RUM.
+appMonitorConfiguration_identityPoolId :: Lens.Lens' AppMonitorConfiguration (Prelude.Maybe Prelude.Text)
+appMonitorConfiguration_identityPoolId = Lens.lens (\AppMonitorConfiguration' {identityPoolId} -> identityPoolId) (\s@AppMonitorConfiguration' {} a -> s {identityPoolId = a} :: AppMonitorConfiguration)
+
+-- | If this app monitor is to collect data from only certain pages in your
+-- application, this structure lists those pages.
+--
+-- You can\'t include both @ExcludedPages@ and @IncludedPages@ in the same
+-- operation.
+appMonitorConfiguration_includedPages :: Lens.Lens' AppMonitorConfiguration (Prelude.Maybe [Prelude.Text])
+appMonitorConfiguration_includedPages = Lens.lens (\AppMonitorConfiguration' {includedPages} -> includedPages) (\s@AppMonitorConfiguration' {} a -> s {includedPages = a} :: AppMonitorConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specifies the portion of user sessions to use for RUM data collection.
+-- Choosing a higher portion gives you more data but also incurs more
+-- costs.
+--
+-- The range for this value is 0 to 1 inclusive. Setting this to 1 means
+-- that 100% of user sessions are sampled, and setting it to 0.1 means that
+-- 10% of user sessions are sampled.
+--
+-- If you omit this parameter, the default of 0.1 is used, and 10% of
+-- sessions will be sampled.
+appMonitorConfiguration_sessionSampleRate :: Lens.Lens' AppMonitorConfiguration (Prelude.Maybe Prelude.Double)
+appMonitorConfiguration_sessionSampleRate = Lens.lens (\AppMonitorConfiguration' {sessionSampleRate} -> sessionSampleRate) (\s@AppMonitorConfiguration' {} a -> s {sessionSampleRate = a} :: AppMonitorConfiguration)
+
+-- | An array that lists the types of telemetry data that this app monitor is
+-- to collect.
+--
+-- -   @errors@ indicates that RUM collects data about unhandled JavaScript
+--     errors raised by your application.
+--
+-- -   @performance@ indicates that RUM collects performance data about how
+--     your application and its resources are loaded and rendered. This
+--     includes Core Web Vitals.
+--
+-- -   @http@ indicates that RUM collects data about HTTP errors thrown by
+--     your application.
+appMonitorConfiguration_telemetries :: Lens.Lens' AppMonitorConfiguration (Prelude.Maybe [Telemetry])
+appMonitorConfiguration_telemetries = Lens.lens (\AppMonitorConfiguration' {telemetries} -> telemetries) (\s@AppMonitorConfiguration' {} a -> s {telemetries = a} :: AppMonitorConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON AppMonitorConfiguration where
+  parseJSON =
+    Data.withObject
+      "AppMonitorConfiguration"
+      ( \x ->
+          AppMonitorConfiguration'
+            Prelude.<$> (x Data..:? "AllowCookies")
+            Prelude.<*> (x Data..:? "EnableXRay")
+            Prelude.<*> (x Data..:? "ExcludedPages" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "FavoritePages" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "GuestRoleArn")
+            Prelude.<*> (x Data..:? "IdentityPoolId")
+            Prelude.<*> (x Data..:? "IncludedPages" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "SessionSampleRate")
+            Prelude.<*> (x Data..:? "Telemetries" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable AppMonitorConfiguration where
+  hashWithSalt _salt AppMonitorConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` allowCookies
+      `Prelude.hashWithSalt` enableXRay
+      `Prelude.hashWithSalt` excludedPages
+      `Prelude.hashWithSalt` favoritePages
+      `Prelude.hashWithSalt` guestRoleArn
+      `Prelude.hashWithSalt` identityPoolId
+      `Prelude.hashWithSalt` includedPages
+      `Prelude.hashWithSalt` sessionSampleRate
+      `Prelude.hashWithSalt` telemetries
+
+instance Prelude.NFData AppMonitorConfiguration where
+  rnf AppMonitorConfiguration' {..} =
+    Prelude.rnf allowCookies
+      `Prelude.seq` Prelude.rnf enableXRay
+      `Prelude.seq` Prelude.rnf excludedPages
+      `Prelude.seq` Prelude.rnf favoritePages
+      `Prelude.seq` Prelude.rnf guestRoleArn
+      `Prelude.seq` Prelude.rnf identityPoolId
+      `Prelude.seq` Prelude.rnf includedPages
+      `Prelude.seq` Prelude.rnf sessionSampleRate
+      `Prelude.seq` Prelude.rnf telemetries
+
+instance Data.ToJSON AppMonitorConfiguration where
+  toJSON AppMonitorConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AllowCookies" Data..=) Prelude.<$> allowCookies,
+            ("EnableXRay" Data..=) Prelude.<$> enableXRay,
+            ("ExcludedPages" Data..=) Prelude.<$> excludedPages,
+            ("FavoritePages" Data..=) Prelude.<$> favoritePages,
+            ("GuestRoleArn" Data..=) Prelude.<$> guestRoleArn,
+            ("IdentityPoolId" Data..=)
+              Prelude.<$> identityPoolId,
+            ("IncludedPages" Data..=) Prelude.<$> includedPages,
+            ("SessionSampleRate" Data..=)
+              Prelude.<$> sessionSampleRate,
+            ("Telemetries" Data..=) Prelude.<$> telemetries
+          ]
+      )
diff --git a/gen/Amazonka/Rum/Types/AppMonitorDetails.hs b/gen/Amazonka/Rum/Types/AppMonitorDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/AppMonitorDetails.hs
@@ -0,0 +1,95 @@
+{-# 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.Rum.Types.AppMonitorDetails
+-- 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.Rum.Types.AppMonitorDetails 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 structure that contains information about the RUM app monitor.
+--
+-- /See:/ 'newAppMonitorDetails' smart constructor.
+data AppMonitorDetails = AppMonitorDetails'
+  { -- | The unique ID of the app monitor.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The name of the app monitor.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The version of the app monitor.
+    version :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AppMonitorDetails' 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', 'appMonitorDetails_id' - The unique ID of the app monitor.
+--
+-- 'name', 'appMonitorDetails_name' - The name of the app monitor.
+--
+-- 'version', 'appMonitorDetails_version' - The version of the app monitor.
+newAppMonitorDetails ::
+  AppMonitorDetails
+newAppMonitorDetails =
+  AppMonitorDetails'
+    { id = Prelude.Nothing,
+      name = Prelude.Nothing,
+      version = Prelude.Nothing
+    }
+
+-- | The unique ID of the app monitor.
+appMonitorDetails_id :: Lens.Lens' AppMonitorDetails (Prelude.Maybe Prelude.Text)
+appMonitorDetails_id = Lens.lens (\AppMonitorDetails' {id} -> id) (\s@AppMonitorDetails' {} a -> s {id = a} :: AppMonitorDetails)
+
+-- | The name of the app monitor.
+appMonitorDetails_name :: Lens.Lens' AppMonitorDetails (Prelude.Maybe Prelude.Text)
+appMonitorDetails_name = Lens.lens (\AppMonitorDetails' {name} -> name) (\s@AppMonitorDetails' {} a -> s {name = a} :: AppMonitorDetails)
+
+-- | The version of the app monitor.
+appMonitorDetails_version :: Lens.Lens' AppMonitorDetails (Prelude.Maybe Prelude.Text)
+appMonitorDetails_version = Lens.lens (\AppMonitorDetails' {version} -> version) (\s@AppMonitorDetails' {} a -> s {version = a} :: AppMonitorDetails)
+
+instance Prelude.Hashable AppMonitorDetails where
+  hashWithSalt _salt AppMonitorDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` version
+
+instance Prelude.NFData AppMonitorDetails where
+  rnf AppMonitorDetails' {..} =
+    Prelude.rnf id
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf version
+
+instance Data.ToJSON AppMonitorDetails where
+  toJSON AppMonitorDetails' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("id" Data..=) Prelude.<$> id,
+            ("name" Data..=) Prelude.<$> name,
+            ("version" Data..=) Prelude.<$> version
+          ]
+      )
diff --git a/gen/Amazonka/Rum/Types/AppMonitorSummary.hs b/gen/Amazonka/Rum/Types/AppMonitorSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/AppMonitorSummary.hs
@@ -0,0 +1,125 @@
+{-# 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.Rum.Types.AppMonitorSummary
+-- 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.Rum.Types.AppMonitorSummary 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
+import Amazonka.Rum.Types.StateEnum
+
+-- | A structure that includes some data about app monitors and their
+-- settings.
+--
+-- /See:/ 'newAppMonitorSummary' smart constructor.
+data AppMonitorSummary = AppMonitorSummary'
+  { -- | The date and time that the app monitor was created.
+    created :: Prelude.Maybe Prelude.Text,
+    -- | The unique ID of this app monitor.
+    id :: Prelude.Maybe Prelude.Text,
+    -- | The date and time of the most recent changes to this app monitor\'s
+    -- configuration.
+    lastModified :: Prelude.Maybe Prelude.Text,
+    -- | The name of this app monitor.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The current state of this app monitor.
+    state :: Prelude.Maybe StateEnum
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AppMonitorSummary' 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:
+--
+-- 'created', 'appMonitorSummary_created' - The date and time that the app monitor was created.
+--
+-- 'id', 'appMonitorSummary_id' - The unique ID of this app monitor.
+--
+-- 'lastModified', 'appMonitorSummary_lastModified' - The date and time of the most recent changes to this app monitor\'s
+-- configuration.
+--
+-- 'name', 'appMonitorSummary_name' - The name of this app monitor.
+--
+-- 'state', 'appMonitorSummary_state' - The current state of this app monitor.
+newAppMonitorSummary ::
+  AppMonitorSummary
+newAppMonitorSummary =
+  AppMonitorSummary'
+    { created = Prelude.Nothing,
+      id = Prelude.Nothing,
+      lastModified = Prelude.Nothing,
+      name = Prelude.Nothing,
+      state = Prelude.Nothing
+    }
+
+-- | The date and time that the app monitor was created.
+appMonitorSummary_created :: Lens.Lens' AppMonitorSummary (Prelude.Maybe Prelude.Text)
+appMonitorSummary_created = Lens.lens (\AppMonitorSummary' {created} -> created) (\s@AppMonitorSummary' {} a -> s {created = a} :: AppMonitorSummary)
+
+-- | The unique ID of this app monitor.
+appMonitorSummary_id :: Lens.Lens' AppMonitorSummary (Prelude.Maybe Prelude.Text)
+appMonitorSummary_id = Lens.lens (\AppMonitorSummary' {id} -> id) (\s@AppMonitorSummary' {} a -> s {id = a} :: AppMonitorSummary)
+
+-- | The date and time of the most recent changes to this app monitor\'s
+-- configuration.
+appMonitorSummary_lastModified :: Lens.Lens' AppMonitorSummary (Prelude.Maybe Prelude.Text)
+appMonitorSummary_lastModified = Lens.lens (\AppMonitorSummary' {lastModified} -> lastModified) (\s@AppMonitorSummary' {} a -> s {lastModified = a} :: AppMonitorSummary)
+
+-- | The name of this app monitor.
+appMonitorSummary_name :: Lens.Lens' AppMonitorSummary (Prelude.Maybe Prelude.Text)
+appMonitorSummary_name = Lens.lens (\AppMonitorSummary' {name} -> name) (\s@AppMonitorSummary' {} a -> s {name = a} :: AppMonitorSummary)
+
+-- | The current state of this app monitor.
+appMonitorSummary_state :: Lens.Lens' AppMonitorSummary (Prelude.Maybe StateEnum)
+appMonitorSummary_state = Lens.lens (\AppMonitorSummary' {state} -> state) (\s@AppMonitorSummary' {} a -> s {state = a} :: AppMonitorSummary)
+
+instance Data.FromJSON AppMonitorSummary where
+  parseJSON =
+    Data.withObject
+      "AppMonitorSummary"
+      ( \x ->
+          AppMonitorSummary'
+            Prelude.<$> (x Data..:? "Created")
+            Prelude.<*> (x Data..:? "Id")
+            Prelude.<*> (x Data..:? "LastModified")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "State")
+      )
+
+instance Prelude.Hashable AppMonitorSummary where
+  hashWithSalt _salt AppMonitorSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` created
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` lastModified
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` state
+
+instance Prelude.NFData AppMonitorSummary where
+  rnf AppMonitorSummary' {..} =
+    Prelude.rnf created
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf lastModified
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf state
diff --git a/gen/Amazonka/Rum/Types/BatchCreateRumMetricDefinitionsError.hs b/gen/Amazonka/Rum/Types/BatchCreateRumMetricDefinitionsError.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/BatchCreateRumMetricDefinitionsError.hs
@@ -0,0 +1,120 @@
+{-# 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.Rum.Types.BatchCreateRumMetricDefinitionsError
+-- 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.Rum.Types.BatchCreateRumMetricDefinitionsError 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
+import Amazonka.Rum.Types.MetricDefinitionRequest
+
+-- | A structure that defines one error caused by a
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_BatchCreateRumMetricsDefinitions.html BatchCreateRumMetricsDefinitions>
+-- operation.
+--
+-- /See:/ 'newBatchCreateRumMetricDefinitionsError' smart constructor.
+data BatchCreateRumMetricDefinitionsError = BatchCreateRumMetricDefinitionsError'
+  { -- | The error code.
+    errorCode :: Prelude.Text,
+    -- | The error message for this metric definition.
+    errorMessage :: Prelude.Text,
+    -- | The metric definition that caused this error.
+    metricDefinition :: MetricDefinitionRequest
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchCreateRumMetricDefinitionsError' 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:
+--
+-- 'errorCode', 'batchCreateRumMetricDefinitionsError_errorCode' - The error code.
+--
+-- 'errorMessage', 'batchCreateRumMetricDefinitionsError_errorMessage' - The error message for this metric definition.
+--
+-- 'metricDefinition', 'batchCreateRumMetricDefinitionsError_metricDefinition' - The metric definition that caused this error.
+newBatchCreateRumMetricDefinitionsError ::
+  -- | 'errorCode'
+  Prelude.Text ->
+  -- | 'errorMessage'
+  Prelude.Text ->
+  -- | 'metricDefinition'
+  MetricDefinitionRequest ->
+  BatchCreateRumMetricDefinitionsError
+newBatchCreateRumMetricDefinitionsError
+  pErrorCode_
+  pErrorMessage_
+  pMetricDefinition_ =
+    BatchCreateRumMetricDefinitionsError'
+      { errorCode =
+          pErrorCode_,
+        errorMessage = pErrorMessage_,
+        metricDefinition = pMetricDefinition_
+      }
+
+-- | The error code.
+batchCreateRumMetricDefinitionsError_errorCode :: Lens.Lens' BatchCreateRumMetricDefinitionsError Prelude.Text
+batchCreateRumMetricDefinitionsError_errorCode = Lens.lens (\BatchCreateRumMetricDefinitionsError' {errorCode} -> errorCode) (\s@BatchCreateRumMetricDefinitionsError' {} a -> s {errorCode = a} :: BatchCreateRumMetricDefinitionsError)
+
+-- | The error message for this metric definition.
+batchCreateRumMetricDefinitionsError_errorMessage :: Lens.Lens' BatchCreateRumMetricDefinitionsError Prelude.Text
+batchCreateRumMetricDefinitionsError_errorMessage = Lens.lens (\BatchCreateRumMetricDefinitionsError' {errorMessage} -> errorMessage) (\s@BatchCreateRumMetricDefinitionsError' {} a -> s {errorMessage = a} :: BatchCreateRumMetricDefinitionsError)
+
+-- | The metric definition that caused this error.
+batchCreateRumMetricDefinitionsError_metricDefinition :: Lens.Lens' BatchCreateRumMetricDefinitionsError MetricDefinitionRequest
+batchCreateRumMetricDefinitionsError_metricDefinition = Lens.lens (\BatchCreateRumMetricDefinitionsError' {metricDefinition} -> metricDefinition) (\s@BatchCreateRumMetricDefinitionsError' {} a -> s {metricDefinition = a} :: BatchCreateRumMetricDefinitionsError)
+
+instance
+  Data.FromJSON
+    BatchCreateRumMetricDefinitionsError
+  where
+  parseJSON =
+    Data.withObject
+      "BatchCreateRumMetricDefinitionsError"
+      ( \x ->
+          BatchCreateRumMetricDefinitionsError'
+            Prelude.<$> (x Data..: "ErrorCode")
+            Prelude.<*> (x Data..: "ErrorMessage")
+            Prelude.<*> (x Data..: "MetricDefinition")
+      )
+
+instance
+  Prelude.Hashable
+    BatchCreateRumMetricDefinitionsError
+  where
+  hashWithSalt
+    _salt
+    BatchCreateRumMetricDefinitionsError' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorCode
+        `Prelude.hashWithSalt` errorMessage
+        `Prelude.hashWithSalt` metricDefinition
+
+instance
+  Prelude.NFData
+    BatchCreateRumMetricDefinitionsError
+  where
+  rnf BatchCreateRumMetricDefinitionsError' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf metricDefinition
diff --git a/gen/Amazonka/Rum/Types/BatchDeleteRumMetricDefinitionsError.hs b/gen/Amazonka/Rum/Types/BatchDeleteRumMetricDefinitionsError.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/BatchDeleteRumMetricDefinitionsError.hs
@@ -0,0 +1,120 @@
+{-# 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.Rum.Types.BatchDeleteRumMetricDefinitionsError
+-- 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.Rum.Types.BatchDeleteRumMetricDefinitionsError 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 structure that defines one error caused by a
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_BatchDeleteRumMetricsDefinitions.html BatchCreateRumMetricsDefinitions>
+-- operation.
+--
+-- /See:/ 'newBatchDeleteRumMetricDefinitionsError' smart constructor.
+data BatchDeleteRumMetricDefinitionsError = BatchDeleteRumMetricDefinitionsError'
+  { -- | The error code.
+    errorCode :: Prelude.Text,
+    -- | The error message for this metric definition.
+    errorMessage :: Prelude.Text,
+    -- | The ID of the metric definition that caused this error.
+    metricDefinitionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchDeleteRumMetricDefinitionsError' 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:
+--
+-- 'errorCode', 'batchDeleteRumMetricDefinitionsError_errorCode' - The error code.
+--
+-- 'errorMessage', 'batchDeleteRumMetricDefinitionsError_errorMessage' - The error message for this metric definition.
+--
+-- 'metricDefinitionId', 'batchDeleteRumMetricDefinitionsError_metricDefinitionId' - The ID of the metric definition that caused this error.
+newBatchDeleteRumMetricDefinitionsError ::
+  -- | 'errorCode'
+  Prelude.Text ->
+  -- | 'errorMessage'
+  Prelude.Text ->
+  -- | 'metricDefinitionId'
+  Prelude.Text ->
+  BatchDeleteRumMetricDefinitionsError
+newBatchDeleteRumMetricDefinitionsError
+  pErrorCode_
+  pErrorMessage_
+  pMetricDefinitionId_ =
+    BatchDeleteRumMetricDefinitionsError'
+      { errorCode =
+          pErrorCode_,
+        errorMessage = pErrorMessage_,
+        metricDefinitionId =
+          pMetricDefinitionId_
+      }
+
+-- | The error code.
+batchDeleteRumMetricDefinitionsError_errorCode :: Lens.Lens' BatchDeleteRumMetricDefinitionsError Prelude.Text
+batchDeleteRumMetricDefinitionsError_errorCode = Lens.lens (\BatchDeleteRumMetricDefinitionsError' {errorCode} -> errorCode) (\s@BatchDeleteRumMetricDefinitionsError' {} a -> s {errorCode = a} :: BatchDeleteRumMetricDefinitionsError)
+
+-- | The error message for this metric definition.
+batchDeleteRumMetricDefinitionsError_errorMessage :: Lens.Lens' BatchDeleteRumMetricDefinitionsError Prelude.Text
+batchDeleteRumMetricDefinitionsError_errorMessage = Lens.lens (\BatchDeleteRumMetricDefinitionsError' {errorMessage} -> errorMessage) (\s@BatchDeleteRumMetricDefinitionsError' {} a -> s {errorMessage = a} :: BatchDeleteRumMetricDefinitionsError)
+
+-- | The ID of the metric definition that caused this error.
+batchDeleteRumMetricDefinitionsError_metricDefinitionId :: Lens.Lens' BatchDeleteRumMetricDefinitionsError Prelude.Text
+batchDeleteRumMetricDefinitionsError_metricDefinitionId = Lens.lens (\BatchDeleteRumMetricDefinitionsError' {metricDefinitionId} -> metricDefinitionId) (\s@BatchDeleteRumMetricDefinitionsError' {} a -> s {metricDefinitionId = a} :: BatchDeleteRumMetricDefinitionsError)
+
+instance
+  Data.FromJSON
+    BatchDeleteRumMetricDefinitionsError
+  where
+  parseJSON =
+    Data.withObject
+      "BatchDeleteRumMetricDefinitionsError"
+      ( \x ->
+          BatchDeleteRumMetricDefinitionsError'
+            Prelude.<$> (x Data..: "ErrorCode")
+            Prelude.<*> (x Data..: "ErrorMessage")
+            Prelude.<*> (x Data..: "MetricDefinitionId")
+      )
+
+instance
+  Prelude.Hashable
+    BatchDeleteRumMetricDefinitionsError
+  where
+  hashWithSalt
+    _salt
+    BatchDeleteRumMetricDefinitionsError' {..} =
+      _salt
+        `Prelude.hashWithSalt` errorCode
+        `Prelude.hashWithSalt` errorMessage
+        `Prelude.hashWithSalt` metricDefinitionId
+
+instance
+  Prelude.NFData
+    BatchDeleteRumMetricDefinitionsError
+  where
+  rnf BatchDeleteRumMetricDefinitionsError' {..} =
+    Prelude.rnf errorCode
+      `Prelude.seq` Prelude.rnf errorMessage
+      `Prelude.seq` Prelude.rnf metricDefinitionId
diff --git a/gen/Amazonka/Rum/Types/CustomEvents.hs b/gen/Amazonka/Rum/Types/CustomEvents.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/CustomEvents.hs
@@ -0,0 +1,79 @@
+{-# 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.Rum.Types.CustomEvents
+-- 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.Rum.Types.CustomEvents 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
+import Amazonka.Rum.Types.CustomEventsStatus
+
+-- | A structure that contains information about custom events for this app
+-- monitor.
+--
+-- /See:/ 'newCustomEvents' smart constructor.
+data CustomEvents = CustomEvents'
+  { -- | Specifies whether this app monitor allows the web client to define and
+    -- send custom events. The default is for custom events to be @DISABLED@.
+    status :: Prelude.Maybe CustomEventsStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CustomEvents' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'status', 'customEvents_status' - Specifies whether this app monitor allows the web client to define and
+-- send custom events. The default is for custom events to be @DISABLED@.
+newCustomEvents ::
+  CustomEvents
+newCustomEvents =
+  CustomEvents' {status = Prelude.Nothing}
+
+-- | Specifies whether this app monitor allows the web client to define and
+-- send custom events. The default is for custom events to be @DISABLED@.
+customEvents_status :: Lens.Lens' CustomEvents (Prelude.Maybe CustomEventsStatus)
+customEvents_status = Lens.lens (\CustomEvents' {status} -> status) (\s@CustomEvents' {} a -> s {status = a} :: CustomEvents)
+
+instance Data.FromJSON CustomEvents where
+  parseJSON =
+    Data.withObject
+      "CustomEvents"
+      ( \x ->
+          CustomEvents' Prelude.<$> (x Data..:? "Status")
+      )
+
+instance Prelude.Hashable CustomEvents where
+  hashWithSalt _salt CustomEvents' {..} =
+    _salt `Prelude.hashWithSalt` status
+
+instance Prelude.NFData CustomEvents where
+  rnf CustomEvents' {..} = Prelude.rnf status
+
+instance Data.ToJSON CustomEvents where
+  toJSON CustomEvents' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("Status" Data..=) Prelude.<$> status]
+      )
diff --git a/gen/Amazonka/Rum/Types/CustomEventsStatus.hs b/gen/Amazonka/Rum/Types/CustomEventsStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/CustomEventsStatus.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.Rum.Types.CustomEventsStatus
+-- 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.Rum.Types.CustomEventsStatus
+  ( CustomEventsStatus
+      ( ..,
+        CustomEventsStatus_DISABLED,
+        CustomEventsStatus_ENABLED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype CustomEventsStatus = CustomEventsStatus'
+  { fromCustomEventsStatus ::
+      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 CustomEventsStatus_DISABLED :: CustomEventsStatus
+pattern CustomEventsStatus_DISABLED = CustomEventsStatus' "DISABLED"
+
+pattern CustomEventsStatus_ENABLED :: CustomEventsStatus
+pattern CustomEventsStatus_ENABLED = CustomEventsStatus' "ENABLED"
+
+{-# COMPLETE
+  CustomEventsStatus_DISABLED,
+  CustomEventsStatus_ENABLED,
+  CustomEventsStatus'
+  #-}
diff --git a/gen/Amazonka/Rum/Types/CwLog.hs b/gen/Amazonka/Rum/Types/CwLog.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/CwLog.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.Rum.Types.CwLog
+-- 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.Rum.Types.CwLog 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 structure that contains the information about whether the app monitor
+-- stores copies of the data that RUM collects in CloudWatch Logs. If it
+-- does, this structure also contains the name of the log group.
+--
+-- /See:/ 'newCwLog' smart constructor.
+data CwLog = CwLog'
+  { -- | Indicated whether the app monitor stores copies of the data that RUM
+    -- collects in CloudWatch Logs.
+    cwLogEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The name of the log group where the copies are stored.
+    cwLogGroup :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CwLog' 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:
+--
+-- 'cwLogEnabled', 'cwLog_cwLogEnabled' - Indicated whether the app monitor stores copies of the data that RUM
+-- collects in CloudWatch Logs.
+--
+-- 'cwLogGroup', 'cwLog_cwLogGroup' - The name of the log group where the copies are stored.
+newCwLog ::
+  CwLog
+newCwLog =
+  CwLog'
+    { cwLogEnabled = Prelude.Nothing,
+      cwLogGroup = Prelude.Nothing
+    }
+
+-- | Indicated whether the app monitor stores copies of the data that RUM
+-- collects in CloudWatch Logs.
+cwLog_cwLogEnabled :: Lens.Lens' CwLog (Prelude.Maybe Prelude.Bool)
+cwLog_cwLogEnabled = Lens.lens (\CwLog' {cwLogEnabled} -> cwLogEnabled) (\s@CwLog' {} a -> s {cwLogEnabled = a} :: CwLog)
+
+-- | The name of the log group where the copies are stored.
+cwLog_cwLogGroup :: Lens.Lens' CwLog (Prelude.Maybe Prelude.Text)
+cwLog_cwLogGroup = Lens.lens (\CwLog' {cwLogGroup} -> cwLogGroup) (\s@CwLog' {} a -> s {cwLogGroup = a} :: CwLog)
+
+instance Data.FromJSON CwLog where
+  parseJSON =
+    Data.withObject
+      "CwLog"
+      ( \x ->
+          CwLog'
+            Prelude.<$> (x Data..:? "CwLogEnabled")
+            Prelude.<*> (x Data..:? "CwLogGroup")
+      )
+
+instance Prelude.Hashable CwLog where
+  hashWithSalt _salt CwLog' {..} =
+    _salt
+      `Prelude.hashWithSalt` cwLogEnabled
+      `Prelude.hashWithSalt` cwLogGroup
+
+instance Prelude.NFData CwLog where
+  rnf CwLog' {..} =
+    Prelude.rnf cwLogEnabled
+      `Prelude.seq` Prelude.rnf cwLogGroup
diff --git a/gen/Amazonka/Rum/Types/DataStorage.hs b/gen/Amazonka/Rum/Types/DataStorage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/DataStorage.hs
@@ -0,0 +1,76 @@
+{-# 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.Rum.Types.DataStorage
+-- 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.Rum.Types.DataStorage 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
+import Amazonka.Rum.Types.CwLog
+
+-- | A structure that contains information about whether this app monitor
+-- stores a copy of the telemetry data that RUM collects using CloudWatch
+-- Logs.
+--
+-- /See:/ 'newDataStorage' smart constructor.
+data DataStorage = DataStorage'
+  { -- | A structure that contains the information about whether the app monitor
+    -- stores copies of the data that RUM collects in CloudWatch Logs. If it
+    -- does, this structure also contains the name of the log group.
+    cwLog :: Prelude.Maybe CwLog
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataStorage' 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:
+--
+-- 'cwLog', 'dataStorage_cwLog' - A structure that contains the information about whether the app monitor
+-- stores copies of the data that RUM collects in CloudWatch Logs. If it
+-- does, this structure also contains the name of the log group.
+newDataStorage ::
+  DataStorage
+newDataStorage =
+  DataStorage' {cwLog = Prelude.Nothing}
+
+-- | A structure that contains the information about whether the app monitor
+-- stores copies of the data that RUM collects in CloudWatch Logs. If it
+-- does, this structure also contains the name of the log group.
+dataStorage_cwLog :: Lens.Lens' DataStorage (Prelude.Maybe CwLog)
+dataStorage_cwLog = Lens.lens (\DataStorage' {cwLog} -> cwLog) (\s@DataStorage' {} a -> s {cwLog = a} :: DataStorage)
+
+instance Data.FromJSON DataStorage where
+  parseJSON =
+    Data.withObject
+      "DataStorage"
+      ( \x ->
+          DataStorage' Prelude.<$> (x Data..:? "CwLog")
+      )
+
+instance Prelude.Hashable DataStorage where
+  hashWithSalt _salt DataStorage' {..} =
+    _salt `Prelude.hashWithSalt` cwLog
+
+instance Prelude.NFData DataStorage where
+  rnf DataStorage' {..} = Prelude.rnf cwLog
diff --git a/gen/Amazonka/Rum/Types/MetricDefinition.hs b/gen/Amazonka/Rum/Types/MetricDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/MetricDefinition.hs
@@ -0,0 +1,171 @@
+{-# 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.Rum.Types.MetricDefinition
+-- 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.Rum.Types.MetricDefinition 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 structure that displays the definition of one extended metric that RUM
+-- sends to CloudWatch or CloudWatch Evidently. For more information, see
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-vended-metrics.html Additional metrics that you can send to CloudWatch and CloudWatch Evidently>.
+--
+-- /See:/ 'newMetricDefinition' smart constructor.
+data MetricDefinition = MetricDefinition'
+  { -- | This field is a map of field paths to dimension names. It defines the
+    -- dimensions to associate with this metric in CloudWatch The value of this
+    -- field is used only if the metric destination is @CloudWatch@. If the
+    -- metric destination is @Evidently@, the value of @DimensionKeys@ is
+    -- ignored.
+    dimensionKeys :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The pattern that defines the metric. RUM checks events that happen in a
+    -- user\'s session against the pattern, and events that match the pattern
+    -- are sent to the metric destination.
+    --
+    -- If the metrics destination is @CloudWatch@ and the event also matches a
+    -- value in @DimensionKeys@, then the metric is published with the
+    -- specified dimensions.
+    eventPattern :: Prelude.Maybe Prelude.Text,
+    -- | Use this field only if you are sending this metric to CloudWatch. It
+    -- defines the CloudWatch metric unit that this metric is measured in.
+    unitLabel :: Prelude.Maybe Prelude.Text,
+    -- | The field within the event object that the metric value is sourced from.
+    valueKey :: Prelude.Maybe Prelude.Text,
+    -- | The ID of this metric definition.
+    metricDefinitionId :: Prelude.Text,
+    -- | The name of the metric that is defined in this structure.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricDefinition' 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:
+--
+-- 'dimensionKeys', 'metricDefinition_dimensionKeys' - This field is a map of field paths to dimension names. It defines the
+-- dimensions to associate with this metric in CloudWatch The value of this
+-- field is used only if the metric destination is @CloudWatch@. If the
+-- metric destination is @Evidently@, the value of @DimensionKeys@ is
+-- ignored.
+--
+-- 'eventPattern', 'metricDefinition_eventPattern' - The pattern that defines the metric. RUM checks events that happen in a
+-- user\'s session against the pattern, and events that match the pattern
+-- are sent to the metric destination.
+--
+-- If the metrics destination is @CloudWatch@ and the event also matches a
+-- value in @DimensionKeys@, then the metric is published with the
+-- specified dimensions.
+--
+-- 'unitLabel', 'metricDefinition_unitLabel' - Use this field only if you are sending this metric to CloudWatch. It
+-- defines the CloudWatch metric unit that this metric is measured in.
+--
+-- 'valueKey', 'metricDefinition_valueKey' - The field within the event object that the metric value is sourced from.
+--
+-- 'metricDefinitionId', 'metricDefinition_metricDefinitionId' - The ID of this metric definition.
+--
+-- 'name', 'metricDefinition_name' - The name of the metric that is defined in this structure.
+newMetricDefinition ::
+  -- | 'metricDefinitionId'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  MetricDefinition
+newMetricDefinition pMetricDefinitionId_ pName_ =
+  MetricDefinition'
+    { dimensionKeys = Prelude.Nothing,
+      eventPattern = Prelude.Nothing,
+      unitLabel = Prelude.Nothing,
+      valueKey = Prelude.Nothing,
+      metricDefinitionId = pMetricDefinitionId_,
+      name = pName_
+    }
+
+-- | This field is a map of field paths to dimension names. It defines the
+-- dimensions to associate with this metric in CloudWatch The value of this
+-- field is used only if the metric destination is @CloudWatch@. If the
+-- metric destination is @Evidently@, the value of @DimensionKeys@ is
+-- ignored.
+metricDefinition_dimensionKeys :: Lens.Lens' MetricDefinition (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+metricDefinition_dimensionKeys = Lens.lens (\MetricDefinition' {dimensionKeys} -> dimensionKeys) (\s@MetricDefinition' {} a -> s {dimensionKeys = a} :: MetricDefinition) Prelude.. Lens.mapping Lens.coerced
+
+-- | The pattern that defines the metric. RUM checks events that happen in a
+-- user\'s session against the pattern, and events that match the pattern
+-- are sent to the metric destination.
+--
+-- If the metrics destination is @CloudWatch@ and the event also matches a
+-- value in @DimensionKeys@, then the metric is published with the
+-- specified dimensions.
+metricDefinition_eventPattern :: Lens.Lens' MetricDefinition (Prelude.Maybe Prelude.Text)
+metricDefinition_eventPattern = Lens.lens (\MetricDefinition' {eventPattern} -> eventPattern) (\s@MetricDefinition' {} a -> s {eventPattern = a} :: MetricDefinition)
+
+-- | Use this field only if you are sending this metric to CloudWatch. It
+-- defines the CloudWatch metric unit that this metric is measured in.
+metricDefinition_unitLabel :: Lens.Lens' MetricDefinition (Prelude.Maybe Prelude.Text)
+metricDefinition_unitLabel = Lens.lens (\MetricDefinition' {unitLabel} -> unitLabel) (\s@MetricDefinition' {} a -> s {unitLabel = a} :: MetricDefinition)
+
+-- | The field within the event object that the metric value is sourced from.
+metricDefinition_valueKey :: Lens.Lens' MetricDefinition (Prelude.Maybe Prelude.Text)
+metricDefinition_valueKey = Lens.lens (\MetricDefinition' {valueKey} -> valueKey) (\s@MetricDefinition' {} a -> s {valueKey = a} :: MetricDefinition)
+
+-- | The ID of this metric definition.
+metricDefinition_metricDefinitionId :: Lens.Lens' MetricDefinition Prelude.Text
+metricDefinition_metricDefinitionId = Lens.lens (\MetricDefinition' {metricDefinitionId} -> metricDefinitionId) (\s@MetricDefinition' {} a -> s {metricDefinitionId = a} :: MetricDefinition)
+
+-- | The name of the metric that is defined in this structure.
+metricDefinition_name :: Lens.Lens' MetricDefinition Prelude.Text
+metricDefinition_name = Lens.lens (\MetricDefinition' {name} -> name) (\s@MetricDefinition' {} a -> s {name = a} :: MetricDefinition)
+
+instance Data.FromJSON MetricDefinition where
+  parseJSON =
+    Data.withObject
+      "MetricDefinition"
+      ( \x ->
+          MetricDefinition'
+            Prelude.<$> (x Data..:? "DimensionKeys" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "EventPattern")
+            Prelude.<*> (x Data..:? "UnitLabel")
+            Prelude.<*> (x Data..:? "ValueKey")
+            Prelude.<*> (x Data..: "MetricDefinitionId")
+            Prelude.<*> (x Data..: "Name")
+      )
+
+instance Prelude.Hashable MetricDefinition where
+  hashWithSalt _salt MetricDefinition' {..} =
+    _salt
+      `Prelude.hashWithSalt` dimensionKeys
+      `Prelude.hashWithSalt` eventPattern
+      `Prelude.hashWithSalt` unitLabel
+      `Prelude.hashWithSalt` valueKey
+      `Prelude.hashWithSalt` metricDefinitionId
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData MetricDefinition where
+  rnf MetricDefinition' {..} =
+    Prelude.rnf dimensionKeys
+      `Prelude.seq` Prelude.rnf eventPattern
+      `Prelude.seq` Prelude.rnf unitLabel
+      `Prelude.seq` Prelude.rnf valueKey
+      `Prelude.seq` Prelude.rnf metricDefinitionId
+      `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/Rum/Types/MetricDefinitionRequest.hs b/gen/Amazonka/Rum/Types/MetricDefinitionRequest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/MetricDefinitionRequest.hs
@@ -0,0 +1,390 @@
+{-# 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.Rum.Types.MetricDefinitionRequest
+-- 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.Rum.Types.MetricDefinitionRequest 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
+
+-- | Use this structure to define one extended metric that RUM will send to
+-- CloudWatch or CloudWatch Evidently. For more information, see
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-vended-metrics.html Additional metrics that you can send to CloudWatch and CloudWatch Evidently>.
+--
+-- Only certain combinations of values for @Name@, @ValueKey@, and
+-- @EventPattern@ are valid. In addition to what is displayed in the list
+-- below, the @EventPattern@ can also include information used by the
+-- @DimensionKeys@ field.
+--
+-- -   If @Name@ is @PerformanceNavigationDuration@, then @ValueKey@must be
+--     @event_details.duration@ and the @EventPattern@ must include
+--     @{\"event_type\":[\"com.amazon.rum.performance_navigation_event\"]}@
+--
+-- -   If @Name@ is @PerformanceResourceDuration@, then @ValueKey@must be
+--     @event_details.duration@ and the @EventPattern@ must include
+--     @{\"event_type\":[\"com.amazon.rum.performance_resource_event\"]}@
+--
+-- -   If @Name@ is @NavigationSatisfiedTransaction@, then @ValueKey@must
+--     be null and the @EventPattern@ must include
+--     @{ \"event_type\": [\"com.amazon.rum.performance_navigation_event\"], \"event_details\": { \"duration\": [{ \"numeric\": [\">\",2000] }] } }@
+--
+-- -   If @Name@ is @NavigationToleratedTransaction@, then @ValueKey@must
+--     be null and the @EventPattern@ must include
+--     @{ \"event_type\": [\"com.amazon.rum.performance_navigation_event\"], \"event_details\": { \"duration\": [{ \"numeric\": [\">=\",2000,\"\<\"8000] }] } }@
+--
+-- -   If @Name@ is @NavigationFrustratedTransaction@, then @ValueKey@must
+--     be null and the @EventPattern@ must include
+--     @{ \"event_type\": [\"com.amazon.rum.performance_navigation_event\"], \"event_details\": { \"duration\": [{ \"numeric\": [\">=\",8000] }] } }@
+--
+-- -   If @Name@ is @WebVitalsCumulativeLayoutShift@, then @ValueKey@must
+--     be @event_details.value@ and the @EventPattern@ must include
+--     @{\"event_type\":[\"com.amazon.rum.cumulative_layout_shift_event\"]}@
+--
+-- -   If @Name@ is @WebVitalsFirstInputDelay@, then @ValueKey@must be
+--     @event_details.value@ and the @EventPattern@ must include
+--     @{\"event_type\":[\"com.amazon.rum.first_input_delay_event\"]}@
+--
+-- -   If @Name@ is @WebVitalsLargestContentfulPaint@, then @ValueKey@must
+--     be @event_details.value@ and the @EventPattern@ must include
+--     @{\"event_type\":[\"com.amazon.rum.largest_contentful_paint_event\"]}@
+--
+-- -   If @Name@ is @JsErrorCount@, then @ValueKey@must be null and the
+--     @EventPattern@ must include
+--     @{\"event_type\":[\"com.amazon.rum.js_error_event\"]}@
+--
+-- -   If @Name@ is @HttpErrorCount@, then @ValueKey@must be null and the
+--     @EventPattern@ must include
+--     @{\"event_type\":[\"com.amazon.rum.http_event\"]}@
+--
+-- -   If @Name@ is @SessionCount@, then @ValueKey@must be null and the
+--     @EventPattern@ must include
+--     @{\"event_type\":[\"com.amazon.rum.session_start_event\"]}@
+--
+-- /See:/ 'newMetricDefinitionRequest' smart constructor.
+data MetricDefinitionRequest = MetricDefinitionRequest'
+  { -- | Use this field only if you are sending the metric to CloudWatch.
+    --
+    -- This field is a map of field paths to dimension names. It defines the
+    -- dimensions to associate with this metric in CloudWatch. Valid values for
+    -- the entries in this field are the following:
+    --
+    -- -   @\"metadata.pageId\": \"PageId\"@
+    --
+    -- -   @\"metadata.browserName\": \"BrowserName\"@
+    --
+    -- -   @\"metadata.deviceType\": \"DeviceType\"@
+    --
+    -- -   @\"metadata.osName\": \"OSName\"@
+    --
+    -- -   @\"metadata.countryCode\": \"CountryCode\"@
+    --
+    -- -   @\"event_details.fileType\": \"FileType\"@
+    --
+    -- All dimensions listed in this field must also be included in
+    -- @EventPattern@.
+    dimensionKeys :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The pattern that defines the metric, specified as a JSON object. RUM
+    -- checks events that happen in a user\'s session against the pattern, and
+    -- events that match the pattern are sent to the metric destination.
+    --
+    -- When you define extended metrics, the metric definition is not valid if
+    -- @EventPattern@ is omitted.
+    --
+    -- Example event patterns:
+    --
+    -- -   @\'{ \"event_type\": [\"com.amazon.rum.js_error_event\"], \"metadata\": { \"browserName\": [ \"Chrome\", \"Safari\" ], } }\'@
+    --
+    -- -   @\'{ \"event_type\": [\"com.amazon.rum.performance_navigation_event\"], \"metadata\": { \"browserName\": [ \"Chrome\", \"Firefox\" ] }, \"event_details\": { \"duration\": [{ \"numeric\": [ \"\<\", 2000 ] }] } }\'@
+    --
+    -- -   @\'{ \"event_type\": [\"com.amazon.rum.performance_navigation_event\"], \"metadata\": { \"browserName\": [ \"Chrome\", \"Safari\" ], \"countryCode\": [ \"US\" ] }, \"event_details\": { \"duration\": [{ \"numeric\": [ \">=\", 2000, \"\<\", 8000 ] }] } }\'@
+    --
+    -- If the metrics destination\' is @CloudWatch@ and the event also matches
+    -- a value in @DimensionKeys@, then the metric is published with the
+    -- specified dimensions.
+    eventPattern :: Prelude.Maybe Prelude.Text,
+    -- | The CloudWatch metric unit to use for this metric. If you omit this
+    -- field, the metric is recorded with no unit.
+    unitLabel :: Prelude.Maybe Prelude.Text,
+    -- | The field within the event object that the metric value is sourced from.
+    --
+    -- If you omit this field, a hardcoded value of 1 is pushed as the metric
+    -- value. This is useful if you just want to count the number of events
+    -- that the filter catches.
+    --
+    -- If this metric is sent to CloudWatch Evidently, this field will be
+    -- passed to Evidently raw and Evidently will handle data extraction from
+    -- the event.
+    valueKey :: Prelude.Maybe Prelude.Text,
+    -- | The name for the metric that is defined in this structure. Valid values
+    -- are the following:
+    --
+    -- -   @PerformanceNavigationDuration@
+    --
+    -- -   @PerformanceResourceDuration @
+    --
+    -- -   @NavigationSatisfiedTransaction@
+    --
+    -- -   @NavigationToleratedTransaction@
+    --
+    -- -   @NavigationFrustratedTransaction@
+    --
+    -- -   @WebVitalsCumulativeLayoutShift@
+    --
+    -- -   @WebVitalsFirstInputDelay@
+    --
+    -- -   @WebVitalsLargestContentfulPaint@
+    --
+    -- -   @JsErrorCount@
+    --
+    -- -   @HttpErrorCount@
+    --
+    -- -   @SessionCount@
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricDefinitionRequest' 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:
+--
+-- 'dimensionKeys', 'metricDefinitionRequest_dimensionKeys' - Use this field only if you are sending the metric to CloudWatch.
+--
+-- This field is a map of field paths to dimension names. It defines the
+-- dimensions to associate with this metric in CloudWatch. Valid values for
+-- the entries in this field are the following:
+--
+-- -   @\"metadata.pageId\": \"PageId\"@
+--
+-- -   @\"metadata.browserName\": \"BrowserName\"@
+--
+-- -   @\"metadata.deviceType\": \"DeviceType\"@
+--
+-- -   @\"metadata.osName\": \"OSName\"@
+--
+-- -   @\"metadata.countryCode\": \"CountryCode\"@
+--
+-- -   @\"event_details.fileType\": \"FileType\"@
+--
+-- All dimensions listed in this field must also be included in
+-- @EventPattern@.
+--
+-- 'eventPattern', 'metricDefinitionRequest_eventPattern' - The pattern that defines the metric, specified as a JSON object. RUM
+-- checks events that happen in a user\'s session against the pattern, and
+-- events that match the pattern are sent to the metric destination.
+--
+-- When you define extended metrics, the metric definition is not valid if
+-- @EventPattern@ is omitted.
+--
+-- Example event patterns:
+--
+-- -   @\'{ \"event_type\": [\"com.amazon.rum.js_error_event\"], \"metadata\": { \"browserName\": [ \"Chrome\", \"Safari\" ], } }\'@
+--
+-- -   @\'{ \"event_type\": [\"com.amazon.rum.performance_navigation_event\"], \"metadata\": { \"browserName\": [ \"Chrome\", \"Firefox\" ] }, \"event_details\": { \"duration\": [{ \"numeric\": [ \"\<\", 2000 ] }] } }\'@
+--
+-- -   @\'{ \"event_type\": [\"com.amazon.rum.performance_navigation_event\"], \"metadata\": { \"browserName\": [ \"Chrome\", \"Safari\" ], \"countryCode\": [ \"US\" ] }, \"event_details\": { \"duration\": [{ \"numeric\": [ \">=\", 2000, \"\<\", 8000 ] }] } }\'@
+--
+-- If the metrics destination\' is @CloudWatch@ and the event also matches
+-- a value in @DimensionKeys@, then the metric is published with the
+-- specified dimensions.
+--
+-- 'unitLabel', 'metricDefinitionRequest_unitLabel' - The CloudWatch metric unit to use for this metric. If you omit this
+-- field, the metric is recorded with no unit.
+--
+-- 'valueKey', 'metricDefinitionRequest_valueKey' - The field within the event object that the metric value is sourced from.
+--
+-- If you omit this field, a hardcoded value of 1 is pushed as the metric
+-- value. This is useful if you just want to count the number of events
+-- that the filter catches.
+--
+-- If this metric is sent to CloudWatch Evidently, this field will be
+-- passed to Evidently raw and Evidently will handle data extraction from
+-- the event.
+--
+-- 'name', 'metricDefinitionRequest_name' - The name for the metric that is defined in this structure. Valid values
+-- are the following:
+--
+-- -   @PerformanceNavigationDuration@
+--
+-- -   @PerformanceResourceDuration @
+--
+-- -   @NavigationSatisfiedTransaction@
+--
+-- -   @NavigationToleratedTransaction@
+--
+-- -   @NavigationFrustratedTransaction@
+--
+-- -   @WebVitalsCumulativeLayoutShift@
+--
+-- -   @WebVitalsFirstInputDelay@
+--
+-- -   @WebVitalsLargestContentfulPaint@
+--
+-- -   @JsErrorCount@
+--
+-- -   @HttpErrorCount@
+--
+-- -   @SessionCount@
+newMetricDefinitionRequest ::
+  -- | 'name'
+  Prelude.Text ->
+  MetricDefinitionRequest
+newMetricDefinitionRequest pName_ =
+  MetricDefinitionRequest'
+    { dimensionKeys =
+        Prelude.Nothing,
+      eventPattern = Prelude.Nothing,
+      unitLabel = Prelude.Nothing,
+      valueKey = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | Use this field only if you are sending the metric to CloudWatch.
+--
+-- This field is a map of field paths to dimension names. It defines the
+-- dimensions to associate with this metric in CloudWatch. Valid values for
+-- the entries in this field are the following:
+--
+-- -   @\"metadata.pageId\": \"PageId\"@
+--
+-- -   @\"metadata.browserName\": \"BrowserName\"@
+--
+-- -   @\"metadata.deviceType\": \"DeviceType\"@
+--
+-- -   @\"metadata.osName\": \"OSName\"@
+--
+-- -   @\"metadata.countryCode\": \"CountryCode\"@
+--
+-- -   @\"event_details.fileType\": \"FileType\"@
+--
+-- All dimensions listed in this field must also be included in
+-- @EventPattern@.
+metricDefinitionRequest_dimensionKeys :: Lens.Lens' MetricDefinitionRequest (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+metricDefinitionRequest_dimensionKeys = Lens.lens (\MetricDefinitionRequest' {dimensionKeys} -> dimensionKeys) (\s@MetricDefinitionRequest' {} a -> s {dimensionKeys = a} :: MetricDefinitionRequest) Prelude.. Lens.mapping Lens.coerced
+
+-- | The pattern that defines the metric, specified as a JSON object. RUM
+-- checks events that happen in a user\'s session against the pattern, and
+-- events that match the pattern are sent to the metric destination.
+--
+-- When you define extended metrics, the metric definition is not valid if
+-- @EventPattern@ is omitted.
+--
+-- Example event patterns:
+--
+-- -   @\'{ \"event_type\": [\"com.amazon.rum.js_error_event\"], \"metadata\": { \"browserName\": [ \"Chrome\", \"Safari\" ], } }\'@
+--
+-- -   @\'{ \"event_type\": [\"com.amazon.rum.performance_navigation_event\"], \"metadata\": { \"browserName\": [ \"Chrome\", \"Firefox\" ] }, \"event_details\": { \"duration\": [{ \"numeric\": [ \"\<\", 2000 ] }] } }\'@
+--
+-- -   @\'{ \"event_type\": [\"com.amazon.rum.performance_navigation_event\"], \"metadata\": { \"browserName\": [ \"Chrome\", \"Safari\" ], \"countryCode\": [ \"US\" ] }, \"event_details\": { \"duration\": [{ \"numeric\": [ \">=\", 2000, \"\<\", 8000 ] }] } }\'@
+--
+-- If the metrics destination\' is @CloudWatch@ and the event also matches
+-- a value in @DimensionKeys@, then the metric is published with the
+-- specified dimensions.
+metricDefinitionRequest_eventPattern :: Lens.Lens' MetricDefinitionRequest (Prelude.Maybe Prelude.Text)
+metricDefinitionRequest_eventPattern = Lens.lens (\MetricDefinitionRequest' {eventPattern} -> eventPattern) (\s@MetricDefinitionRequest' {} a -> s {eventPattern = a} :: MetricDefinitionRequest)
+
+-- | The CloudWatch metric unit to use for this metric. If you omit this
+-- field, the metric is recorded with no unit.
+metricDefinitionRequest_unitLabel :: Lens.Lens' MetricDefinitionRequest (Prelude.Maybe Prelude.Text)
+metricDefinitionRequest_unitLabel = Lens.lens (\MetricDefinitionRequest' {unitLabel} -> unitLabel) (\s@MetricDefinitionRequest' {} a -> s {unitLabel = a} :: MetricDefinitionRequest)
+
+-- | The field within the event object that the metric value is sourced from.
+--
+-- If you omit this field, a hardcoded value of 1 is pushed as the metric
+-- value. This is useful if you just want to count the number of events
+-- that the filter catches.
+--
+-- If this metric is sent to CloudWatch Evidently, this field will be
+-- passed to Evidently raw and Evidently will handle data extraction from
+-- the event.
+metricDefinitionRequest_valueKey :: Lens.Lens' MetricDefinitionRequest (Prelude.Maybe Prelude.Text)
+metricDefinitionRequest_valueKey = Lens.lens (\MetricDefinitionRequest' {valueKey} -> valueKey) (\s@MetricDefinitionRequest' {} a -> s {valueKey = a} :: MetricDefinitionRequest)
+
+-- | The name for the metric that is defined in this structure. Valid values
+-- are the following:
+--
+-- -   @PerformanceNavigationDuration@
+--
+-- -   @PerformanceResourceDuration @
+--
+-- -   @NavigationSatisfiedTransaction@
+--
+-- -   @NavigationToleratedTransaction@
+--
+-- -   @NavigationFrustratedTransaction@
+--
+-- -   @WebVitalsCumulativeLayoutShift@
+--
+-- -   @WebVitalsFirstInputDelay@
+--
+-- -   @WebVitalsLargestContentfulPaint@
+--
+-- -   @JsErrorCount@
+--
+-- -   @HttpErrorCount@
+--
+-- -   @SessionCount@
+metricDefinitionRequest_name :: Lens.Lens' MetricDefinitionRequest Prelude.Text
+metricDefinitionRequest_name = Lens.lens (\MetricDefinitionRequest' {name} -> name) (\s@MetricDefinitionRequest' {} a -> s {name = a} :: MetricDefinitionRequest)
+
+instance Data.FromJSON MetricDefinitionRequest where
+  parseJSON =
+    Data.withObject
+      "MetricDefinitionRequest"
+      ( \x ->
+          MetricDefinitionRequest'
+            Prelude.<$> (x Data..:? "DimensionKeys" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "EventPattern")
+            Prelude.<*> (x Data..:? "UnitLabel")
+            Prelude.<*> (x Data..:? "ValueKey")
+            Prelude.<*> (x Data..: "Name")
+      )
+
+instance Prelude.Hashable MetricDefinitionRequest where
+  hashWithSalt _salt MetricDefinitionRequest' {..} =
+    _salt
+      `Prelude.hashWithSalt` dimensionKeys
+      `Prelude.hashWithSalt` eventPattern
+      `Prelude.hashWithSalt` unitLabel
+      `Prelude.hashWithSalt` valueKey
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData MetricDefinitionRequest where
+  rnf MetricDefinitionRequest' {..} =
+    Prelude.rnf dimensionKeys
+      `Prelude.seq` Prelude.rnf eventPattern
+      `Prelude.seq` Prelude.rnf unitLabel
+      `Prelude.seq` Prelude.rnf valueKey
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON MetricDefinitionRequest where
+  toJSON MetricDefinitionRequest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DimensionKeys" Data..=) Prelude.<$> dimensionKeys,
+            ("EventPattern" Data..=) Prelude.<$> eventPattern,
+            ("UnitLabel" Data..=) Prelude.<$> unitLabel,
+            ("ValueKey" Data..=) Prelude.<$> valueKey,
+            Prelude.Just ("Name" Data..= name)
+          ]
+      )
diff --git a/gen/Amazonka/Rum/Types/MetricDestination.hs b/gen/Amazonka/Rum/Types/MetricDestination.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/MetricDestination.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.Rum.Types.MetricDestination
+-- 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.Rum.Types.MetricDestination
+  ( MetricDestination
+      ( ..,
+        MetricDestination_CloudWatch,
+        MetricDestination_Evidently
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype MetricDestination = MetricDestination'
+  { fromMetricDestination ::
+      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 MetricDestination_CloudWatch :: MetricDestination
+pattern MetricDestination_CloudWatch = MetricDestination' "CloudWatch"
+
+pattern MetricDestination_Evidently :: MetricDestination
+pattern MetricDestination_Evidently = MetricDestination' "Evidently"
+
+{-# COMPLETE
+  MetricDestination_CloudWatch,
+  MetricDestination_Evidently,
+  MetricDestination'
+  #-}
diff --git a/gen/Amazonka/Rum/Types/MetricDestinationSummary.hs b/gen/Amazonka/Rum/Types/MetricDestinationSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/MetricDestinationSummary.hs
@@ -0,0 +1,108 @@
+{-# 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.Rum.Types.MetricDestinationSummary
+-- 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.Rum.Types.MetricDestinationSummary 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
+import Amazonka.Rum.Types.MetricDestination
+
+-- | A structure that displays information about one destination that
+-- CloudWatch RUM sends extended metrics to.
+--
+-- /See:/ 'newMetricDestinationSummary' smart constructor.
+data MetricDestinationSummary = MetricDestinationSummary'
+  { -- | Specifies whether the destination is @CloudWatch@ or @Evidently@.
+    destination :: Prelude.Maybe MetricDestination,
+    -- | If the destination is @Evidently@, this specifies the ARN of the
+    -- Evidently experiment that receives the metrics.
+    destinationArn :: Prelude.Maybe Prelude.Text,
+    -- | This field appears only when the destination is @Evidently@. It
+    -- specifies the ARN of the IAM role that is used to write to the Evidently
+    -- experiment that receives the metrics.
+    iamRoleArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricDestinationSummary' 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:
+--
+-- 'destination', 'metricDestinationSummary_destination' - Specifies whether the destination is @CloudWatch@ or @Evidently@.
+--
+-- 'destinationArn', 'metricDestinationSummary_destinationArn' - If the destination is @Evidently@, this specifies the ARN of the
+-- Evidently experiment that receives the metrics.
+--
+-- 'iamRoleArn', 'metricDestinationSummary_iamRoleArn' - This field appears only when the destination is @Evidently@. It
+-- specifies the ARN of the IAM role that is used to write to the Evidently
+-- experiment that receives the metrics.
+newMetricDestinationSummary ::
+  MetricDestinationSummary
+newMetricDestinationSummary =
+  MetricDestinationSummary'
+    { destination =
+        Prelude.Nothing,
+      destinationArn = Prelude.Nothing,
+      iamRoleArn = Prelude.Nothing
+    }
+
+-- | Specifies whether the destination is @CloudWatch@ or @Evidently@.
+metricDestinationSummary_destination :: Lens.Lens' MetricDestinationSummary (Prelude.Maybe MetricDestination)
+metricDestinationSummary_destination = Lens.lens (\MetricDestinationSummary' {destination} -> destination) (\s@MetricDestinationSummary' {} a -> s {destination = a} :: MetricDestinationSummary)
+
+-- | If the destination is @Evidently@, this specifies the ARN of the
+-- Evidently experiment that receives the metrics.
+metricDestinationSummary_destinationArn :: Lens.Lens' MetricDestinationSummary (Prelude.Maybe Prelude.Text)
+metricDestinationSummary_destinationArn = Lens.lens (\MetricDestinationSummary' {destinationArn} -> destinationArn) (\s@MetricDestinationSummary' {} a -> s {destinationArn = a} :: MetricDestinationSummary)
+
+-- | This field appears only when the destination is @Evidently@. It
+-- specifies the ARN of the IAM role that is used to write to the Evidently
+-- experiment that receives the metrics.
+metricDestinationSummary_iamRoleArn :: Lens.Lens' MetricDestinationSummary (Prelude.Maybe Prelude.Text)
+metricDestinationSummary_iamRoleArn = Lens.lens (\MetricDestinationSummary' {iamRoleArn} -> iamRoleArn) (\s@MetricDestinationSummary' {} a -> s {iamRoleArn = a} :: MetricDestinationSummary)
+
+instance Data.FromJSON MetricDestinationSummary where
+  parseJSON =
+    Data.withObject
+      "MetricDestinationSummary"
+      ( \x ->
+          MetricDestinationSummary'
+            Prelude.<$> (x Data..:? "Destination")
+            Prelude.<*> (x Data..:? "DestinationArn")
+            Prelude.<*> (x Data..:? "IamRoleArn")
+      )
+
+instance Prelude.Hashable MetricDestinationSummary where
+  hashWithSalt _salt MetricDestinationSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` destination
+      `Prelude.hashWithSalt` destinationArn
+      `Prelude.hashWithSalt` iamRoleArn
+
+instance Prelude.NFData MetricDestinationSummary where
+  rnf MetricDestinationSummary' {..} =
+    Prelude.rnf destination
+      `Prelude.seq` Prelude.rnf destinationArn
+      `Prelude.seq` Prelude.rnf iamRoleArn
diff --git a/gen/Amazonka/Rum/Types/QueryFilter.hs b/gen/Amazonka/Rum/Types/QueryFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/QueryFilter.hs
@@ -0,0 +1,109 @@
+{-# 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.Rum.Types.QueryFilter
+-- 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.Rum.Types.QueryFilter 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 structure that defines a key and values that you can use to filter the
+-- results. The only performance events that are returned are those that
+-- have values matching the ones that you specify in one of your
+-- @QueryFilter@ structures.
+--
+-- For example, you could specify @Browser@ as the @Name@ and specify
+-- @Chrome,Firefox@ as the @Values@ to return events generated only from
+-- those browsers.
+--
+-- Specifying @Invert@ as the @Name@ works as a \"not equal to\" filter.
+-- For example, specify @Invert@ as the @Name@ and specify @Chrome@ as the
+-- value to return all events except events from user sessions with the
+-- Chrome browser.
+--
+-- /See:/ 'newQueryFilter' smart constructor.
+data QueryFilter = QueryFilter'
+  { -- | The name of a key to search for. The filter returns only the events that
+    -- match the @Name@ and @Values@ that you specify.
+    --
+    -- Valid values for @Name@ are @Browser@ | @Device@ | @Country@ | @Page@ |
+    -- @OS@ | @EventType@ | @Invert@
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The values of the @Name@ that are to be be included in the returned
+    -- results.
+    values :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'QueryFilter' 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:
+--
+-- 'name', 'queryFilter_name' - The name of a key to search for. The filter returns only the events that
+-- match the @Name@ and @Values@ that you specify.
+--
+-- Valid values for @Name@ are @Browser@ | @Device@ | @Country@ | @Page@ |
+-- @OS@ | @EventType@ | @Invert@
+--
+-- 'values', 'queryFilter_values' - The values of the @Name@ that are to be be included in the returned
+-- results.
+newQueryFilter ::
+  QueryFilter
+newQueryFilter =
+  QueryFilter'
+    { name = Prelude.Nothing,
+      values = Prelude.Nothing
+    }
+
+-- | The name of a key to search for. The filter returns only the events that
+-- match the @Name@ and @Values@ that you specify.
+--
+-- Valid values for @Name@ are @Browser@ | @Device@ | @Country@ | @Page@ |
+-- @OS@ | @EventType@ | @Invert@
+queryFilter_name :: Lens.Lens' QueryFilter (Prelude.Maybe Prelude.Text)
+queryFilter_name = Lens.lens (\QueryFilter' {name} -> name) (\s@QueryFilter' {} a -> s {name = a} :: QueryFilter)
+
+-- | The values of the @Name@ that are to be be included in the returned
+-- results.
+queryFilter_values :: Lens.Lens' QueryFilter (Prelude.Maybe [Prelude.Text])
+queryFilter_values = Lens.lens (\QueryFilter' {values} -> values) (\s@QueryFilter' {} a -> s {values = a} :: QueryFilter) Prelude.. Lens.mapping Lens.coerced
+
+instance Prelude.Hashable QueryFilter where
+  hashWithSalt _salt QueryFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` values
+
+instance Prelude.NFData QueryFilter where
+  rnf QueryFilter' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf values
+
+instance Data.ToJSON QueryFilter where
+  toJSON QueryFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Name" Data..=) Prelude.<$> name,
+            ("Values" Data..=) Prelude.<$> values
+          ]
+      )
diff --git a/gen/Amazonka/Rum/Types/RumEvent.hs b/gen/Amazonka/Rum/Types/RumEvent.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/RumEvent.hs
@@ -0,0 +1,140 @@
+{-# 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.Rum.Types.RumEvent
+-- 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.Rum.Types.RumEvent 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 structure that contains the information for one performance event that
+-- RUM collects from a user session with your application.
+--
+-- /See:/ 'newRumEvent' smart constructor.
+data RumEvent = RumEvent'
+  { -- | Metadata about this event, which contains a JSON serialization of the
+    -- identity of the user for this session. The user information comes from
+    -- information such as the HTTP user-agent request header and document
+    -- interface.
+    metadata :: Prelude.Maybe Prelude.Text,
+    -- | A string containing details about the event.
+    details :: Prelude.Text,
+    -- | A unique ID for this event.
+    id :: Prelude.Text,
+    -- | The exact time that this event occurred.
+    timestamp :: Data.POSIX,
+    -- | The JSON schema that denotes the type of event this is, such as a page
+    -- load or a new session.
+    type' :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RumEvent' 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:
+--
+-- 'metadata', 'rumEvent_metadata' - Metadata about this event, which contains a JSON serialization of the
+-- identity of the user for this session. The user information comes from
+-- information such as the HTTP user-agent request header and document
+-- interface.
+--
+-- 'details', 'rumEvent_details' - A string containing details about the event.
+--
+-- 'id', 'rumEvent_id' - A unique ID for this event.
+--
+-- 'timestamp', 'rumEvent_timestamp' - The exact time that this event occurred.
+--
+-- 'type'', 'rumEvent_type' - The JSON schema that denotes the type of event this is, such as a page
+-- load or a new session.
+newRumEvent ::
+  -- | 'details'
+  Prelude.Text ->
+  -- | 'id'
+  Prelude.Text ->
+  -- | 'timestamp'
+  Prelude.UTCTime ->
+  -- | 'type''
+  Prelude.Text ->
+  RumEvent
+newRumEvent pDetails_ pId_ pTimestamp_ pType_ =
+  RumEvent'
+    { metadata = Prelude.Nothing,
+      details = pDetails_,
+      id = pId_,
+      timestamp = Data._Time Lens.# pTimestamp_,
+      type' = pType_
+    }
+
+-- | Metadata about this event, which contains a JSON serialization of the
+-- identity of the user for this session. The user information comes from
+-- information such as the HTTP user-agent request header and document
+-- interface.
+rumEvent_metadata :: Lens.Lens' RumEvent (Prelude.Maybe Prelude.Text)
+rumEvent_metadata = Lens.lens (\RumEvent' {metadata} -> metadata) (\s@RumEvent' {} a -> s {metadata = a} :: RumEvent)
+
+-- | A string containing details about the event.
+rumEvent_details :: Lens.Lens' RumEvent Prelude.Text
+rumEvent_details = Lens.lens (\RumEvent' {details} -> details) (\s@RumEvent' {} a -> s {details = a} :: RumEvent)
+
+-- | A unique ID for this event.
+rumEvent_id :: Lens.Lens' RumEvent Prelude.Text
+rumEvent_id = Lens.lens (\RumEvent' {id} -> id) (\s@RumEvent' {} a -> s {id = a} :: RumEvent)
+
+-- | The exact time that this event occurred.
+rumEvent_timestamp :: Lens.Lens' RumEvent Prelude.UTCTime
+rumEvent_timestamp = Lens.lens (\RumEvent' {timestamp} -> timestamp) (\s@RumEvent' {} a -> s {timestamp = a} :: RumEvent) Prelude.. Data._Time
+
+-- | The JSON schema that denotes the type of event this is, such as a page
+-- load or a new session.
+rumEvent_type :: Lens.Lens' RumEvent Prelude.Text
+rumEvent_type = Lens.lens (\RumEvent' {type'} -> type') (\s@RumEvent' {} a -> s {type' = a} :: RumEvent)
+
+instance Prelude.Hashable RumEvent where
+  hashWithSalt _salt RumEvent' {..} =
+    _salt
+      `Prelude.hashWithSalt` metadata
+      `Prelude.hashWithSalt` details
+      `Prelude.hashWithSalt` id
+      `Prelude.hashWithSalt` timestamp
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData RumEvent where
+  rnf RumEvent' {..} =
+    Prelude.rnf metadata
+      `Prelude.seq` Prelude.rnf details
+      `Prelude.seq` Prelude.rnf id
+      `Prelude.seq` Prelude.rnf timestamp
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON RumEvent where
+  toJSON RumEvent' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("metadata" Data..=) Prelude.<$> metadata,
+            Prelude.Just ("details" Data..= details),
+            Prelude.Just ("id" Data..= id),
+            Prelude.Just ("timestamp" Data..= timestamp),
+            Prelude.Just ("type" Data..= type')
+          ]
+      )
diff --git a/gen/Amazonka/Rum/Types/StateEnum.hs b/gen/Amazonka/Rum/Types/StateEnum.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/StateEnum.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.Rum.Types.StateEnum
+-- 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.Rum.Types.StateEnum
+  ( StateEnum
+      ( ..,
+        StateEnum_ACTIVE,
+        StateEnum_CREATED,
+        StateEnum_DELETING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype StateEnum = StateEnum'
+  { fromStateEnum ::
+      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 StateEnum_ACTIVE :: StateEnum
+pattern StateEnum_ACTIVE = StateEnum' "ACTIVE"
+
+pattern StateEnum_CREATED :: StateEnum
+pattern StateEnum_CREATED = StateEnum' "CREATED"
+
+pattern StateEnum_DELETING :: StateEnum
+pattern StateEnum_DELETING = StateEnum' "DELETING"
+
+{-# COMPLETE
+  StateEnum_ACTIVE,
+  StateEnum_CREATED,
+  StateEnum_DELETING,
+  StateEnum'
+  #-}
diff --git a/gen/Amazonka/Rum/Types/Telemetry.hs b/gen/Amazonka/Rum/Types/Telemetry.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/Telemetry.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.Rum.Types.Telemetry
+-- 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.Rum.Types.Telemetry
+  ( Telemetry
+      ( ..,
+        Telemetry_Errors,
+        Telemetry_Http,
+        Telemetry_Performance
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Telemetry = Telemetry'
+  { fromTelemetry ::
+      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 Telemetry_Errors :: Telemetry
+pattern Telemetry_Errors = Telemetry' "errors"
+
+pattern Telemetry_Http :: Telemetry
+pattern Telemetry_Http = Telemetry' "http"
+
+pattern Telemetry_Performance :: Telemetry
+pattern Telemetry_Performance = Telemetry' "performance"
+
+{-# COMPLETE
+  Telemetry_Errors,
+  Telemetry_Http,
+  Telemetry_Performance,
+  Telemetry'
+  #-}
diff --git a/gen/Amazonka/Rum/Types/TimeRange.hs b/gen/Amazonka/Rum/Types/TimeRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/TimeRange.hs
@@ -0,0 +1,91 @@
+{-# 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.Rum.Types.TimeRange
+-- 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.Rum.Types.TimeRange 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 structure that defines the time range that you want to retrieve
+-- results from.
+--
+-- /See:/ 'newTimeRange' smart constructor.
+data TimeRange = TimeRange'
+  { -- | The end of the time range to retrieve performance events from. If you
+    -- omit this, the time range extends to the time that this operation is
+    -- performed.
+    before :: Prelude.Maybe Prelude.Integer,
+    -- | The beginning of the time range to retrieve performance events from.
+    after :: Prelude.Integer
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TimeRange' 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:
+--
+-- 'before', 'timeRange_before' - The end of the time range to retrieve performance events from. If you
+-- omit this, the time range extends to the time that this operation is
+-- performed.
+--
+-- 'after', 'timeRange_after' - The beginning of the time range to retrieve performance events from.
+newTimeRange ::
+  -- | 'after'
+  Prelude.Integer ->
+  TimeRange
+newTimeRange pAfter_ =
+  TimeRange'
+    { before = Prelude.Nothing,
+      after = pAfter_
+    }
+
+-- | The end of the time range to retrieve performance events from. If you
+-- omit this, the time range extends to the time that this operation is
+-- performed.
+timeRange_before :: Lens.Lens' TimeRange (Prelude.Maybe Prelude.Integer)
+timeRange_before = Lens.lens (\TimeRange' {before} -> before) (\s@TimeRange' {} a -> s {before = a} :: TimeRange)
+
+-- | The beginning of the time range to retrieve performance events from.
+timeRange_after :: Lens.Lens' TimeRange Prelude.Integer
+timeRange_after = Lens.lens (\TimeRange' {after} -> after) (\s@TimeRange' {} a -> s {after = a} :: TimeRange)
+
+instance Prelude.Hashable TimeRange where
+  hashWithSalt _salt TimeRange' {..} =
+    _salt
+      `Prelude.hashWithSalt` before
+      `Prelude.hashWithSalt` after
+
+instance Prelude.NFData TimeRange where
+  rnf TimeRange' {..} =
+    Prelude.rnf before `Prelude.seq` Prelude.rnf after
+
+instance Data.ToJSON TimeRange where
+  toJSON TimeRange' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Before" Data..=) Prelude.<$> before,
+            Prelude.Just ("After" Data..= after)
+          ]
+      )
diff --git a/gen/Amazonka/Rum/Types/UserDetails.hs b/gen/Amazonka/Rum/Types/UserDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/Types/UserDetails.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Rum.Types.UserDetails
+-- 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.Rum.Types.UserDetails 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 structure that contains information about the user session that this
+-- batch of events was collected from.
+--
+-- /See:/ 'newUserDetails' smart constructor.
+data UserDetails = UserDetails'
+  { -- | The session ID that the performance events are from.
+    sessionId :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the user for this user session. This ID is generated by RUM
+    -- and does not include any personally identifiable information about the
+    -- user.
+    userId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UserDetails' 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:
+--
+-- 'sessionId', 'userDetails_sessionId' - The session ID that the performance events are from.
+--
+-- 'userId', 'userDetails_userId' - The ID of the user for this user session. This ID is generated by RUM
+-- and does not include any personally identifiable information about the
+-- user.
+newUserDetails ::
+  UserDetails
+newUserDetails =
+  UserDetails'
+    { sessionId = Prelude.Nothing,
+      userId = Prelude.Nothing
+    }
+
+-- | The session ID that the performance events are from.
+userDetails_sessionId :: Lens.Lens' UserDetails (Prelude.Maybe Prelude.Text)
+userDetails_sessionId = Lens.lens (\UserDetails' {sessionId} -> sessionId) (\s@UserDetails' {} a -> s {sessionId = a} :: UserDetails)
+
+-- | The ID of the user for this user session. This ID is generated by RUM
+-- and does not include any personally identifiable information about the
+-- user.
+userDetails_userId :: Lens.Lens' UserDetails (Prelude.Maybe Prelude.Text)
+userDetails_userId = Lens.lens (\UserDetails' {userId} -> userId) (\s@UserDetails' {} a -> s {userId = a} :: UserDetails)
+
+instance Prelude.Hashable UserDetails where
+  hashWithSalt _salt UserDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` sessionId
+      `Prelude.hashWithSalt` userId
+
+instance Prelude.NFData UserDetails where
+  rnf UserDetails' {..} =
+    Prelude.rnf sessionId
+      `Prelude.seq` Prelude.rnf userId
+
+instance Data.ToJSON UserDetails where
+  toJSON UserDetails' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("sessionId" Data..=) Prelude.<$> sessionId,
+            ("userId" Data..=) Prelude.<$> userId
+          ]
+      )
diff --git a/gen/Amazonka/Rum/UntagResource.hs b/gen/Amazonka/Rum/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/UntagResource.hs
@@ -0,0 +1,161 @@
+{-# 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.Rum.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)
+--
+-- Removes one or more tags from the specified resource.
+module Amazonka.Rum.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The ARN of the CloudWatch RUM resource that you\'re removing tags from.
+    resourceArn :: Prelude.Text,
+    -- | The list of tag keys to remove from the 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 ARN of the CloudWatch RUM resource that you\'re removing tags from.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - The list of tag keys to remove from the resource.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The ARN of the CloudWatch RUM resource that you\'re removing tags from.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | The list of tag keys to remove from the 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/Rum/UpdateAppMonitor.hs b/gen/Amazonka/Rum/UpdateAppMonitor.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/UpdateAppMonitor.hs
@@ -0,0 +1,271 @@
+{-# 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.Rum.UpdateAppMonitor
+-- 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 the configuration of an existing app monitor. When you use this
+-- operation, only the parts of the app monitor configuration that you
+-- specify in this operation are changed. For any parameters that you omit,
+-- the existing values are kept.
+--
+-- You can\'t use this operation to change the tags of an existing app
+-- monitor. To change the tags of an existing app monitor, use
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_TagResource.html TagResource>.
+--
+-- To create a new app monitor, use
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_CreateAppMonitor.html CreateAppMonitor>.
+--
+-- After you update an app monitor, sign in to the CloudWatch RUM console
+-- to get the updated JavaScript code snippet to add to your web
+-- application. For more information, see
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-find-code-snippet.html How do I find a code snippet that I\'ve already generated?>
+module Amazonka.Rum.UpdateAppMonitor
+  ( -- * Creating a Request
+    UpdateAppMonitor (..),
+    newUpdateAppMonitor,
+
+    -- * Request Lenses
+    updateAppMonitor_appMonitorConfiguration,
+    updateAppMonitor_customEvents,
+    updateAppMonitor_cwLogEnabled,
+    updateAppMonitor_domain,
+    updateAppMonitor_name,
+
+    -- * Destructuring the Response
+    UpdateAppMonitorResponse (..),
+    newUpdateAppMonitorResponse,
+
+    -- * Response Lenses
+    updateAppMonitorResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newUpdateAppMonitor' smart constructor.
+data UpdateAppMonitor = UpdateAppMonitor'
+  { -- | A structure that contains much of the configuration data for the app
+    -- monitor. If you are using Amazon Cognito for authorization, you must
+    -- include this structure in your request, and it must include the ID of
+    -- the Amazon Cognito identity pool to use for authorization. If you don\'t
+    -- include @AppMonitorConfiguration@, you must set up your own
+    -- authorization method. For more information, see
+    -- <https://docs.aws.amazon.com/monitoring/CloudWatch-RUM-get-started-authorization.html Authorize your application to send data to Amazon Web Services>.
+    appMonitorConfiguration :: Prelude.Maybe AppMonitorConfiguration,
+    -- | Specifies whether this app monitor allows the web client to define and
+    -- send custom events. The default is for custom events to be @DISABLED@.
+    --
+    -- For more information about custom events, see
+    -- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-custom-events.html Send custom events>.
+    customEvents :: Prelude.Maybe CustomEvents,
+    -- | Data collected by RUM is kept by RUM for 30 days and then deleted. This
+    -- parameter specifies whether RUM sends a copy of this telemetry data to
+    -- Amazon CloudWatch Logs in your account. This enables you to keep the
+    -- telemetry data for more than 30 days, but it does incur Amazon
+    -- CloudWatch Logs charges.
+    cwLogEnabled :: Prelude.Maybe Prelude.Bool,
+    -- | The top-level internet domain name for which your application has
+    -- administrative authority.
+    domain :: Prelude.Maybe Prelude.Text,
+    -- | The name of the app monitor to update.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateAppMonitor' 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:
+--
+-- 'appMonitorConfiguration', 'updateAppMonitor_appMonitorConfiguration' - A structure that contains much of the configuration data for the app
+-- monitor. If you are using Amazon Cognito for authorization, you must
+-- include this structure in your request, and it must include the ID of
+-- the Amazon Cognito identity pool to use for authorization. If you don\'t
+-- include @AppMonitorConfiguration@, you must set up your own
+-- authorization method. For more information, see
+-- <https://docs.aws.amazon.com/monitoring/CloudWatch-RUM-get-started-authorization.html Authorize your application to send data to Amazon Web Services>.
+--
+-- 'customEvents', 'updateAppMonitor_customEvents' - Specifies whether this app monitor allows the web client to define and
+-- send custom events. The default is for custom events to be @DISABLED@.
+--
+-- For more information about custom events, see
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-custom-events.html Send custom events>.
+--
+-- 'cwLogEnabled', 'updateAppMonitor_cwLogEnabled' - Data collected by RUM is kept by RUM for 30 days and then deleted. This
+-- parameter specifies whether RUM sends a copy of this telemetry data to
+-- Amazon CloudWatch Logs in your account. This enables you to keep the
+-- telemetry data for more than 30 days, but it does incur Amazon
+-- CloudWatch Logs charges.
+--
+-- 'domain', 'updateAppMonitor_domain' - The top-level internet domain name for which your application has
+-- administrative authority.
+--
+-- 'name', 'updateAppMonitor_name' - The name of the app monitor to update.
+newUpdateAppMonitor ::
+  -- | 'name'
+  Prelude.Text ->
+  UpdateAppMonitor
+newUpdateAppMonitor pName_ =
+  UpdateAppMonitor'
+    { appMonitorConfiguration =
+        Prelude.Nothing,
+      customEvents = Prelude.Nothing,
+      cwLogEnabled = Prelude.Nothing,
+      domain = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | A structure that contains much of the configuration data for the app
+-- monitor. If you are using Amazon Cognito for authorization, you must
+-- include this structure in your request, and it must include the ID of
+-- the Amazon Cognito identity pool to use for authorization. If you don\'t
+-- include @AppMonitorConfiguration@, you must set up your own
+-- authorization method. For more information, see
+-- <https://docs.aws.amazon.com/monitoring/CloudWatch-RUM-get-started-authorization.html Authorize your application to send data to Amazon Web Services>.
+updateAppMonitor_appMonitorConfiguration :: Lens.Lens' UpdateAppMonitor (Prelude.Maybe AppMonitorConfiguration)
+updateAppMonitor_appMonitorConfiguration = Lens.lens (\UpdateAppMonitor' {appMonitorConfiguration} -> appMonitorConfiguration) (\s@UpdateAppMonitor' {} a -> s {appMonitorConfiguration = a} :: UpdateAppMonitor)
+
+-- | Specifies whether this app monitor allows the web client to define and
+-- send custom events. The default is for custom events to be @DISABLED@.
+--
+-- For more information about custom events, see
+-- <https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-custom-events.html Send custom events>.
+updateAppMonitor_customEvents :: Lens.Lens' UpdateAppMonitor (Prelude.Maybe CustomEvents)
+updateAppMonitor_customEvents = Lens.lens (\UpdateAppMonitor' {customEvents} -> customEvents) (\s@UpdateAppMonitor' {} a -> s {customEvents = a} :: UpdateAppMonitor)
+
+-- | Data collected by RUM is kept by RUM for 30 days and then deleted. This
+-- parameter specifies whether RUM sends a copy of this telemetry data to
+-- Amazon CloudWatch Logs in your account. This enables you to keep the
+-- telemetry data for more than 30 days, but it does incur Amazon
+-- CloudWatch Logs charges.
+updateAppMonitor_cwLogEnabled :: Lens.Lens' UpdateAppMonitor (Prelude.Maybe Prelude.Bool)
+updateAppMonitor_cwLogEnabled = Lens.lens (\UpdateAppMonitor' {cwLogEnabled} -> cwLogEnabled) (\s@UpdateAppMonitor' {} a -> s {cwLogEnabled = a} :: UpdateAppMonitor)
+
+-- | The top-level internet domain name for which your application has
+-- administrative authority.
+updateAppMonitor_domain :: Lens.Lens' UpdateAppMonitor (Prelude.Maybe Prelude.Text)
+updateAppMonitor_domain = Lens.lens (\UpdateAppMonitor' {domain} -> domain) (\s@UpdateAppMonitor' {} a -> s {domain = a} :: UpdateAppMonitor)
+
+-- | The name of the app monitor to update.
+updateAppMonitor_name :: Lens.Lens' UpdateAppMonitor Prelude.Text
+updateAppMonitor_name = Lens.lens (\UpdateAppMonitor' {name} -> name) (\s@UpdateAppMonitor' {} a -> s {name = a} :: UpdateAppMonitor)
+
+instance Core.AWSRequest UpdateAppMonitor where
+  type
+    AWSResponse UpdateAppMonitor =
+      UpdateAppMonitorResponse
+  request overrides =
+    Request.patchJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateAppMonitorResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateAppMonitor where
+  hashWithSalt _salt UpdateAppMonitor' {..} =
+    _salt
+      `Prelude.hashWithSalt` appMonitorConfiguration
+      `Prelude.hashWithSalt` customEvents
+      `Prelude.hashWithSalt` cwLogEnabled
+      `Prelude.hashWithSalt` domain
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData UpdateAppMonitor where
+  rnf UpdateAppMonitor' {..} =
+    Prelude.rnf appMonitorConfiguration
+      `Prelude.seq` Prelude.rnf customEvents
+      `Prelude.seq` Prelude.rnf cwLogEnabled
+      `Prelude.seq` Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToHeaders UpdateAppMonitor where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateAppMonitor where
+  toJSON UpdateAppMonitor' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AppMonitorConfiguration" Data..=)
+              Prelude.<$> appMonitorConfiguration,
+            ("CustomEvents" Data..=) Prelude.<$> customEvents,
+            ("CwLogEnabled" Data..=) Prelude.<$> cwLogEnabled,
+            ("Domain" Data..=) Prelude.<$> domain
+          ]
+      )
+
+instance Data.ToPath UpdateAppMonitor where
+  toPath UpdateAppMonitor' {..} =
+    Prelude.mconcat ["/appmonitor/", Data.toBS name]
+
+instance Data.ToQuery UpdateAppMonitor where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateAppMonitorResponse' smart constructor.
+data UpdateAppMonitorResponse = UpdateAppMonitorResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateAppMonitorResponse' 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', 'updateAppMonitorResponse_httpStatus' - The response's http status code.
+newUpdateAppMonitorResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateAppMonitorResponse
+newUpdateAppMonitorResponse pHttpStatus_ =
+  UpdateAppMonitorResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+updateAppMonitorResponse_httpStatus :: Lens.Lens' UpdateAppMonitorResponse Prelude.Int
+updateAppMonitorResponse_httpStatus = Lens.lens (\UpdateAppMonitorResponse' {httpStatus} -> httpStatus) (\s@UpdateAppMonitorResponse' {} a -> s {httpStatus = a} :: UpdateAppMonitorResponse)
+
+instance Prelude.NFData UpdateAppMonitorResponse where
+  rnf UpdateAppMonitorResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/UpdateRumMetricDefinition.hs b/gen/Amazonka/Rum/UpdateRumMetricDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/UpdateRumMetricDefinition.hs
@@ -0,0 +1,262 @@
+{-# 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.Rum.UpdateRumMetricDefinition
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Modifies one existing metric definition for CloudWatch RUM extended
+-- metrics. For more information about extended metrics, see
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_BatchCreateRumMetricsDefinitions.html BatchCreateRumMetricsDefinitions>.
+module Amazonka.Rum.UpdateRumMetricDefinition
+  ( -- * Creating a Request
+    UpdateRumMetricDefinition (..),
+    newUpdateRumMetricDefinition,
+
+    -- * Request Lenses
+    updateRumMetricDefinition_destinationArn,
+    updateRumMetricDefinition_appMonitorName,
+    updateRumMetricDefinition_destination,
+    updateRumMetricDefinition_metricDefinition,
+    updateRumMetricDefinition_metricDefinitionId,
+
+    -- * Destructuring the Response
+    UpdateRumMetricDefinitionResponse (..),
+    newUpdateRumMetricDefinitionResponse,
+
+    -- * Response Lenses
+    updateRumMetricDefinitionResponse_httpStatus,
+  )
+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
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.Rum.Types
+
+-- | /See:/ 'newUpdateRumMetricDefinition' smart constructor.
+data UpdateRumMetricDefinition = UpdateRumMetricDefinition'
+  { -- | This parameter is required if @Destination@ is @Evidently@. If
+    -- @Destination@ is @CloudWatch@, do not use this parameter.
+    --
+    -- This parameter specifies the ARN of the Evidently experiment that is to
+    -- receive the metrics. You must have already defined this experiment as a
+    -- valid destination. For more information, see
+    -- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_PutRumMetricsDestination.html PutRumMetricsDestination>.
+    destinationArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the CloudWatch RUM app monitor that sends these metrics.
+    appMonitorName :: Prelude.Text,
+    -- | The destination to send the metrics to. Valid values are @CloudWatch@
+    -- and @Evidently@. If you specify @Evidently@, you must also specify the
+    -- ARN of the CloudWatchEvidently experiment that will receive the metrics
+    -- and an IAM role that has permission to write to the experiment.
+    destination :: MetricDestination,
+    -- | A structure that contains the new definition that you want to use for
+    -- this metric.
+    metricDefinition :: MetricDefinitionRequest,
+    -- | The ID of the metric definition to update.
+    metricDefinitionId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateRumMetricDefinition' 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:
+--
+-- 'destinationArn', 'updateRumMetricDefinition_destinationArn' - This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter.
+--
+-- This parameter specifies the ARN of the Evidently experiment that is to
+-- receive the metrics. You must have already defined this experiment as a
+-- valid destination. For more information, see
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_PutRumMetricsDestination.html PutRumMetricsDestination>.
+--
+-- 'appMonitorName', 'updateRumMetricDefinition_appMonitorName' - The name of the CloudWatch RUM app monitor that sends these metrics.
+--
+-- 'destination', 'updateRumMetricDefinition_destination' - The destination to send the metrics to. Valid values are @CloudWatch@
+-- and @Evidently@. If you specify @Evidently@, you must also specify the
+-- ARN of the CloudWatchEvidently experiment that will receive the metrics
+-- and an IAM role that has permission to write to the experiment.
+--
+-- 'metricDefinition', 'updateRumMetricDefinition_metricDefinition' - A structure that contains the new definition that you want to use for
+-- this metric.
+--
+-- 'metricDefinitionId', 'updateRumMetricDefinition_metricDefinitionId' - The ID of the metric definition to update.
+newUpdateRumMetricDefinition ::
+  -- | 'appMonitorName'
+  Prelude.Text ->
+  -- | 'destination'
+  MetricDestination ->
+  -- | 'metricDefinition'
+  MetricDefinitionRequest ->
+  -- | 'metricDefinitionId'
+  Prelude.Text ->
+  UpdateRumMetricDefinition
+newUpdateRumMetricDefinition
+  pAppMonitorName_
+  pDestination_
+  pMetricDefinition_
+  pMetricDefinitionId_ =
+    UpdateRumMetricDefinition'
+      { destinationArn =
+          Prelude.Nothing,
+        appMonitorName = pAppMonitorName_,
+        destination = pDestination_,
+        metricDefinition = pMetricDefinition_,
+        metricDefinitionId = pMetricDefinitionId_
+      }
+
+-- | This parameter is required if @Destination@ is @Evidently@. If
+-- @Destination@ is @CloudWatch@, do not use this parameter.
+--
+-- This parameter specifies the ARN of the Evidently experiment that is to
+-- receive the metrics. You must have already defined this experiment as a
+-- valid destination. For more information, see
+-- <https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_PutRumMetricsDestination.html PutRumMetricsDestination>.
+updateRumMetricDefinition_destinationArn :: Lens.Lens' UpdateRumMetricDefinition (Prelude.Maybe Prelude.Text)
+updateRumMetricDefinition_destinationArn = Lens.lens (\UpdateRumMetricDefinition' {destinationArn} -> destinationArn) (\s@UpdateRumMetricDefinition' {} a -> s {destinationArn = a} :: UpdateRumMetricDefinition)
+
+-- | The name of the CloudWatch RUM app monitor that sends these metrics.
+updateRumMetricDefinition_appMonitorName :: Lens.Lens' UpdateRumMetricDefinition Prelude.Text
+updateRumMetricDefinition_appMonitorName = Lens.lens (\UpdateRumMetricDefinition' {appMonitorName} -> appMonitorName) (\s@UpdateRumMetricDefinition' {} a -> s {appMonitorName = a} :: UpdateRumMetricDefinition)
+
+-- | The destination to send the metrics to. Valid values are @CloudWatch@
+-- and @Evidently@. If you specify @Evidently@, you must also specify the
+-- ARN of the CloudWatchEvidently experiment that will receive the metrics
+-- and an IAM role that has permission to write to the experiment.
+updateRumMetricDefinition_destination :: Lens.Lens' UpdateRumMetricDefinition MetricDestination
+updateRumMetricDefinition_destination = Lens.lens (\UpdateRumMetricDefinition' {destination} -> destination) (\s@UpdateRumMetricDefinition' {} a -> s {destination = a} :: UpdateRumMetricDefinition)
+
+-- | A structure that contains the new definition that you want to use for
+-- this metric.
+updateRumMetricDefinition_metricDefinition :: Lens.Lens' UpdateRumMetricDefinition MetricDefinitionRequest
+updateRumMetricDefinition_metricDefinition = Lens.lens (\UpdateRumMetricDefinition' {metricDefinition} -> metricDefinition) (\s@UpdateRumMetricDefinition' {} a -> s {metricDefinition = a} :: UpdateRumMetricDefinition)
+
+-- | The ID of the metric definition to update.
+updateRumMetricDefinition_metricDefinitionId :: Lens.Lens' UpdateRumMetricDefinition Prelude.Text
+updateRumMetricDefinition_metricDefinitionId = Lens.lens (\UpdateRumMetricDefinition' {metricDefinitionId} -> metricDefinitionId) (\s@UpdateRumMetricDefinition' {} a -> s {metricDefinitionId = a} :: UpdateRumMetricDefinition)
+
+instance Core.AWSRequest UpdateRumMetricDefinition where
+  type
+    AWSResponse UpdateRumMetricDefinition =
+      UpdateRumMetricDefinitionResponse
+  request overrides =
+    Request.patchJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UpdateRumMetricDefinitionResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateRumMetricDefinition where
+  hashWithSalt _salt UpdateRumMetricDefinition' {..} =
+    _salt
+      `Prelude.hashWithSalt` destinationArn
+      `Prelude.hashWithSalt` appMonitorName
+      `Prelude.hashWithSalt` destination
+      `Prelude.hashWithSalt` metricDefinition
+      `Prelude.hashWithSalt` metricDefinitionId
+
+instance Prelude.NFData UpdateRumMetricDefinition where
+  rnf UpdateRumMetricDefinition' {..} =
+    Prelude.rnf destinationArn
+      `Prelude.seq` Prelude.rnf appMonitorName
+      `Prelude.seq` Prelude.rnf destination
+      `Prelude.seq` Prelude.rnf metricDefinition
+      `Prelude.seq` Prelude.rnf metricDefinitionId
+
+instance Data.ToHeaders UpdateRumMetricDefinition where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateRumMetricDefinition where
+  toJSON UpdateRumMetricDefinition' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DestinationArn" Data..=)
+              Prelude.<$> destinationArn,
+            Prelude.Just ("Destination" Data..= destination),
+            Prelude.Just
+              ("MetricDefinition" Data..= metricDefinition),
+            Prelude.Just
+              ("MetricDefinitionId" Data..= metricDefinitionId)
+          ]
+      )
+
+instance Data.ToPath UpdateRumMetricDefinition where
+  toPath UpdateRumMetricDefinition' {..} =
+    Prelude.mconcat
+      [ "/rummetrics/",
+        Data.toBS appMonitorName,
+        "/metrics"
+      ]
+
+instance Data.ToQuery UpdateRumMetricDefinition where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateRumMetricDefinitionResponse' smart constructor.
+data UpdateRumMetricDefinitionResponse = UpdateRumMetricDefinitionResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateRumMetricDefinitionResponse' 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', 'updateRumMetricDefinitionResponse_httpStatus' - The response's http status code.
+newUpdateRumMetricDefinitionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateRumMetricDefinitionResponse
+newUpdateRumMetricDefinitionResponse pHttpStatus_ =
+  UpdateRumMetricDefinitionResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+updateRumMetricDefinitionResponse_httpStatus :: Lens.Lens' UpdateRumMetricDefinitionResponse Prelude.Int
+updateRumMetricDefinitionResponse_httpStatus = Lens.lens (\UpdateRumMetricDefinitionResponse' {httpStatus} -> httpStatus) (\s@UpdateRumMetricDefinitionResponse' {} a -> s {httpStatus = a} :: UpdateRumMetricDefinitionResponse)
+
+instance
+  Prelude.NFData
+    UpdateRumMetricDefinitionResponse
+  where
+  rnf UpdateRumMetricDefinitionResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Rum/Waiters.hs b/gen/Amazonka/Rum/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Rum/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.Rum.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.Rum.Waiters 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
+import Amazonka.Rum.Lens
+import Amazonka.Rum.Types
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.Rum
+import Test.Amazonka.Rum.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "Rum"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/Rum.hs b/test/Test/Amazonka/Gen/Rum.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/Rum.hs
@@ -0,0 +1,378 @@
+{-# 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.Rum
+-- 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.Rum where
+
+import Amazonka.Rum
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.Prelude
+import Test.Amazonka.Rum.Internal
+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"
+--         [ requestBatchCreateRumMetricDefinitions $
+--             newBatchCreateRumMetricDefinitions
+--
+--         , requestBatchDeleteRumMetricDefinitions $
+--             newBatchDeleteRumMetricDefinitions
+--
+--         , requestBatchGetRumMetricDefinitions $
+--             newBatchGetRumMetricDefinitions
+--
+--         , requestCreateAppMonitor $
+--             newCreateAppMonitor
+--
+--         , requestDeleteAppMonitor $
+--             newDeleteAppMonitor
+--
+--         , requestDeleteRumMetricsDestination $
+--             newDeleteRumMetricsDestination
+--
+--         , requestGetAppMonitor $
+--             newGetAppMonitor
+--
+--         , requestGetAppMonitorData $
+--             newGetAppMonitorData
+--
+--         , requestListAppMonitors $
+--             newListAppMonitors
+--
+--         , requestListRumMetricsDestinations $
+--             newListRumMetricsDestinations
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestPutRumEvents $
+--             newPutRumEvents
+--
+--         , requestPutRumMetricsDestination $
+--             newPutRumMetricsDestination
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateAppMonitor $
+--             newUpdateAppMonitor
+--
+--         , requestUpdateRumMetricDefinition $
+--             newUpdateRumMetricDefinition
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseBatchCreateRumMetricDefinitions $
+--             newBatchCreateRumMetricDefinitionsResponse
+--
+--         , responseBatchDeleteRumMetricDefinitions $
+--             newBatchDeleteRumMetricDefinitionsResponse
+--
+--         , responseBatchGetRumMetricDefinitions $
+--             newBatchGetRumMetricDefinitionsResponse
+--
+--         , responseCreateAppMonitor $
+--             newCreateAppMonitorResponse
+--
+--         , responseDeleteAppMonitor $
+--             newDeleteAppMonitorResponse
+--
+--         , responseDeleteRumMetricsDestination $
+--             newDeleteRumMetricsDestinationResponse
+--
+--         , responseGetAppMonitor $
+--             newGetAppMonitorResponse
+--
+--         , responseGetAppMonitorData $
+--             newGetAppMonitorDataResponse
+--
+--         , responseListAppMonitors $
+--             newListAppMonitorsResponse
+--
+--         , responseListRumMetricsDestinations $
+--             newListRumMetricsDestinationsResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responsePutRumEvents $
+--             newPutRumEventsResponse
+--
+--         , responsePutRumMetricsDestination $
+--             newPutRumMetricsDestinationResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateAppMonitor $
+--             newUpdateAppMonitorResponse
+--
+--         , responseUpdateRumMetricDefinition $
+--             newUpdateRumMetricDefinitionResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestBatchCreateRumMetricDefinitions :: BatchCreateRumMetricDefinitions -> TestTree
+requestBatchCreateRumMetricDefinitions =
+  req
+    "BatchCreateRumMetricDefinitions"
+    "fixture/BatchCreateRumMetricDefinitions.yaml"
+
+requestBatchDeleteRumMetricDefinitions :: BatchDeleteRumMetricDefinitions -> TestTree
+requestBatchDeleteRumMetricDefinitions =
+  req
+    "BatchDeleteRumMetricDefinitions"
+    "fixture/BatchDeleteRumMetricDefinitions.yaml"
+
+requestBatchGetRumMetricDefinitions :: BatchGetRumMetricDefinitions -> TestTree
+requestBatchGetRumMetricDefinitions =
+  req
+    "BatchGetRumMetricDefinitions"
+    "fixture/BatchGetRumMetricDefinitions.yaml"
+
+requestCreateAppMonitor :: CreateAppMonitor -> TestTree
+requestCreateAppMonitor =
+  req
+    "CreateAppMonitor"
+    "fixture/CreateAppMonitor.yaml"
+
+requestDeleteAppMonitor :: DeleteAppMonitor -> TestTree
+requestDeleteAppMonitor =
+  req
+    "DeleteAppMonitor"
+    "fixture/DeleteAppMonitor.yaml"
+
+requestDeleteRumMetricsDestination :: DeleteRumMetricsDestination -> TestTree
+requestDeleteRumMetricsDestination =
+  req
+    "DeleteRumMetricsDestination"
+    "fixture/DeleteRumMetricsDestination.yaml"
+
+requestGetAppMonitor :: GetAppMonitor -> TestTree
+requestGetAppMonitor =
+  req
+    "GetAppMonitor"
+    "fixture/GetAppMonitor.yaml"
+
+requestGetAppMonitorData :: GetAppMonitorData -> TestTree
+requestGetAppMonitorData =
+  req
+    "GetAppMonitorData"
+    "fixture/GetAppMonitorData.yaml"
+
+requestListAppMonitors :: ListAppMonitors -> TestTree
+requestListAppMonitors =
+  req
+    "ListAppMonitors"
+    "fixture/ListAppMonitors.yaml"
+
+requestListRumMetricsDestinations :: ListRumMetricsDestinations -> TestTree
+requestListRumMetricsDestinations =
+  req
+    "ListRumMetricsDestinations"
+    "fixture/ListRumMetricsDestinations.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestPutRumEvents :: PutRumEvents -> TestTree
+requestPutRumEvents =
+  req
+    "PutRumEvents"
+    "fixture/PutRumEvents.yaml"
+
+requestPutRumMetricsDestination :: PutRumMetricsDestination -> TestTree
+requestPutRumMetricsDestination =
+  req
+    "PutRumMetricsDestination"
+    "fixture/PutRumMetricsDestination.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateAppMonitor :: UpdateAppMonitor -> TestTree
+requestUpdateAppMonitor =
+  req
+    "UpdateAppMonitor"
+    "fixture/UpdateAppMonitor.yaml"
+
+requestUpdateRumMetricDefinition :: UpdateRumMetricDefinition -> TestTree
+requestUpdateRumMetricDefinition =
+  req
+    "UpdateRumMetricDefinition"
+    "fixture/UpdateRumMetricDefinition.yaml"
+
+-- Responses
+
+responseBatchCreateRumMetricDefinitions :: BatchCreateRumMetricDefinitionsResponse -> TestTree
+responseBatchCreateRumMetricDefinitions =
+  res
+    "BatchCreateRumMetricDefinitionsResponse"
+    "fixture/BatchCreateRumMetricDefinitionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchCreateRumMetricDefinitions)
+
+responseBatchDeleteRumMetricDefinitions :: BatchDeleteRumMetricDefinitionsResponse -> TestTree
+responseBatchDeleteRumMetricDefinitions =
+  res
+    "BatchDeleteRumMetricDefinitionsResponse"
+    "fixture/BatchDeleteRumMetricDefinitionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchDeleteRumMetricDefinitions)
+
+responseBatchGetRumMetricDefinitions :: BatchGetRumMetricDefinitionsResponse -> TestTree
+responseBatchGetRumMetricDefinitions =
+  res
+    "BatchGetRumMetricDefinitionsResponse"
+    "fixture/BatchGetRumMetricDefinitionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy BatchGetRumMetricDefinitions)
+
+responseCreateAppMonitor :: CreateAppMonitorResponse -> TestTree
+responseCreateAppMonitor =
+  res
+    "CreateAppMonitorResponse"
+    "fixture/CreateAppMonitorResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateAppMonitor)
+
+responseDeleteAppMonitor :: DeleteAppMonitorResponse -> TestTree
+responseDeleteAppMonitor =
+  res
+    "DeleteAppMonitorResponse"
+    "fixture/DeleteAppMonitorResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteAppMonitor)
+
+responseDeleteRumMetricsDestination :: DeleteRumMetricsDestinationResponse -> TestTree
+responseDeleteRumMetricsDestination =
+  res
+    "DeleteRumMetricsDestinationResponse"
+    "fixture/DeleteRumMetricsDestinationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteRumMetricsDestination)
+
+responseGetAppMonitor :: GetAppMonitorResponse -> TestTree
+responseGetAppMonitor =
+  res
+    "GetAppMonitorResponse"
+    "fixture/GetAppMonitorResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetAppMonitor)
+
+responseGetAppMonitorData :: GetAppMonitorDataResponse -> TestTree
+responseGetAppMonitorData =
+  res
+    "GetAppMonitorDataResponse"
+    "fixture/GetAppMonitorDataResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetAppMonitorData)
+
+responseListAppMonitors :: ListAppMonitorsResponse -> TestTree
+responseListAppMonitors =
+  res
+    "ListAppMonitorsResponse"
+    "fixture/ListAppMonitorsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListAppMonitors)
+
+responseListRumMetricsDestinations :: ListRumMetricsDestinationsResponse -> TestTree
+responseListRumMetricsDestinations =
+  res
+    "ListRumMetricsDestinationsResponse"
+    "fixture/ListRumMetricsDestinationsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListRumMetricsDestinations)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responsePutRumEvents :: PutRumEventsResponse -> TestTree
+responsePutRumEvents =
+  res
+    "PutRumEventsResponse"
+    "fixture/PutRumEventsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutRumEvents)
+
+responsePutRumMetricsDestination :: PutRumMetricsDestinationResponse -> TestTree
+responsePutRumMetricsDestination =
+  res
+    "PutRumMetricsDestinationResponse"
+    "fixture/PutRumMetricsDestinationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy PutRumMetricsDestination)
+
+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)
+
+responseUpdateAppMonitor :: UpdateAppMonitorResponse -> TestTree
+responseUpdateAppMonitor =
+  res
+    "UpdateAppMonitorResponse"
+    "fixture/UpdateAppMonitorResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateAppMonitor)
+
+responseUpdateRumMetricDefinition :: UpdateRumMetricDefinitionResponse -> TestTree
+responseUpdateRumMetricDefinition =
+  res
+    "UpdateRumMetricDefinitionResponse"
+    "fixture/UpdateRumMetricDefinitionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateRumMetricDefinition)
diff --git a/test/Test/Amazonka/Rum.hs b/test/Test/Amazonka/Rum.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Rum.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.Rum
+-- 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.Rum
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/Rum/Internal.hs b/test/Test/Amazonka/Rum/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Rum/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.Rum.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.Rum.Internal where
