

# CloudWatch RUM
<a name="CloudWatch-RUM"></a>

借助 CloudWatch RUM，可执行真实用户监控，从实际用户会话中近乎实时地收集和查看有关 Web 及移动应用程序性能的客户端数据。对于 Web 应用程序，您可以分析页面加载时间、客户端错误和用户行为。对于移动应用程序，您可以监控屏幕加载时间、应用程序启动时间、网络错误、崩溃以及特定于平台的问题，例如 Android 应用程序无响应（ANR）和 iOS 应用程序无响应。查看这些数据时，您可以查看所有数据的聚合视图，也可以查看按设备类型、操作系统和其他应用程序使用情况特征的细分情况。

您可以使用收集的数据快速识别和调试客户端性能问题。CloudWatch RUM 可帮助您可视化应用程序性能中的异常，并查找相关的调试数据，例如错误消息、堆栈跟踪和用户会话。还可以使用 RUM 了解最终用户的影响范围，包括用户数量、地理位置以及所使用的浏览器/设备。

为 CloudWatch RUM 收集的终端用户数据将保留 30 天，然后自动删除。如果要将 RUM 遥测数据保留更长时间，可以选择让应用程序监视器将遥测数据的副本发送到账户中的 CloudWatch Logs。然后，便可以调整该日志组的保留期。

要使用 RUM，需要创建*应用程序监控*并提供一些信息。RUM 会生成代码片段，您可以通过它将依赖项注入添加到应用程序。该片段会按需提取 RUM 客户端代码。RUM 客户端会从应用程序中一定百分比的用户会话中捕获数据，而这些数据会显示在预构建的控制面板中。您可以指定要从中收集数据的用户会话百分比。

 CloudWatch RUM 与 [Application Signals](CloudWatch-Application-Monitoring-Sections.md) 集成，可以发现和监控您的应用程序服务、客户端、Synthetics Canary 和服务依赖项。使用 Application Signals 查看您的服务列表或可视地图，根据您的服务级别目标（SLO）查看运行状况指标，并深入查看关联 X-Ray 跟踪以便更详细地进行问题排查。要在 Application Signals 中查看 RUM 客户端页面请求，请在[创建应用程序监视器](CloudWatch-RUM-get-started-create-app-monitor.md)时启用 X-Ray 活动跟踪。对于 Web 应用程序，您也可以通过[手动配置 RUM Web 客户端](CloudWatch-RUM-configure-client.md)来启用此功能。RUM 客户端将显示在与服务相连的[应用程序图](ServiceMap.md)，以及所调用服务的[服务详细信息](ServiceDetail.md)页面上。

RUM 客户端是开源的。有关更多信息，请参阅 [CloudWatch RUM web client](https://github.com/aws-observability/aws-rum-web)、[AWS Distro for OpenTelemetry (ADOT) Android SDK](https://github.com/aws-observability/aws-otel-android) 和 [AWS Distro for OpenTelemetry (ADOT) iOS SDK](https://github.com/aws-observability/aws-otel-swift)。

**RUM 定价**

有关定价的信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

**区域可用性**

CloudWatch RUM 目前在以下区域中可用：
+ 美国东部（弗吉尼亚州北部）
+ 美国东部（俄亥俄州）
+ 美国西部（北加利福尼亚）
+ 美国西部（俄勒冈州）
+ 非洲（开普敦）
+ AWS GovCloud（美国东部）
+ AWS GovCloud（美国西部）
+ 亚太地区（孟买）
+ 亚太地区（海得拉巴）
+ 亚太地区（墨尔本）
+ 亚太地区（大阪）
+ 亚太地区（首尔）
+ 亚太地区（新加坡）
+ 亚太地区（悉尼）
+ 亚太地区（雅加达）
+ 亚太地区（马来西亚）
+ 亚太地区（泰国）
+ 亚太地区（东京）
+ 亚太地区（香港）
+ 加拿大（中部）
+ 欧洲地区（法兰克福）
+ 欧洲地区（爱尔兰）
+ 欧洲地区（伦敦）
+ 欧洲地区（米兰）
+ 欧洲地区（巴黎）
+ 欧洲（西班牙）
+ 欧洲地区（斯德哥尔摩）
+ 欧洲（苏黎世）
+ AWS 欧盟主权云服务（德国）
+ 中东（巴林）
+ 中东（阿联酋）：
+ 墨西哥（中部）
+ 南美洲（圣保罗）
+ 以色列（特拉维夫）
+ 加拿大西部（卡尔加里）

# 设置移动应用程序以使用 CloudWatch RUM
<a name="CloudWatch-RUM-web-mobile"></a>

要监控移动应用程序，需要创建应用程序监视器，将其配置为移动平台，然后将适用于 OpenTelemetry 的 AWS Distro（ADOT）SDK 集成到应用程序中。移动 RUM 会使用 OpenTelemetry Protocol（OTLP）将遥测数据发送到专用的 OTLP 端点。

## 为移动平台创建应用程序监视器
<a name="mobile-platform-app-monitor"></a>

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择 **Application Signals**、**RUM**。

1. 选择 **Add app monitor**（添加应用程序监控）。

1. 在 **App monitor name**（应用程序监控名称）中，输入在 CloudWatch RUM 控制台中用于识别此应用程序监控的名称。

1. 选择 **Android** 或 **iOS** 作为平台。

1. 在**数据存储**下，您可以选择将 RUM OTEL 日志事件和跨度的副本存储在 CloudWatch Logs 中并配置保留期。预设情况下，CloudWatch Logs 日志组会将数据保留 30 天。您可以在 CloudWatch Logs 控制台中调整保留期。

1. （可选）在**基于资源的策略**下，选择添加基于资源的策略，以控制谁可以向应用程序监视器发送请求。如果选择**创建公有策略**，系统将附加资源策略，以便任何人都能向应用程序监视器发送请求。有关更多信息，请参阅 [将基于资源的策略与 CloudWatch RUM 结合使用](CloudWatch-RUM-resource-policies.md)。

1. 要对采样的用户会话启用 AWS X-Ray 跟踪，请选择**活动跟踪**，然后选择 **使用 AWS X-Ray 跟踪服务**。

   如果选中，则会跟踪在采样用户会话期间生成的 OTEL 跨度。然后，您可以在 RUM 控制面板、X-Ray 跟踪地图和跟踪详细信息页面中，查看来自这些用户会话的跟踪数据和跨度信息。为应用程序启用相应功能后，这些用户会话还将作为客户端页面显示在 Application Signals 中。

1. （可选）要向应用程序监视器添加标签，请执行以下操作：

   1. 依次选择**标签**、**添加新标签**。

   1. 对于**键**，输入标签的名称。您可以在**值**中添加可选的值。

   1. 要添加其他标签，请再次选择 **添加新标签**。

   有关更多信息，请参阅《AWS 标记和标签编辑器用户指南**》中的[标记 AWS 资源](https://docs.aws.amazon.com/tagging/latest/userguide/tagging-resources.html)。

1. 选择 **Add app monitor**（添加应用程序监控）。

1. 在**示例代码**部分，您可以复制代码片段以添加到应用程序当中。使用适用于 OpenTelemetry 的 AWS Distro（ADOT）SDK，您可以选择**手动埋点**（在应用程序代码中配置监控），也可以选择**零代码埋点**（所需的配置更改极少）。

   对于 Android 和 iOS 应用程序，零代码埋点是最简单的选项，因为它会使用配置文件自动初始化遥测收集。手动埋点可以更好地控制初始化和配置过程。

1. 选择 **Copy**（复制）或 **Download**（下载），然后选择 **Done**（完成）。

### iOS 应用程序设置
<a name="CloudWatch-RUM-ios-setup"></a>

对于 iOS 应用程序，请集成[适用于 OpenTelemetry 的 AWS Distro（ADOT）iOS SDK](https://github.com/aws-observability/aws-otel-swift)，启用 RUM 监控。该 SDK 支持 iOS 16 及更高版本，并为常见性能场景提供自动埋点。

### Android 应用程序设置
<a name="CloudWatch-RUM-android-setup"></a>

对于 Android 应用程序，请集成[适用于 OpenTelemetry 的 AWS Distro（ADOT）Android SDK](https://github.com/aws-observability/aws-otel-android)，启用 RUM 监控。该 SDK 提供自动埋点，并支持签名和未签名的身份验证模型。

## 身份验证和安全
<a name="CloudWatch-RUM-authentication"></a>

移动 RUM 支持其 SDK 中定义的灵活身份验证模型。
+ iOS 应用程序使用[适用于 OpenTelemetry 的 AWS Distro（ADOT）iOS SDK](https://github.com/aws-observability/aws-otel-swift)。
+ Android 应用程序使用[适用于 OpenTelemetry 的 AWS Distro（ADOT）Android SDK](https://github.com/aws-observability/aws-otel-android)。

# 使用 CloudWatch RUM 的 IAM 策略
<a name="CloudWatch-RUM-permissions"></a>

为了完全管理 CloudWatch RUM，必须以具有 **AmazonCloudWatchRUMFullAccess** IAM 策略的 IAM 用户或角色身份登录。此外，可能需要其他策略或权限：
+ 要创建应用程序监控来创建新的 Amazon Cognito 身份池进行授权，需要具备 **Admin** IAM 角色或 **AdministratorAccess** IAM 策略。
+ 要创建将数据发送到 CloudWatch Logs 的应用程序监控，必须登录具有以下权限的 IAM 角色或策略：

  ```
  {
      "Effect": "Allow",
      "Action": [
          "logs:PutResourcePolicy"
      ],
      "Resource": [
          "*"
      ]
  }
  ```
+ 要在应用程序监测仪中启用 JavaScript 源映射，您需要将源映射文件上传到 Amazon S3 存储桶。您的 IAM 角色或策略需要特定的 Amazon S3 权限，才能创建 Amazon S3 存储桶、设置存储桶策略和管理存储桶中的文件。为了安全起见，将这些权限范围限定于特定资源。下面的示例策略限制访问名称中包含 `rum` 的存储桶，并使用 `aws:ResourceAccount` 条件键将权限仅限于主体账户。

  ```
  {
      "Sid": "AllowS3BucketCreationAndListing",
      "Effect": "Allow",
      "Action": [
          "s3:CreateBucket",
          "s3:ListAllMyBuckets"
      ],
      "Resource": "arn:aws:s3:::*",
      "Condition": {
          "StringEquals": {
              "aws:ResourceAccount": "${aws:PrincipalAccount}"
          }
      }
  },
  {
      "Sid": "AllowS3BucketActions",
      "Effect": "Allow",
      "Action": [
          "s3:GetBucketLocation",
          "s3:ListBucket"
      ],
      "Resource": "arn:aws:s3:::*rum*",
      "Condition": {
          "StringEquals": {
              "aws:ResourceAccount": "${aws:PrincipalAccount}"
          }
      }
  },
  {
      "Sid": "AllowS3BucketPolicyActions",
      "Effect": "Allow",
      "Action": [
          "s3:PutBucketPolicy",
          "s3:GetBucketPolicy"
      ],
      "Resource": "arn:aws:s3:::*rum*",
      "Condition": {
          "StringEquals": {
              "aws:ResourceAccount": "${aws:PrincipalAccount}"
          }
      }
  },
  {
      "Sid": "AllowS3ObjectActions",
      "Effect": "Allow",
      "Action": [
          "s3:GetObject",
          "s3:PutObject",
          "s3:DeleteObject",
          "s3:AbortMultipartUpload"
      ],
      "Resource": "arn:aws:s3:::*rum*",
      "Condition": {
          "StringEquals": {
              "aws:ResourceAccount": "${aws:PrincipalAccount}"
          }
      }
  }
  ```
+ 要在源映射存储桶上使用自己的 AWS KMS 密钥进行服务器端加密，您的 IAM 角色或策略需要特定的 AWS KMS 权限，才能创建密钥、更新密钥策略、在 Amazon S3 中使用 AWS KMS 密钥以及设置 Amazon S3 存储桶的加密配置。为了安全起见，将这些权限范围限定于特定目的。下面的示例限制访问特定区域和 accountId 的密钥，并具有与上面示例类似的 S3 限制。

  ```
  {
      "Sid": "AllowKMSKeyCreation",
      "Effect": "Allow",
      "Action": [
          "kms:CreateKey",
          "kms:CreateAlias"
      ],
      "Resource": "*"
  },
  {
      "Sid": "KMSReadPermissions",
      "Effect": "Allow",
      "Action": [
          "kms:ListAliases"
      ],
      "Resource": "*"
  },
  {
      "Sid": "AllowUpdatingKeyPolicy",
      "Effect": "Allow",
      "Action": [
          "kms:PutKeyPolicy",
          "kms:GetKeyPolicy",
          "kms:ListKeyPolicies"
      ],
      "Resource": "arn:aws:kms:REGION:ACCOUNT_ID:key/*"
  },
  {
      "Sid": "AllowUseOfKMSKeyForS3",
      "Effect": "Allow",
      "Action": [
          "kms:DescribeKey",
          "kms:Encrypt",
          "kms:Decrypt",
          "kms:GenerateDataKey"
      ],
      "Resource": "arn:aws:kms:REGION:ACCOUNT_ID:key/*"
  },
  {
      "Sid": "AllowS3EncryptionConfiguration",
      "Effect": "Allow",
      "Action": [
          "s3:PutEncryptionConfiguration",
          "s3:GetEncryptionConfiguration"
      ],
      "Resource": "arn:aws:s3:::*rum*",
      "Condition": {
          "StringEquals": {
              "aws:ResourceAccount": "${aws:PrincipalAccount}"
          }
      }
  }
  ```

需要查看 CloudWatch RUM 数据但不需要创建 CloudWatch RUM 资源的其他用户，可以授予 **AmazonCloudWatchRUMReadOnlyAccess** 策略。

# 设置 Web 应用程序以使用 CloudWatch RUM
<a name="CloudWatch-RUM-get-started"></a>

使用本部分中的步骤设置 Web 应用程序，以开始使用 CloudWatch RUM 从真实用户会话中收集性能数据。

**Topics**
+ [授权 Web 应用程序将数据发送到 AWS](CloudWatch-RUM-get-started-authorization.md)
+ [创建用于 Web 应用程序的 CloudWatch RUM 应用程序监视器](CloudWatch-RUM-get-started-create-app-monitor.md)
+ [修改代码片段以配置 CloudWatch RUM Web 客户端（可选）](CloudWatch-RUM-modify-snippet.md)
+ [将 CloudWatch 应用程序监控代码片段插入应用程序](CloudWatch-RUM-get-started-insert-code-snippet.md)
+ [通过生成用户事件测试 CloudWatch 应用程序监控设置](CloudWatch-RUM-get-started-generate-data.md)

# 授权 Web 应用程序将数据发送到 AWS
<a name="CloudWatch-RUM-get-started-authorization"></a>

您有四种方式来设置数据验证：
+ 使用 Amazon Cognito 并让 CloudWatch RUM 为应用程序创建新的 Amazon Cognito 身份池。这是最简单的设置方法。

  身份池将包含未经验证的身份。这允许 CloudWatch RUM Web 客户端将数据发送到 CloudWatch RUM，而无需对应用程序的用户进行身份验证。

  Amazon Cognito 身份池具有附加的 IAM 角色。Amazon Cognito 未经验证的身份允许 Web 客户端担任 IAM 角色，此角色已获得授权，可向 CloudWatch RUM 发送数据。
+ 使用 Amazon Cognito 进行身份验证。如果您使用此方式，则可以使用现有的 Amazon Cognito 身份池，或者创建一个新的身份池以用于此应用程序监测仪。如果您使用现有身份池，还必须修改附加到身份池的 IAM 角色。对于支持未经身份验证用户的身份池，请使用此选项。您只能使用同一区域中的身份池。
+ 使用已设置的现有身份提供商的身份验证。在这种情况下，您必须从身份提供商处获取凭证，并且应用程序必须将这些凭证转发到 RUM Web 客户端。

  对于仅支持经身份验证用户的身份池，请使用此选项。
+ 使用基于资源的策略来管理对应用程序监测仪的访问。这包括无需 AWS 凭证即可向 CloudWatch RUM 发送未经身份验证的请求。要了解基于资源的策略和 RUM 的更多信息，请参阅[将基于资源的策略与 CloudWatch RUM 结合使用](CloudWatch-RUM-resource-policies.md)。

以下各节包含了这些选项的更多详细信息。

## 使用现有的 Amazon Cognito 身份池
<a name="CloudWatch-RUM-get-started-authorization-existingcognito"></a>

如果您选择使用 Amazon Cognito 身份池，则需要在将应用程序添加到 CloudWatch RUM 时指定身份池。身份池必须支持访问未经验证的身份。您只能使用同一区域中的身份池。

您还必须将以下权限添加到已附加到与此身份池关联的 IAM 角色的 IAM 策略。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        { 
            "Effect": "Allow",
            "Action": [
                "rum:PutRumEvents"
            ],
            "Resource": "arn:aws:rum:us-east-1:123456789012:appmonitor/app monitor name" 
        }
    ]
}
```

------

Amazon Cognito 会发送必要的安全令牌，以确保应用程序能够访问 CloudWatch RUM。

## 第三方提供商
<a name="CloudWatch-RUM-get-started-authorization-thirdparty"></a>

如果您选择使用第三方提供商的私有身份验证，则必须从身份提供商处获取凭证并将其转发到 AWS。执行此操作的最佳方法是使用*安全令牌供应商*。您可以使用任意安全令牌供应商，包括使用 AWS Security Token Service 的 Amazon Cognito。有关 AWS STS 的更多信息，请参阅[欢迎使用 AWS Security Token Service API 参考](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html)。

如果您想在这种情况下使用 Amazon Cognito 作为令牌供应商，则可以配置 Amazon Cognito，以与身份验证提供商结合使用。有关更多信息，请参阅 [Amazon Cognito 身份池入门（联合身份）](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html)。

配置 Amazon Cognito 以与身份提供商结合使用后，还需要执行以下操作：
+ 创建具有以下权限的 IAM 角色。应用程序将使用该角色访问 AWS。

------
#### [ JSON ]

****  

  ```
  { 
   "Version":"2012-10-17",		 	 	 
   "Statement": [ 
     { 
       "Effect": "Allow",
       "Action": "rum:PutRumEvents",
       "Resource": "arn:aws:rum:us-east-2:123456789012:appmonitor/AppMonitorName"
     }
   ]
  }
  ```

------
+ 将以下内容添加到应用程序中，让应用程序将提供商的凭证传递给 CloudWatch RUM。插入该行，以便在用户登录到应用程序并且应用程序收到用于访问 AWS 的凭证后运行。

  ```
  cwr('setAwsCredentials', {/* Credentials or CredentialProvider */});
  ```

有关 AWS JavaScript SDK 凭证提供商的更多信息，请参阅 SDK for JavaScript v3 开发者指南中的[在 Web 浏览器中设置凭证](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-browser.html)、SDK for JavaScript v2 开发人员指南中的[在 Web 浏览器中设置凭证](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-credentials-browser.html)以及 [@aws-sdk/凭证提供商](https://www.npmjs.com/package/@aws-sdk/credential-providers)。

您还可以使用适用于 CloudWatch RUM Web 客户端的软件开发工具包来配置 Web 客户端身份验证方法。有关 Web 客户端软件开发工具包的更多信息，请参阅 [CloudWatch RUM Web 客户端软件开发工具包](https://github.com/aws-observability/aws-rum-web)。

# 创建用于 Web 应用程序的 CloudWatch RUM 应用程序监视器
<a name="CloudWatch-RUM-get-started-create-app-monitor"></a>

要在应用程序中开始使用 CloudWatch RUM，您可以创建*应用程序监控*。创建应用程序监视器后，RUM 会生成一个可粘贴到应用程序中的 JavaScript 代码片段。该片段会提取 RUM 客户端代码。RUM 客户端会从应用程序的用户会话中捕获数据并将其发送到 RUM。

## 为 Web 平台创建应用程序监视器
<a name="web-platform-app-monitor"></a>

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择 **Application Signals**、**RUM**。

1. 选择 **Add app monitor**（添加应用程序监控）。

1. 在 **App monitor name**（应用程序监控名称）中，输入在 CloudWatch RUM 控制台中用于识别此应用程序监控的名称。

1. 选择 **Web** 作为平台。

1. 在**应用程序域列表**中，输入您的应用程序拥有管理权限的注册域名。您还可以使用通配符 `*` 允许任何子域或顶级域（例如，\$1.amazon.com、amazon.\$1、\$1.amazon.\$1）。

1. 在 **Configure RUM data collection**（配置 RUM 数据收集）中，指定是否希望应用程序监控收集以下每项内容：
   + **Performance telemetry**（性能遥测）– 收集有关页面加载和资源加载时间的信息
   + **JavaScript errors**（JavaScript 错误）– 收集应用程序引发的未处理 JavaScript 错误的信息

     您可以选择**取消压缩 JavaScript 错误堆栈跟踪**来调试未压缩的 JavaScript 错误。要使用此功能，请将源映射文件上传到 Amazon S3 存储桶或文件夹，并提供 Amazon S3 URI。启用后，RUM 将使用这些源映射，并添加未压缩的堆栈跟踪来丰富 JavaScript 错误事件。请注意，启用后，此功能仅处理新的 JavaScript 错误事件，而不能用于以前收集的数据。有关更多信息，请参阅 [启用 JavaScript 错误堆栈跟踪的取消压缩功能](CloudWatch-RUM-JavaScriptStackTraceSourceMaps.md)。
   + **HTTP errors**（HTTP 错误）– 收集应用程序引发的 HTTP 错误的信息

   选择这些选项可以提供有关应用程序的更多信息，但也会生成更多 CloudWatch RUM 事件，从而产生更多的费用。

   如果未选择以上任何选项，应用程序监控仍会收集会话开启事件和页面 ID，以便您可以查看有多少用户正在使用应用程序，包括按操作系统类型和版本、浏览器类型和版本、设备类型和位置的细分。

1. 如果您希望能够从采样的用户会话中收集用户 ID 和会话 ID，选择 **Check this option to allow the CloudWatch RUM Web Client to set cookies**（选中此选项以允许 CloudWatch RUM Web 客户端设置 Cookie）。用户 ID 由 RUM 随机生成。有关更多信息，请参阅 [CloudWatch RUM Web 客户端 Cookie（或类似技术）](CloudWatch-RUM-privacy.md#CloudWatch-RUM-cookies)。

1. 在 **Session samples**（会话样本）中，输入将用于收集 RUM 数据的用户会话百分比。默认值为 100%。减少此数字将提供更少的数据，但可以降低费用。有关 RUM 定价的更多信息，请参阅 [RUM 定价](CloudWatch-RUM.md#RUMpricing)。

1. 为 CloudWatch RUM 收集的终端用户数据将保留 30 天，然后删除。如果您想在 CloudWatch Logs 中保留 RUM 事件的副本并配置这些副本的保留时间，请选择 **Data storage**（数据存储）下的 **Check this option to store your application telemetry data in your CloudWatch Logs account**（选中此选项以将应用程序遥测数据存储在 CloudWatch Logs 账户中）。预设情况下，CloudWatch Logs 日志组会将数据保留 30 天。您可以在 CloudWatch Logs 控制台中调整保留期。

1. （可选）选择向您的应用程序监测仪添加基于资源的策略，以控制谁可以向您的应用程序监测仪发送 `PutRumEvents` 请求。如果您选择**创建公共策略**，则资源策略将附加到您的应用程序监测仪，以便任何人都能向您的应用程序监测仪发送 `PutRumEvents` 请求。有关此方法的更多信息，请参阅[将基于资源的策略与 CloudWatch RUM 结合使用](CloudWatch-RUM-resource-policies.md)。

1. 如果您在上一步中附加了基于资源的策略，则无需使用 AWS 凭证向 CloudWatch RUM 签署请求，并且可以跳过设置授权。否则，对于**授权**，请指定是使用新的或现有的 Amazon Cognito 身份池，还是使用其他身份提供者。创建新的身份池是最简单的选择，无需其他设置步骤。有关详细信息，请参阅 [授权 Web 应用程序将数据发送到 AWS](CloudWatch-RUM-get-started-authorization.md)。

   创建新的 Amazon Cognito 身份池需要管理权限。有关更多信息，请参阅 [使用 CloudWatch RUM 的 IAM 策略](CloudWatch-RUM-permissions.md)。

1. （可选）预设情况下，您将 RUM 代码段添加到应用程序时，Web 客户端会将 JavaScript 标签注入到应用程序所有页面的 HTML 代码中以监控使用情况。要更改此选项，请选择 **Configure pages**（配置页面），然后选择 **Include only these pages**（仅包含这些页面）或 **Exclude these pages**（排除这些页面）。然后指定要包含或排除的页面。要指定包含或排除的页面，请输入其完整 URL。要指定其他页面，请选择 **Add URL**（添加 URL）。

1. 要启用 AWS X-Ray 跟踪应用程序监控采样的用户会话，选择 **Active tracing**（活动跟踪），然后选择 **Trace my service with AWS X-Ray（使用跟踪我的服务）。**

   如果选择此项，将会跟踪在应用程序监控采样用户会话期间发出的 `XMLHttpRequest` 和 `fetch` 请求。然后，您可在 RUM 控制面板、X-Ray 跟踪地图和跟踪详细信息页面中查看来自这些用户会话的跟踪和分段。为应用程序启用相应功能后，这些用户会话还将作为客户端页面显示在 [Application Signals](CloudWatch-Application-Monitoring-Sections.md) 中。

   通过对 CloudWatch RUM Web 客户端进行其他配置更改，您可以向 HTTP 请求添加 X-Ray 跟踪标头，以启用到下游 AWS 托管式服务的用户会话端到端跟踪。有关更多信息，请参阅 [启用 X-Ray 端到端跟踪](CloudWatch-RUM-modify-snippet.md#CloudWatch-RUM-xraytraceheader)。

1. （可选）要向应用程序监控添加标签，请选择 **Tags**（标签）、**Add new tag**（添加新标签）。

   然后，对于 **Key**（键），输入标签的名称。您可以在 **Value** (值) 中添加可选的标签值。

   要添加其他标签，请再次选择 **Add new tag**（添加新标签）。

   有关更多信息，请参阅[标记 AWS 资源](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html)。

1. 选择 **Add app monitor**（添加应用程序监控）。

1. 在 **Sample code**（示例代码）部分，您可以复制要使用的代码段以添加到您的应用程序当中。我们建议您选择 **JavaScript** 或 **TypeScript**，使用 NPM 安装 CloudWatch RUM Web 客户端，并将其作为 JavaScript 模块。

   或者，您可以选择 **HTML** 来使用内容分发网络（CDN），以便安装 CloudWatch RUM Web 客户端。使用 CDN 的缺点在于，Web 客户端常被广告拦截器拦截。

1. 选择 **Copy**（复制）或 **Download**（下载），然后选择 **Done**（完成）。

# 修改代码片段以配置 CloudWatch RUM Web 客户端（可选）
<a name="CloudWatch-RUM-modify-snippet"></a>

您可以在代码段插入应用程序之前对其进行修改，以激活或停用多个选项。有关更多信息，请参阅 [CloudWatch RUM Web 客户端文档](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md)。

正如这些章节中所述，您必须注意四个配置选项。

## 防止收集可能包含个人信息的资源 URL
<a name="CloudWatch-RUM-resourceURL"></a>

预设情况下，CloudWatch RUM Web 客户端配置为记录应用程序下载的资源的 URL。这些资源包括 HTML 文件、图像、CSS 文件、JavaScript 文件等。对于某些应用程序，URL 可能包含个人身份信息（PII）。

如果应用程序属于这种情况，则强烈建议您通过在代码段配置中设置 `recordResourceUrl: false` 以禁用收集资源 URL，然后再将其插入到应用程序中。

## 手动记录页面浏览次数
<a name="CloudWatch-RUM-pageload"></a>

默认情况下，Web 客户端会在页面首次加载以及调用浏览器的历史 API 时记录页面浏览次数。默认页面 ID 为 `window.location.pathname`。但在某些情况下，您可能需要覆盖此行为并利用应用程序以编程方式记录页面浏览量。这样您可以控制页面 ID 及其记录时间。例如，假设一个 Web 应用程序的 URI 带有变量标识符，例如 `/entity/123` 或 `/entity/456`。默认情况下，CloudWatch RUM 会为每个具有与路径名匹配的不同页面 ID 的 URI 生成页面浏览事件，但您可能希望改用相同的页面 ID 对它们进行分组。为此，请使用 `disableAutoPageView` 配置禁用 Web 客户端的页面浏览自动化，然后使用 `recordPageView` 命令设置所需的页面 ID。有关更多信息，请参阅 GitHub 上的[特定于应用程序的配置](https://github.com/aws-observability/aws-rum-web/blob/main/docs/configuration.md)。

**嵌入式脚本示例：**

```
cwr('recordPageView', { pageId: 'entityPageId' });
```

**JavaScript 模块示例：**

```
awsRum.recordPageView({ pageId: 'entityPageId' });
```

## 启用 X-Ray 端到端跟踪
<a name="CloudWatch-RUM-xraytraceheader"></a>

在创建应用程序监控时，选择 **Trace my service with AWS X-Ray**（使用跟踪我的服务）将启用跟踪在应用程序监控采样的用户会话期间发出的 `XMLHttpRequest` 和 `fetch` 请求。然后，您可在 CloudWatch RUM 控制面板、X-Ray 跟踪地图和跟踪详细信息页面查看来自这些 HTTP 请求的跟踪。

默认情况下，这些客户端跟踪未连接到下游服务器端跟踪。要将客户端跟踪连接到服务器端跟踪并启用端到端跟踪，请在 Web 客户端中将 `addXRayTraceIdHeader` 选项设置为 `true`。这将导致 CloudWatch RUM Web 客户端向 HTTP 请求添加 X-Ray 跟踪标头。

下面的代码块展示了添加客户端跟踪的示例。为提高可读性，此示例中省略了一些配置选项。

```
<script>
    (function(n,i,v,r,s,c,u,x,z){...})(
        'cwr',
        '00000000-0000-0000-0000-000000000000',
        '1.0.0',
        'us-west-2',
        'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js',
        {
            enableXRay: true,
            telemetries: [ 
                'errors', 
                'performance',
                [ 'http', { addXRayTraceIdHeader: true } ]
            ]
        }
    );
</script>
```

**警告**  
如果使用 SigV4 签署请求，则将 CloudWatch RUM Web 客户端配置为向 HTTP 请求添加 X-Ray 跟踪标头可能会导致跨源资源共享 (CORS) 失败或该请求的签名无效。有关更多信息，请参阅 [CloudWatch RUM Web 客户端文档](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md)。我们强烈建议您在生产环境中添加客户端 X-Ray 跟踪标头之前测试应用程序。

有关更多信息，请参阅 [CloudWatch RUM Web 客户端文档](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md#http)

## 向 CloudWatch RUM 发送未签名的请求
<a name="CloudWatch-RUM-unsigned"></a>

默认情况下，RUM Web 客户端会对发送到 RUM 的所有请求进行签名。如果您在客户端配置中设置了 `signing:false`，则请求在发送到 CloudWatch RUM 时将处于未签名状态。只有在应用程序监测仪上附加了基于公共资源的策略时，才会将数据摄取到 RUM。有关更多信息，请参阅 [将基于资源的策略与 CloudWatch RUM 结合使用](CloudWatch-RUM-resource-policies.md)。

# 将 CloudWatch 应用程序监控代码片段插入应用程序
<a name="CloudWatch-RUM-get-started-insert-code-snippet"></a>

接下来，将上一部分中创建的代码段插入到应用程序中。

**警告**  
由代码段下载和配置的 Web 客户端使用 Cookie（或类似技术）来帮助您收集终端用户数据。在插入代码段之前，请参阅 [在控制台中按元数据属性筛选CloudWatch RUM 的数据保护和数据隐私](CloudWatch-RUM-privacy.md)。

如果您没有以前生成的代码段，则可以按照 [如何查找已生成的代码段？](CloudWatch-RUM-find-code-snippet.md) 中的说明进行查找。

**将 CloudWatch RUM 代码段插入应用程序**

1. 将您在上一部分中复制或下载的代码段插入应用程序的 `<head>` 元素。在 `<body>` 元素或任何其他 `<script>` 标签之前插入。

   以下是一个已生成的代码段示例：

   ```
   <script>
   (function (n, i, v, r, s, c, x, z) {
       x = window.AwsRumClient = {q: [], n: n, i: i, v: v, r: r, c: c};
       window[n] = function (c, p) {
           x.q.push({c: c, p: p});
       };
       z = document.createElement('script');
       z.async = true;
       z.src = s;
       document.head.insertBefore(z, document.getElementsByTagName('script')[0]);
   })('cwr',
       '194a1c89-87d8-41a3-9d1b-5c5cd3dafbd0',
       '1.0.0',
       'us-east-2',
       'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js',
       {
           sessionSampleRate: 1,
           identityPoolId: "us-east-2:c90ef0ac-e3b8-4d1a-b313-7e73cfd21443",
           endpoint: "https://dataplane.rum.us-east-2.amazonaws.com",
           telemetries: ["performance", "errors", "http"],
           allowCookies: true,
           enableXRay: false
       });
   </script>
   ```

1. 如果应用程序是多页 Web 应用程序，则必须对要包含在数据集合中的每个 HTML 页面重复步骤 1。

# 通过生成用户事件测试 CloudWatch 应用程序监控设置
<a name="CloudWatch-RUM-get-started-generate-data"></a>

插入代码段并且已更新的应用程序正在运行之后，您可以通过手动生成用户事件对其进行测试。要进行测试，建议您执行以下操作。此测试将产生标准 CloudWatch RUM 费用。
+ 在 Web 应用程序中页面之间导航。
+ 使用不同的浏览器和设备创建多个用户会话。
+ 提出请求。
+ 导致 JavaScript 错误。

生成一些事件后，请在 CloudWatch RUM 控制面板中查看。有关更多信息，请参阅 [查看 CloudWatch RUM 控制面板](CloudWatch-RUM-view-data.md)。

来自用户会话的数据可能需要 15 分钟才能在控制面板中显示。

如果在应用程序中生成事件 15 分钟后没有看到数据，请参阅 [CloudWatch RUM 故障排除](CloudWatch-RUM-troubleshooting.md)。

# 将基于资源的策略与 CloudWatch RUM 结合使用
<a name="CloudWatch-RUM-resource-policies"></a>

您可以将资源策略附加到 CloudWatch RUM 应用程序监测仪。默认情况下，应用程序监测仪不会附加资源策略。基于 CloudWatch RUM 资源的策略不支持跨账户访问。

要详细了解 AWS 资源策略，请参阅[基于身份的策略和基于资源的策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)。

要详细了解如何评估资源策略和身份策略，请参阅[策略评估逻辑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

要详细了解 IAM 策略语法，请参阅 [IAM JSON 策略元素参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)。

## 支持的操作
<a name="RUM-resource-policies-actions"></a>

应用程序监测仪上基于资源的策略支持 `rum:PutRumEvents` 操作。

## 与 CloudWatch RUM 结合使用的示例策略
<a name="RUM-resource-policies-samples"></a>

以下示例允许任何人将数据写入您的应用程序监测仪，包括那些没有 Sigv4 凭证的用户。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "rum:PutRumEvents",
            "Resource": "arn:aws:rum:us-east-1:123456789012:appmonitor/app monitor name",
            "Principal": "*"
        }
    ]
}
```

------

您可以使用 `aws:SourceIp` 条件键来修改策略，以阻止指定的源 IP 地址。在此示例中，使用此策略，将拒绝来自所列 IP 地址的 PutrumEvents。将接受来自其他 IP 地址的所有其他请求。有关此条件键的更多信息，请参阅《IAM 用户指南》中的[网络属性](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-network-properties)。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "rum:PutRumEvents",
            "Resource": "arn:aws:rum:us-east-1:123456789012:appmonitor/AppMonitorName",
            "Principal": "*"
        },
        {
            "Effect": "Deny",
            "Action": "rum:PutRumEvents",
            "Resource": "arn:aws:rum:us-east-1:123456789012:appmonitor/AppMonitorName",
            "Principal": "*",
            "Condition": {
                "NotIpAddress": {
                "aws:SourceIp": "198.51.100.252"
                }
            }
        }
    ]
}
```

------

此外，您还可以使用 `rum:alias` 服务上下文键来控制接受哪些请求。

对于 Web 应用程序监视器，必须将 Web 客户端配置为通过版本 1.20 或更高版本的 CloudWatch RUM Web 客户端发送 `Alias`，如 GitHub 上的 [Application-specific Configurations](https://github.com/aws-observability/aws-rum-web/blob/main/docs/configuration.md) 中所述。

对于移动应用程序监视器，必须根据开发工具包配置埋点。
+ iOS 应用程序使用[适用于 OpenTelemetry 的 AWS Distro（ADOT）iOS SDK](https://github.com/aws-observability/aws-otel-swift)。
+ Android 应用程序使用[适用于 OpenTelemetry 的 AWS Distro（ADOT）Android SDK](https://github.com/aws-observability/aws-otel-android)。

在以下示例中，资源策略要求请求必须包含 `alias1` 或 `alias2` 才能接受事件。

```
    {
    "Version":"2012-10-17",                   
    "Statement": [
        {
            "Sid": "AllowRUMPutEvents",
            "Effect": "Allow",
            "Action": "rum:PutRumEvents",
            "Resource": "arn:aws:rum:us-east-1:123456789012:appmonitor/MyApplication",
            "Principal": "*",
            "Condition": {
                "StringEquals": {
                    "rum:alias":["alias1", "alias2"]
                }
            }
        }
    ]
}
```

# 配置 CloudWatch RUM Web 客户端
<a name="CloudWatch-RUM-configure-client"></a>

应用程序可以使用 CloudWatch RUM 生成的其中一个代码段来安装 CloudWatch RUM Web 客户端。生成的代码段支持两种安装方法：作为 JavaScript 模块并通过 NPM，或通过内容分发网络（CDN）。为了获得最佳性能，我们建议使用 NPM 安装方法。有关使用此方法的更多信息，请参阅[作为 JavaScript 模块安装](https://github.com/aws-observability/aws-rum-web/blob/main/docs/npm_installation.md)。

如果您使用 CDN 安装选项，广告拦截器可能拦截由 CloudWatch RUM 提供的默认 CDN。若用户安装了广告拦截器，它将禁用应用程序监控。因此，我们建议您只在第一次启动 CloudWatch RUM 时使用默认的 CDN。有关此问题缓解方法的更多信息，请参阅[检测应用程序](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md#instrument-the-application)。

代码段位于 HTML 文件的 `<head>` 标签，并且下载 Web 客户端来完成其安装，然后为其监控的应用程序配置 Web 客户端。该代码段是一种自动执行的函数，类似于以下内容。在此示例中，为提高可读性，已省略代码段函数的正文。

```
<script>
(function(n,i,v,r,s,c,u,x,z){...})(
'cwr',
'00000000-0000-0000-0000-000000000000',
'1.0.0',
'us-west-2',
'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js',
{ /* Configuration Options Here */ }
);
<script>
```

## 参数
<a name="CloudWatch-RUM-configure-client-arguments"></a>

代码段接受六个参数：
+ 用于在 Web 客户端上运行命令的命名空间，例如 `'cwr'`
+ 应用程序监控的 ID，例如 `'00000000-0000-0000-0000-000000000000'`
+ 应用程序版本，例如 `'1.0.0'`
+ 应用程序监控的 AWS 区域，例如 `'us-west-2'`
+ Web 客户端的 URL，例如 `'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js'`
+ 特定于应用程序的配置选项。有关更多信息，请参阅下文。

## 忽略错误
<a name="CloudWatch-RUM-configure-ignore-errors"></a>

CloudWatch RUM Web 客户端会侦听应用程序中发生的所有类型的错误。如果您的应用程序发出了 JavaScript 错误，而您不想在 CloudWatch RUM 控制面板中查看这些错误，则可以配置 CloudWatch RUM Web 客户端以筛选出这些错误，以便在 CloudWatch RUM 控制面板上仅看到相关的错误事件。例如，您可能选择不在控制面板中查看某些 JavaScript 错误，因为您已经确定了这些错误的修复方法，而且这些错误的数量掩盖了其他错误。您可能还想忽略那些您无法修复的错误，因为它们归第三方所有的库所有。

有关如何分析 Web 客户端以筛选出特定 JavaScript 错误的更多信息，请参阅 Web 客户端 Github 文档中的[错误](https://github.com/aws-observability/aws-rum-web/blob/main/docs/configuration.md#errors)中的示例。

## 配置选项
<a name="CloudWatch-RUM-configure-options"></a>

有关 CloudWatch RUM Web 客户端可用的配置选项信息，请参阅 [CloudWatch RUM Web 客户端文档](https://github.com/aws-observability/aws-rum-web/blob/main/docs/configuration.md)

# 启用 JavaScript 错误堆栈跟踪的取消压缩功能
<a name="CloudWatch-RUM-JavaScriptStackTraceSourceMaps"></a>

当您的 Web 应用程序 JavaScript 源代码压缩后，错误堆栈跟踪可能很难读取。您可以将源映射上传到 Amazon S3，以启用堆栈跟踪的取消压缩功能。CloudWatch RUM 会检索源映射，将压缩后的源代码中的行号和列号映射回未压缩的原始源代码。这将提高错误堆栈跟踪的可读性，并有助于确定原始源代码中的错误位置。

## 要求和语法
<a name="CloudWatch-RUM-RequirementsJavaScriptStackTraceSourceMaps"></a>

源映射对于调试和跟踪不同版本的 Web 应用程序中的问题至关重要。确保每个 Web 应用程序版本都有唯一的源映射。每个版本都应有自己唯一的 releaseId。releaseId 必须是长度在 1 到 200 个字符之间的字符串，并且只能包含字母、数字、下划线、连字符、冒号、正斜杠和句点。要将 `releaseId` 作为元数据添加到 RUM 事件，请配置 CloudWatch RUM Web 客户端。

源映射应是纯 JSON 文件，遵循[源映射 V3 规范](https://sourcemaps.info/spec.html)定义的结构。必填字段包括：`version`、`file`、`sources`、`names` 和 `mappings`。

确保每个源映射的大小不超过 50MB 的限制。此外，RUM 服务对每个堆栈跟踪最多只能检索 50MB 的源映射。如果需要，可将源代码分成多个小块。有关更多信息，请参阅使用 [WebpackJS 拆分代码](https://webpack.js.org/guides/code-splitting/)。

**Topics**
+ [要求和语法](#CloudWatch-RUM-RequirementsJavaScriptStackTraceSourceMaps)
+ [配置 Amazon S3 存储桶资源策略以允许 RUM 服务访问](#CloudWatch-RUM-ConfigureS3)
+ [上传源映射](#CloudWatch-RUM-UploadSourceMaps)
+ [在 CloudWatch RUM Web 客户端中配置 releaseId](#CloudWatch-RUM-ConfigureRumID)
+ [启用 CloudWatch RUM 应用程序监测仪以取消压缩 JavaScript 堆栈跟踪](#CloudWatch-RUM-unminifyjavascript)
+ [在 RUM 控制台中查看未压缩的堆栈跟踪](#CloudWatch-RUM-viewunminifiedstacktraces)
+ [在 CloudWatch Logs 中查看未压缩的堆栈跟踪](#CloudWatch-RUM-viewunminifiedstacktracesCWL)
+ [排查源映射问题](#CloudWatch-RUM-troubleshootsourcemaps)

## 配置 Amazon S3 存储桶资源策略以允许 RUM 服务访问
<a name="CloudWatch-RUM-ConfigureS3"></a>

确保 Amazon S3 存储桶与 RUM appMonitor 位于同一区域。配置 Amazon S3 存储桶，允许 RUM 服务访问以检索源映射文件。包含 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键，以限制服务对资源的权限。这是防范[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)最有效的方法。

以下示例演示如何使用 Amazon S3 中的 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键来防范混淆代理问题。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "RUM Service S3 Read Permissions",
            "Effect": "Allow",
            "Principal": {
                "Service": "rum.amazonaws.com"
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME",
                "arn:aws:s3:::BUCKET_NAME/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "ACCOUNT_ID",
                    "aws:SourceArn": "arn:aws:rum:REGION:ACCOUNT_ID:appmonitor/APP_MONITOR_NAME"
                }
            }
        }
    ]
}
```

------

如果您使用 AWS KMS 密钥来加密数据，请确保密钥的资源策略配置为包含 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键，授予 RUM 服务使用密钥检索源映射文件的访问权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "RUM Service KMS Read Permissions",
            "Effect": "Allow",
            "Principal": {
                "Service": "rum.amazonaws.com"
            },
            "Action": "kms:Decrypt",
            "Resource": "arn:aws:kms:us-east-1:123456789012:key/KEY_ID",
            "Condition": {
                "StringEquals": {
                "aws:SourceAccount": "123456789012",
    "aws:SourceArn": "arn:aws:rum:us-east-1:123456789012/APP_MONITOR_NAME"
                }
            }
        }
    ]
}
```

------

## 上传源映射
<a name="CloudWatch-RUM-UploadSourceMaps"></a>

配置 JavaScript 捆绑包以在压缩期间生成源映射。当您构建应用程序时，捆绑包将创建一个目录（例如 dist），其中包含压缩的 JavaScript 文件及其相应的源映射。有关示例，请参阅以下内容。

```
./dist
    |-index.d5a07c87.js
    |-index.d5a07c87.js.map
```

将源映射文件上传到您的 Amazon S3 存储桶。文件位于名为 `releaseId` 的文件夹中。例如，如果我的存储桶名称为 `my-application-source-maps`，且 `releaseId` 为 2.0.0，则源映射文件位于以下位置：

```
my-application-source-maps
    |-2.0.0
        |-index.d5a07c87.js.map
```

要自动上传源映射，可以创建以下 bash 脚本，并在构建过程中执行。

```
#!/bin/bash
# Ensure the script is called with required arguments
if [ "$#" -ne 2 ]; then
 echo "Usage: $0 S3_BUCKET_NAME RELEASE_ID"
 exit 1
fi

# Read arguments
S3_BUCKET="$1"
RELEASE_ID="$2"

# Set the path to your build directory
BUILD_DIR="./dist"


# Upload all .map files recursively
 if aws s3 cp "$BUILD_DIR" "s3://$S3_BUCKET/$RELEASE_ID/" --recursive --exclude "*" --include "*.map"; then
    echo "Successfully uploaded all source map files"
else
    echo "Failed to upload source map files"
fi
```

## 在 CloudWatch RUM Web 客户端中配置 releaseId
<a name="CloudWatch-RUM-ConfigureRumID"></a>

CloudWatch RUM 使用配置的 `releaseId` 来确定用于检索源映射文件的文件夹。将 `releaseId` 命名为与源映射文件的文件夹相同的名称。如果您使用上面提供的 bash 脚本或类似的脚本，则脚本中配置的 `releaseId` 应与 CloudWatch RUM Web 客户端中配置的相同。必须使用 1.21.0 或更高版本的 CloudWatch RUM Web 客户端。

```
import { AwsRum, AwsRumConfig } from "aws-rum-web";

try {
    const config: AwsRumConfig = {
        sessionSampleRate: 1,
        endpoint: "https://dataplane.rum.us-west-2.amazonaws.com",
        telemetries: ["performance", "errors", "http"],
        allowCookies: true,
        releaseId: "RELEASE_ID", //Add this
    };

    const APPLICATION_ID: string = "APP_MONITOR_ID";
    const APPLICATION_VERSION: string = "1.0.0";
    const APPLICATION_REGION: string = "us-west-2";

    new AwsRum(APPLICATION_ID, APPLICATION_VERSION, APPLICATION_REGION, config);
} catch (error: any) {
    // Ignore errors thrown during CloudWatch RUM web client initialization
}
```

## 启用 CloudWatch RUM 应用程序监测仪以取消压缩 JavaScript 堆栈跟踪
<a name="CloudWatch-RUM-unminifyjavascript"></a>

要取消压缩 JavaScript 堆栈跟踪记录，请将应用程序监测仪的 SourceMap 状态设置为 `ENABLED`。为包含应用程序监测仪所有源映射的存储桶或文件夹提供 Amazon S3 URI。

如果将源映射直接存储在主存储桶中（而不是子文件夹中），则 Amazon S3 URI 的格式应为 `Amazon S3://BUCKET_NAME`。在此情况下，源映射文件应位于以下位置。

```
BUCKET_NAME
    |- RELEASE_ID
        |-index.d5a07c87.js.map
```

当子目录为根目录时，Amazon S3 URI 的格式应为 `Amazon S3://BUCKET_NAME/DIRECTORY`。在此情况下，源映射文件应位于以下位置。

```
BUCKET_NAME
    |- DIRECTORY
        |-RELEASE_ID
            |-index.d5a07c87.js.map
```

## 在 RUM 控制台中查看未压缩的堆栈跟踪
<a name="CloudWatch-RUM-viewunminifiedstacktraces"></a>

将源映射上传到 Amazon S3，在 RUM 应用程序监测仪上启用源映射，并使用在 CloudWatch RUM Web 客户端中配置的 `releaseId` 部署 Web 应用程序后，在 RUM 控制台中选择**事件**。此选项卡显示原始 RUM 事件数据。按 JS 错误事件类型筛选，查看最新的 JS 错误事件。对于启用该功能后摄取的事件，您将在新的 `event_details.unminifiedStack` 字段中看到未压缩的堆栈跟踪。

## 在 CloudWatch Logs 中查看未压缩的堆栈跟踪
<a name="CloudWatch-RUM-viewunminifiedstacktracesCWL"></a>

打开**数据存储**，在 CloudWatch Logs 中启用 RUM 事件存储。启用后，您可以搜索新的 **event\$1details.unminifiedStack** 字段。这使您可以使用 CloudWatch Logs 查询分析趋势并关联多个会话中的问题。

## 排查源映射问题
<a name="CloudWatch-RUM-troubleshootsourcemaps"></a>

CloudWatch RUM 提供了现成的指标来排查源映射设置的问题。这些指标在名为 `AWS/RUM` 的指标命名空间中发布。以下指标通过 application\$1name 维度发布。此维度的值为应用程序监控的名称。这些指标还通过 `aws:releaseId` 维度发布。该维度的值是与 JavaScript 错误事件关联的 `releaseId`。


| MetricName | 单位 | 说明 | 
| --- | --- | --- | 
|  UnminifyLineFailureCount  |  计数  |  JS 错误事件中未能取消压缩的堆栈跟踪行数。有关失败的其他详细信息将添加到 event\$1details.unminifiedStack 字段中失败的特定行中。  | 
|  UnminifyLineSuccessCount  |  计数  | JS 错误事件中成功取消压缩的堆栈跟踪行数。 | 
| UnminifyEventFailureCount | 计数 | 未能取消压缩任何行的 JS 错误事件数。有关失败的其他详细信息将添加到 event\$1details.unminifiedStack 字段中。 | 
| UnminifyEventSuccessCount | 计数 | 成功取消压缩至少一个堆栈跟踪行的 JS 错误事件数。 | 

CloudWatch RUM 可能由于各种原因无法取消压缩堆栈跟踪中的某一行，包括但不限于：
+ 由于权限问题，无法检索对应的源映射文件。确保存储桶资源策略配置正确。
+ 对应的源映射文件不存在。确保源映射文件已上传到正确的存储桶或文件夹，其名称与 CloudWatch RUM Web 客户端中配置的 releaseId 相同。
+ 对应的源映射文件太大。将源代码拆分成小块。
+ 为堆栈跟踪检索到的源映射文件已达 50MB。减少堆栈跟踪长度，因为 50MB 是服务端限制。
+ 源映射无效，无法建立索引。确保源映射是遵循源映射 V3 规范定义的结构的纯 JSON，并包含以下字段：版本、文件、来源、名称、映射。
+ 源映射无法将压缩的源代码映射回未压缩的堆栈跟踪。确保源映射是给定 releaseId 的正确源映射。

# 区域化
<a name="CloudWatch-RUM-Regionalization"></a>

本节说明了在不同区域的应用程序中使用 CloudWatch RUM 的策略。

## 应用程序部署在多个 AWS 区域
<a name="CloudWatch-RUM-Regionalization-multiple"></a>

如果应用程序部署在多个 AWS 区域，您有三种选择：
+ 在一个区域、一个账户中部署一个应用程序监视器，为所有区域提供服务。
+ 在唯一的账户中为每个区域部署单独的应用程序监视器。
+ 为每个地区部署单独的应用程序监视器，并且都在一个账户中。

使用一个应用程序监视器的优势在于，所有数据都将集中到一个可视化效果中，并且所有日志都写入 CloudWatch Logs 中的同一个日志组。使用单个应用程序监视器时，请求会有少量的额外延迟，并且会出现单点故障。

使用多个应用程序监视器可以消除单点故障，但可以防止将所有数据合并为一个可视化效果。

### CloudWatch RUM 尚未在我的应用程序部署的某些区域中启动
<a name="CloudWatch-RUM-Regionalization-notavailable"></a>

CloudWatch RUM 已在许多地区推出，具有广泛的地理覆盖范围。通过在 CloudWatch RUM 可用的区域设置 CloudWatch RUM，您可以获得好处。如果您在终端用户所连接的区域中设置了应用程序监视器，则终端用户可以随时随地访问他们的会话。

但是，CloudWatch RUM 尚未在中国任何地区推出。您无法从这些区域向 CloudWatch RUM 发送数据。

# 使用页面组
<a name="CloudWatch-RUM-page-groups"></a>

使用页面组将应用程序中的不同页面相互关联，以便您可以查看页面组的汇总分析。例如，您可能希望查看所有登录页面的汇总页面加载时间。

您可以在 CloudWatch RUM Web 客户端中向页面查看事件添加一个或多个标签，从而将页面放入页面组中。以下示例将 `/home` 页面放入名为 `en` 的页面组和名为 `landing` 的页面组。

**嵌入式脚本示例**

```
cwr('recordPageView', { pageId: '/home', pageTags: ['en', 'landing']});
```

**JavaScript 模块示例**

```
awsRum.recordPageView({ pageId: '/home', pageTags: ['en', 'landing']});
```

**注意**  
页面组旨在促进对不同页面进行聚合分析。有关如何定义和操作应用程序的 `pageIds` 的信息，请参阅 [修改代码片段以配置 CloudWatch RUM Web 客户端（可选）](CloudWatch-RUM-modify-snippet.md) 中的**手动记录页面浏览量**部分。

# 指定自定义元数据
<a name="CloudWatch-RUM-custom-metadata"></a>

CloudWatch RUM 将额外的数据作为元数据附加到每个事件。事件元数据由键值对形式的属性组成。您可以使用这些属性在 CloudWatch RUM 控制台中搜索或筛选事件。默认情况下，CloudWatch RUM 会为您创建一些元数据。有关默认元数据的更多信息，请参阅 [RUM 事件元数据](CloudWatch-RUM-datacollected.md#CloudWatch-RUM-datacollected-metadata)。

您还可以使用 CloudWatch RUM Web 客户端将自定义元数据添加到 CloudWatch RUM 事件中。自定义元数据可以包括会话属性和页面属性。

要添加自定义元数据，必须使用 1.10.0 或更高版本的 CloudWatch RUM Web 客户端。

## 要求和语法
<a name="CloudWatch-RUM-custom-metadata-syntax"></a>

每个事件可以在元数据中包含多达 10 个自定义属性。自定义属性的语法要求如下：
+ **键**
  + 最多 128 个字符
  + 可以包含字母数字字符、冒号（:）和下划线（\$1）
  + 不能以 `aws:` 开头。
  + 不能完全由以下列出的任何保留关键字组成。可以将这些关键字用作较长键名的一部分。
+ **值**
  + 最多 256 个字符
  + 必须是字符串、数字或布尔值

**保留关键字**

您不能将以下保留关键字用作完整的键名。您可以使用以下关键字作为较长键名的一部分，例如 `applicationVersion`。
+ `browserLanguage`
+ `browserName`
+ `browserVersion`
+ `countryCode`
+ `deviceType`
+ `domain`
+ `interaction`
+ `osName`
+ `osVersion`
+ `pageId`
+ `pageTags`
+ `pageTitle`
+ `pageUrl`
+ `parentPageId`
+ `platformType`
+ `referrerUrl`
+ `subdivisionCode`
+ `title`
+ `url`
+ `version`

**注意**  
如果属性包含无效的键或值，或者已经达到每个事件 10 个自定义属性的限制，则 CloudWatch RUM 会从 RUM 事件中删除自定义属性。

## 添加会话属性
<a name="CloudWatch-RUM-session-attributes"></a>

如果您配置自定义会话属性，这些属性会添加到会话的所有事件中。您可以在 CloudWatch RUM Web 客户端初始化期间或运行时使用 `addSessionAttributes` 命令配置会话属性。

例如，您可以将应用程序版本添加为会话属性。然后，在 CloudWatch RUM 控制台中，您可以按版本筛选错误，以确定错误率增加是否与应用程序的特定版本有关。

**在初始化期间添加会话属性，NPM 示例**

粗体代码部分添加了会话属性。

```
import { AwsRum, AwsRumConfig } from 'aws-rum-web';

try {
  const config: AwsRumConfig = {
    allowCookies: true,
    endpoint: "https://dataplane.rum.us-west-2.amazonaws.com",
    guestRoleArn: "arn:aws:iam::000000000000:role/RUM-Monitor-us-west-2-000000000000-00xx-Unauth",
    identityPoolId: "us-west-2:00000000-0000-0000-0000-000000000000",
    sessionSampleRate: 1,
    telemetries: ['errors', 'performance'],
    sessionAttributes: {
        applicationVersion: "1.3.8"
    }
  };

  const APPLICATION_ID: string = '00000000-0000-0000-0000-000000000000';
  const APPLICATION_VERSION: string = '1.0.0';
  const APPLICATION_REGION: string = 'us-west-2';

  const awsRum: AwsRum = new AwsRum(
    APPLICATION_ID,
    APPLICATION_VERSION,
    APPLICATION_REGION,
    config
  );
} catch (error) {
  // Ignore errors thrown during CloudWatch RUM web client initialization
}
```

**在运行时添加会话属性，NPM 示例**

```
awsRum.addSessionAttributes({ 
    applicationVersion: "1.3.8"    
})
```

**在初始化期间添加会话属性，嵌入式脚本示例**

粗体代码部分添加了会话属性。

```
<script>
    (function(n,i,v,r,s,c,u,x,z){...})(
        'cwr',
        '00000000-0000-0000-0000-000000000000',
        '1.0.0',
        'us-west-2',
        'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js',
        {
            sessionSampleRate:1,
            guestRoleArn:'arn:aws:iam::000000000000:role/RUM-Monitor-us-west-2-000000000000-00xx-Unauth',
            identityPoolId:'us-west-2:00000000-0000-0000-0000-000000000000',
            endpoint:'https://dataplane.rum.us-west-2.amazonaws.com',
            telemetries:['errors','http','performance'],
            allowCookies:true,
            sessionAttributes: {
                applicationVersion: "1.3.8"
            }
        }
    );
</script>
```

**在运行时添加会话属性，嵌入式脚本示例**

```
<script>
    function addSessionAttribute() {
        cwr('addSessionAttributes', {
            applicationVersion: "1.3.8"
        })
    }
            
</script>
```

## 添加页面属性
<a name="CloudWatch-RUM-page-attributes"></a>

如果您配置自定义页面属性，这些属性会添加到当前页面上的所有事件中。您可以在 CloudWatch RUM Web 客户端初始化期间或运行时使用 `recordPageView` 命令配置页面属性。

例如，您可以将页面模板添加为页面属性。然后，在 CloudWatch RUM 控制台中，您可以按页面模板筛选错误，以确定错误率增加是否与应用程序的特定页面模板有关。

**在初始化期间添加页面属性，NPM 示例**

粗体代码部分添加了页面属性。

```
const awsRum: AwsRum = new AwsRum(
    APPLICATION_ID,
    APPLICATION_VERSION,
    APPLICATION_REGION,
    { disableAutoPageView:  true // optional }
);
awsRum.recordPageView({  
    pageId:'/home',  
    pageAttributes: {
      template: 'artStudio'
    }
});
const credentialProvider = new CustomCredentialProvider();
if(awsCreds) awsRum.setAwsCredentials(credentialProvider);
```

**在运行时添加页面属性，NPM 示例**

```
awsRum.recordPageView({ 
    pageId: '/home', 
    pageAttributes: {
        template: 'artStudio'
    } 
});
```

**在初始化期间添加页面属性，嵌入式脚本示例**

粗体代码部分添加了页面属性。

```
<script>
    (function(n,i,v,r,s,c,u,x,z){...})(
        'cwr',
        '00000000-0000-0000-0000-000000000000',
        '1.0.0',
        'us-west-2',
        'https://client.rum.us-east-1.amazonaws.com/1.0.2/cwr.js',
        {
            disableAutoPageView: true //optional
        }
    );
    cwr('recordPageView', { 
       pageId: '/home',  
       pageAttributes: {
           template: 'artStudio'
       }
    });
    const awsCreds = localStorage.getItem('customAwsCreds');
    if(awsCreds) cwr('setAwsCredentials', awsCreds)
</script>
```

**在运行时添加页面属性，嵌入式脚本示例**

```
<script>
    function recordPageView() {
        cwr('recordPageView', { 
            pageId: '/home', 
            pageAttributes: {
                template: 'artStudio'
            }
        });
    }        
</script>
```

## 在控制台中按元数据属性筛选
<a name="CloudWatch-RUM-custom-attiributes-console"></a>

要使用任何内置或自定义元数据属性在 CloudWatch RUM 控制台中筛选可视化内容，请使用搜索栏。在搜索栏中，您可以通过 **key=value** 的形式指定多达 20 个筛选词用于可视化内容。例如，如果要仅筛选 Chrome 浏览器的数据，可以添加筛选词 **browserName=Chrome**。

默认情况下，CloudWatch RUM 控制台会检索 100 个最常见的属性键和值，并将它们显示在搜索栏的下拉列表中。要添加更多元数据属性作为筛选词，请在搜索栏中输入完整的属性键和值。

一个筛选条件可以包含多达 20 个筛选词，每个应用程序监视器最多可以保存 20 个筛选条件。当您保存筛选条件时，筛选条件会保存在 **Saved filters**（保存的筛选条件）下拉列表中。您还可以删除保存的筛选条件。

# 发送自定义事件
<a name="CloudWatch-RUM-custom-events"></a>

CloudWatch RUM 可记录并摄取 [CloudWatch RUM Web 客户端收集的信息](CloudWatch-RUM-datacollected.md) 中列出的事件。如果您使用 1.12.0 或更高版本的 CloudWatch RUM Web 客户端，则您可以定义、记录和发送其他自定义事件。对于您定义的每个事件类型，您可以定义事件类型名称和要发送的数据。每个自定义事件负载最多可达 6KB。

只有当应用程序监视器启用了自定义事件时，才会摄取自定义事件。要更新应用程序监视器的配置设置，请使用 CloudWatch RUM 控制台或 [UpdateAppMonitor](https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_UpdateAppMonitor.html) API。

启用自定义事件，然后定义和发送自定义事件，即可搜索它们。要搜索自定义事件，请使用 CloudWatch RUM 控制台中的 **Events**（事件）选项卡。请使用事件类型进行搜索。

## 要求和语法
<a name="CloudWatch-RUM-custom-event-syntax"></a>

自定义事件由事件类型和事件详细信息组成。其要求如下：
+ **事件类型**
  + 这可以是事件的 **type**（类型）或 **name**（名称）。例如，名为 **JsError** 的 CloudWatch RUM 内置事件类型的事件类型为 `com.amazon.rum.js_error_event`。
  + 长度必须介于 1-256 个字符之间。
  + 可以是字母数字字符、下划线、连字符和句点的组合。
+ **事件详细信息**
  + 包含要在 CloudWatch RUM 中记录的实际数据。
  + 必须是由字段和值组成的对象。

## 记录自定义事件的示例
<a name="CloudWatch-RUM-custom-event-examples"></a>

有两种方法可以在 CloudWatch RUM Web 客户端中记录自定义事件。
+ 使用 CloudWatch RUM Web 客户端的 `recordEvent` API。
+ 使用自定义插件。

**使用 `recordEvent` API 发送自定义事件，NPM 示例**

```
awsRum.recordEvent('my_custom_event', {
        location: 'IAD', 
        current_url: 'amazonaws.com', 
        user_interaction: {
            interaction_1 : "click",
            interaction_2 : "scroll"
        }, 
        visit_count:10
    }
)
```

**使用 `recordEvent` API 发送自定义事件，嵌入式脚本示例**

```
cwr('recordEvent', {
    type: 'my_custom_event', 
    data: {
        location: 'IAD', 
        current_url: 'amazonaws.com', 
        user_interaction: {
            interaction_1 : "click",
            interaction_2 : "scroll"
        }, 
        visit_count:10
    }
})
```

**使用自定义插件发送自定义事件的示例**

```
// Example of a plugin that listens to a scroll event, and
// records a 'custom_scroll_event' that contains the timestamp of the event.
class MyCustomPlugin implements Plugin {
    // Initialize MyCustomPlugin.
    constructor() {
        this.enabled;
        this.context;
        this.id = 'custom_event_plugin';
    }
    // Load MyCustomPlugin.
    load(context) {
        this.context = context;
        this.enable();
    }
    // Turn on MyCustomPlugin.
    enable() {
        this.enabled = true;
        this.addEventHandler();
    }
    // Turn off MyCustomPlugin.
    disable() {
        this.enabled = false;
        this.removeEventHandler();
    }
    // Return MyCustomPlugin Id.
    getPluginId() {
        return this.id;
    }
    // Record custom event.
    record(data) {
        this.context.record('custom_scroll_event', data);
    }
    // EventHandler.
    private eventHandler = (scrollEvent: Event) => {
        this.record({timestamp: Date.now()})
    }
    // Attach an eventHandler to scroll event.
    private addEventHandler(): void {
        window.addEventListener('scroll', this.eventHandler);
    }
    // Detach eventHandler from scroll event.
    private removeEventHandler(): void {
        window.removeEventListender('scroll', this.eventHandler);
    }
}
```

# 查看 CloudWatch RUM 控制面板
<a name="CloudWatch-RUM-view-data"></a>

CloudWatch RUM 可帮助您从用户会话中收集有关应用程序性能的数据，包括加载时间、Apdex 分数、设备信息、用户会话的地理位置以及存在错误的会话。所有这些信息都显示在控制面板中。

要查看 RUM 控制面板，请执行以下操作：

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择 **Application Signals**、**RUM**。

RUM 控制台将显示所有应用程序监视器的列表视图。**平台**列将指示每个应用程序监视器是用于 Web、Android 还是 iOS 应用程序。选择应用程序监视器，以访问包含**性能**、**错误**、**会话**、**指标**和**配置**选项卡的详细视图。

## Web 应用程序控制面板
<a name="CloudWatch-RUM-web-dashboard"></a>

如果选择 Web 应用程序监视器，将会看到以下选项卡：
+ **性能**选项卡显示页面性能信息，包括加载时间、请求信息、Web 重要信息和一段时间内的页面加载次数。此视图具有交互式 Web 重要信息图表，您可以在其中查看页面核心 Web 重要信息的不同百分位数值，并在图表上选择数据点以查看 CloudWatch RUM 捕获的相关事件。在该视图中，您可以浏览更多与指标峰值相关的事件，也可以查看选定事件的页面详细信息，进而确定导致性能问题的特定条件。

  在此选项卡上，您还可以在**页面加载**、**请求**和**位置**之间切换视图，进而查看有关页面性能的更多详细信息。
+ **错误**选项卡显示 Javascript 错误信息，包括用户最常看到的错误信息以及错误最多的设备和浏览器。此视图包括错误的直方图和错误的列表视图。您可以按用户和事件详细信息筛选错误列表。选择一条错误消息可查看更多详细信息。
+ **HTTP 请求**选项卡显示 HTTP 请求信息，包括错误最多的请求 URL 以及错误最多的设备和浏览器。此选项卡包括请求的直方图、请求的列表视图以及网络错误的列表视图。您可以按用户和事件详细信息筛选列表。选择响应代码或错误消息，以分别查看有关请求或网络错误的更多详细信息。
+ **会话**选项卡显示会话指标。此选项卡包括会话启动事件的直方图和会话的列表视图。您可以按事件类型、用户详细信息和事件详细信息筛选会话列表。选择 **sessionID** 可查看有关会话的更多详细信息。
+ **事件**选项卡显示 RUM 事件的直方图和事件的列表视图。您可以按事件类型、用户详细信息和事件详细信息筛选事件列表。选择 RUM 事件可查看原始事件。
+ **Browsers & Device**（浏览器和设备）选项卡显示访问应用程序的不同浏览器和设备的性能和使用情况等信息。此视图包括在**浏览器**和**设备**焦点间切换视图的控件。

  如果将范围缩小到单个浏览器，则会看到按浏览器版本细分的数据。
+ **User Journey**（用户历程）选项卡显示客户用于导航应用程序的路径。您可以看到客户进入应用程序的位置以及从应用程序退出的页面。您还可以看到其所用的路径以及遵循这些路径的客户百分比。您可以在节点上暂停以获取有关该页面的更多详细信息。您可以选择单个路径来突出显示连接以便更轻松查看。
+  **指标**选项卡将显示应用程序监视器发布的所有默认 CloudWatch 指标，包括性能 Web 重要信息、错误指标（JavaScript 错误、HTTP 错误/故障）、数量、用户流程和 Apdex 指标。如果您为应用程序创建了扩展指标，该选项卡还会在扩展指标部分包含这些指标的子集。该子集包括类型为 PageViewCount、PerformanceNavigationDuration、Http4xxCount、Http5xxCount 和 JsErrorCount 的指标。对于每种指标类型，控制面板会显示三个指标变体。由于这些是 CloudWatch 指标，您还可以使用**添加到控制面板**选项，将此选项卡导出到自己的控制面板，并对其进行更新以包含更多指标。

（可选）在前六个选项卡中的任何一个选项卡上，可以选择**页面**按钮，并从列表中选择一个页面或页面组。这会将显示的数据缩小到应用程序的单个页面或页面组。您还可以将列表中的页面和页面组标记为收藏。

## 移动应用程序控制面板
<a name="CloudWatch-RUM-mobile-dashboard"></a>

如果选择移动应用程序监视器，将会看到以下选项卡：
+ **性能**选项卡可让您深入了解移动应用程序的性能，包括屏幕加载时间、应用程序启动时间（冷启动和热启动）、性能指标以及 Apdex 分数随时间变化的情况。详细视图按屏幕名称、操作系统版本、应用程序版本、设备和国家/地区，对性能进行了细分。单击图表中的屏幕加载时间、应用程序启动时间或位置数据点，将打开右侧的诊断面板，该面板会提供与数据点相关的更多见解，包括最新的相关会话，以及**会话**选项卡链接，以便进行问题排查。

  在此选项卡上，您还可以在**屏幕加载**、**应用程序启动**和**位置**视图之间切换，查看有关应用程序性能的更多详细信息。

  该选项卡还包含应用程序性能指数（Apdex）分数，用于表示最终用户的满意度。分数范围为 0（最不满意）到 1（最满意）。分数仅基于应用程序性能。有关 Apdex 分数的更多信息，请参阅 [CloudWatch RUM 如何设置 Apdex 分数](#CloudWatch-RUM-apdex)。
+ **错误**选项卡将应用程序问题分为三类：网络错误、崩溃和 ANR（Android）/应用程序无响应（iOS）。**网络错误**选项卡包含折线图，用于显示网络延迟、客户端错误（4xx 状态代码）和服务器错误（5xx 状态代码）。单击图表中任何一条线条的数据点，将打开诊断面板。底部表格列出了 100 个最常见的网络路由。单击单选按钮将按所选网络路由筛选折线图。

  同样地，**崩溃**和 **ANR/应用程序无响应**选项卡将显示每个错误计数的折线系列，这些系列是可交互的。底部表格将显示最常见的顶部崩溃消息或 ANR/应用程序无响应堆栈跟踪。单击单选按钮将筛选图表，单击错误消息则将显示完整的堆栈跟踪。
+ **会话**选项卡将显示表格，其中按时间降序列出所有会话。底部瀑布可视化将显示所选会话的所有遥测数据，帮助您跟踪用户交互并识别性能问题。选择瀑布图中的任意一行，可以打开诊断面板。对于 HTTP 请求，您将看到链接到“跟踪”控制台的 **traceId**。

  对于状态代码非 2xx、崩溃或 ANR（Android）/应用程序无响应（iOS）的 HTTP 请求，诊断面板包含带堆栈跟踪的**异常**选项卡。单击瀑布图中的**查看**按钮，可以快速访问此信息。
+ **指标**选项卡将显示应用程序监视器发布的所有默认 CloudWatch 指标，包括性能指标（屏幕加载时间、应用程序冷启动时间）、错误指标（崩溃、ANR/应用程序无响应、HTTP 错误/故障）、数量和 Apdex 指标。如果您为应用程序创建了扩展指标，该选项卡还会在扩展指标部分包含这些指标的子集。该子集包括类型为 ScreenLoadTime、ScreenLoadCount、CrashCount、Http4xxCount、Http5xxCount、ANRCount/AppHangCount、ColdLaunchTime 和 WarmLaunchTime 的指标。对于每种指标类型，控制面板会显示三个指标变体。由于这些是 CloudWatch 指标，您还可以使用**添加到控制面板**选项，将此选项卡导出到自己的控制面板，并对其进行更新以包含更多指标。
+ **配置**选项卡可以提供应用程序监视器常规设置和配置详细信息的访问权限。您还可以访问**代码片段**选项卡，其中包含使用 ADOT SDK 对移动应用程序进行埋点的说明，包括手动埋点和零代码埋点选项。

### CloudWatch RUM 如何设置 Apdex 分数
<a name="CloudWatch-RUM-apdex"></a>

应用程序性能索引 (Apdex) 是一种开放标准，其定义了报告、基准和评估应用程序响应时间的方法。Apdex 分数可帮助您了解和识别随时间推移对应用程序性能的影响。

Apdex 分数表示最终用户的满意度。分数范围为 0（最不满意）到 1（最满意）。分数仅基于应用程序性能。不要求用户对应用程序进行评级。

每个 Apdex 分数均属于三个阈值之一。根据 Apdex 阈值和实际应用程序响应时间，有三种性能，如下所示：
+ **满意**：实际应用程序响应时间小于等于 Apdex 阈值。对于 CloudWatch RUM，此阈值为 2000 毫秒或更低。
+ **尚可**：实际应用程序响应时间大于 Apdex 阈值，但小于或等于 Apdex 阈值的四倍。对于 CloudWatch RUM，此阈值为 2000 – 8000 毫秒。
+ **不满**：实际应用程序响应时间大于 Apdex 阈值的四倍。对于 CloudWatch RUM，此阈值为大于 8000 毫秒。

使用以下公式计算 0-1 Apdex 总分数：

`(positive scores + tolerable scores/2)/total scores * 100`

# 您可以使用 CloudWatch RUM 收集的 CloudWatch 指标
<a name="CloudWatch-RUM-metrics"></a>

本节的表格列出了可以通过 CloudWatch RUM 从 Web 应用程序、移动应用程序或两者自动收集的指标。您可以在 CloudWatch 控制台中查看这些指标。有关更多信息，请参阅 [查看可用的指标](viewing_metrics_with_cloudwatch.md)。

您也可以选择将扩展指标发送到 CloudWatch。有关更多信息，请参阅 [扩展指标](CloudWatch-RUM-custom-and-extended-metrics.md#CloudWatch-RUM-vended-metrics)。

这些指标在名为 `AWS/RUM` 的指标命名空间中发布。所有以下指标通过 `application_name` 维度发布。此维度的值为应用程序监控的名称。部分指标还会通过其他维度发布，如下表所列。


**Web 指标**  

| 指标 | 单位 | 说明 | 
| --- | --- | --- | 
|  `HttpStatusCodeCount` |  计数  |  应用程序中 HTTP 响应的计数，按响应状态代码显示。 其他维度： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-metrics.html)  | 
|  `Http4xxCount` |  计数  |  应用程序中 HTTP 响应的计数，响应状态代码为 4xx。 这些是根据会生成 4xx 代码的 `http_event` RUM 事件计算得出的。  | 
|  `Http4xxCountPerSession` |  计数  |  会话中 HTTP 响应的计数，响应状态代码为 4xx。 这些是根据会生成 4xx 代码的 `http_event` RUM 事件计算得出的。  | 
|  `Http4xxCountPerPageView` |  计数  |  页面审核中 HTTP 响应的计数，响应状态代码为 4xx。 这些是根据会生成 4xx 代码的 `http_event` RUM 事件计算得出的。  | 
|  `Http5xxCount` |  计数  |  应用程序中 HTTP 响应的计数，响应状态代码为 5xx。 这些是根据会生成 5xx 代码的 `http_event` RUM 事件计算得出的。  | 
|  `Http5xxCountPerSession` |  计数  |  会话中 HTTP 响应的计数，响应状态代码为 5xx。 这些是根据会生成 5xx 代码的 `http_event` RUM 事件计算得出的。  | 
|  `Http5xxCountPerPageView` |  计数  |  页面审核中 HTTP 响应的计数，响应状态代码为 5xx。 这些是根据会生成 5xx 代码的 `http_event` RUM 事件计算得出的。  | 
|  `JsErrorCount` |  计数  |  摄入的 JavaScript 错误事件的计数。  | 
|  `JsErrorCountPerSession` |  计数  |  会话中摄入的 JavaScript 错误事件的计数。  | 
|  `JsErrorCountPerPageView` |  计数  |  页面审核中摄入的 JavaScript 错误事件的计数。  | 
|  `NavigationFrustratedTransaction` |  计数  |  比不满阈值 (8000ms) 高出 `duration` 的导航事件的计数。导航事件的持续时间在 `PerformanceNavigationDuration` 指标中跟踪。  | 
|  `NavigationSatisfiedTransaction` |  计数  |  `duration` 低于 Apdex 目标 (2000ms) 的导航事件的计数。导航事件的持续时间在 `PerformanceNavigationDuration` 指标中跟踪。  | 
|  `NavigationToleratedTransaction` |  计数  |  `duration` 在 2000ms 和 8000ms 之间的导航事件的计数。导航事件的持续时间在 `PerformanceNavigationDuration` 指标中跟踪。  | 
|  `PageViewCount` |  计数  |  应用程序监控摄取的页面查看事件的计数。 该计数通过 `page_view_event` RUM 事件的计数计算得出。  | 
|  `PageViewCountPerSession` |  计数  |  会话中页面浏览事件的计数。 | 
|  `PerformanceResourceDuration` |  毫秒  |  资源事件的 `duration`。 其他维度： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-metrics.html)  | 
|  `PerformanceNavigationDuration` |  毫秒  |  导航事件的 `duration`。  | 
|  `RumEventPayloadSize` |  字节  |  CloudWatch RUM 摄入的每个事件的规模。您还可以使用此指标的 `SampleCount` 统计数据来监控应用程序监控摄入的事件数量。  | 
|  `SessionCount` |  计数  |  应用程序监控摄入的会话启动事件的计数。即，已启动的新会话的数量。  | 
|  `SessionDuration` |  毫秒  |  会话的持续时间。这些是根据会话中第一个和最后一个事件之间的时间计算的。  | 
|  `TimeOnPage` |  毫秒  |  页面浏览的持续时间。 这是根据下一次浏览页面之前的时间计算的，而最后一页是根据该页面上第一个和最后一个事件之间的时间计算的。  | 
|  `WebVitalsCumulativeLayoutShift` |  无  |  跟踪累计布局转移事件的值。  | 
|  `WebVitalsFirstInputDelay` |  毫秒  |  跟踪第一个输入延迟事件的值。  | 
|  `WebVitalsLargestContentfulPaint` |  毫秒  |  跟踪最大内容绘制事件的值。  | 
|  `WebVitalsInteractionToNextPaint` |  毫秒  |  跟踪“交互到下次绘制”事件的值。  | 

您可以为移动应用程序配置扩展指标，以提供更多维度进行分析。


**移动指标**  

| 指标 | 单位 | 说明 | 
| --- | --- | --- | 
|  `ANRCount`  |  计数  |  仅适用于 Android：应用程序无响应（ANR）事件的数量，发生在应用程序无响应超过 5 秒，从而导致应用程序崩溃时。  | 
|  `AppHangCount`  |  计数  |  仅适用于 iOS：应用程序在主循环中超过 250 毫秒没有响应的次数。  | 
|  `ColdAppLaunchFrustratedTransaction`  |  计数  |  应用程序冷启动耗时超过 8 秒（可能导致用户不满）的次数。  | 
|  `ColdAppLaunchSatisfiedTransaction`  |  计数  |  应用程序冷启动在 2 秒内完成（提供满意的用户体验）的次数。  | 
|  `ColdAppLaunchToleratedTransaction`  |  计数  |  应用程序冷启动在 2 到 8 秒之间完成（提供尚可但并不理想的用户体验）的次数。  | 
|  `ColdLaunchTime`  |  毫秒  |  从终止状态启动应用程序所需的时间。 对于 Android：从 Application `onCreate` 到第一个 Activity 完成创建的时间。 对于 iOS：从应用程序启动（由 `sysctl` 进程启动命令确定）到 `didBecomeActiveNotification` 的时间。  | 
|  `CrashCount`  |  计数  |  因未处理的异常或操作系统终止而导致的应用程序意外终止的次数。 对于 Android：因未处理的异常或系统终止而导致的崩溃。 对于 iOS：因未处理的异常、致命错误或系统终止而导致的崩溃。 在本地存储崩溃数据，并在下次应用程序启动时报告。  | 
|  `DroppedEventsCount`  |  计数  |  因超过每个事件最大 30 KB 的大小限制而被丢弃的日志事件数量。  | 
|  `DroppedSpansCount`  |  计数  |  因超过每个跨度最大 30 KB 的大小限制而被丢弃的跨度数量。  | 
|  `Http4xxCount`  |  计数  |  记录 Web 或移动应用程序在 HTTP 请求期间遇到的 HTTP 客户端错误数量。  | 
|  `Http5xxCount`  |  计数  |  记录 Web 或移动应用程序在 HTTP 请求期间遇到的 HTTP 服务器错误数量。  | 
|  `LogPayloadSize`  |  字节  |  发送到 CloudWatch RUM 的日志遥测数据的大小（以字节为单位）。 您还可以使用此指标的 `SampleCount` 统计数据来监控应用程序监视器正在提取的日志事件数量。  | 
|  `NetworkLatency`  |  毫秒  |  网络请求完成所需的时间，用于衡量从请求发起到响应完成的往返时间。  | 
|  `ScreenLoadCount`  |  计数  |  屏幕加载总数。  | 
|  `ScreenLoadToleratedTransaction`  |  计数  |  屏幕加载在 2 到 8 秒之间完成（提供尚可但并不理想的用户体验）的次数。  | 
|  `SessionCount`  |  计数  |  与应用程序进行的唯一用户会话总数。会话从用户打开应用程序时开始，在 30 分钟不活动后或明确终止时结束。  | 
|  `SpanPayloadSize`  |  字节  |  发送到 CloudWatch RUM 的跨度遥测数据的大小（以字节为单位）。 您还可以使用此指标的 `SampleCount` 统计数据来监控应用程序监视器正在提取的跨度数量。  | 
|  `WarmAppLaunchFrustratedTransaction`  |  计数  |  应用程序热启动耗时超过 8 秒（可能导致用户不满）的次数。  | 
|  `WarmAppLaunchSatisfiedTransaction`  |  计数  |  应用程序热启动在 2 秒内完成（提供满意的用户体验）的次数。  | 
|  `WarmAppLaunchToleratedTransaction`  |  计数  |  应用程序热启动在 2 到 8 秒之间完成（提供尚可但并不理想的用户体验）的次数。  | 
|  `WarmLaunchTime`  |  毫秒  |  从后台状态启动应用程序所需的时间。 对于 Android：从 Application `onCreate` 到第一个 Activity 完成创建的时间。 对于 iOS：从 `UIApplicationWillEnterForegroundNotification` 到 `didBecomeActiveNotification` 的时间。  | 

# 可以向 CloudWatch 发送的自定义指标和扩展指标
<a name="CloudWatch-RUM-custom-and-extended-metrics"></a>

默认情况下，RUM 应用程序监视器会向 CloudWatch 发送指标。这些默认指标和维度列在[可以使用 CloudWatch RUM 收集的 CloudWatch 指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-metrics.html)中。

您还可以设置应用程序监控，以导出指标。应用程序监控可以发送扩展指标、自定义指标或两者。并将其发送到 CloudWatch。
+ **自定义指标**：自定义指标是由您定义的指标。有了自定义指标，您可以使用任何指标名称和命名空间。要派生指标，您可以使用任何自定义事件、内置事件、自定义属性或默认属性。

  您可以将自定义指标发送到 CloudWatch。
+ **扩展指标**：您还可以将任何默认的 CloudWatch RUM 指标发送到具有其他维度的 CloudWatch。这样，这些指标可以为您提供更精细的视图。

**Topics**
+ [自定义指标](#CloudWatch-RUM-custom-metrics)
+ [扩展指标](#CloudWatch-RUM-vended-metrics)

## 自定义指标
<a name="CloudWatch-RUM-custom-metrics"></a>

要发送自定义指标，您必须使用 AWS API 或 AWS CLI 而不是控制台。有关使用 AWS API 的信息，请参阅 [PutRumMetricsDestination](https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_PutRumMetricsDestination.html) 和 [BatchCreateRumMetricDefinitions](https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_BatchCreateRumMetricDefinitions.html)。

一个目标可以包含的扩展指标定义和自定义指标定义的最大数量是 2000。对于您发送到每个目标的每个扩展指标，维度名称和维度值的每个组合都计入此限制。您无需为从 CloudWatch RUM 的任何类型的事件或属性派生的自定义指标付费。

以下示例演示了如何创建从自定义事件派生的自定义指标。以下是使用的自定义事件示例：

```
cwr('recordEvent', {
    type: 'my_custom_event', 
    data: {
        location: 'IAD', 
        current_url: 'amazonaws.com', 
        user_interaction: {
            interaction_1 : "click",
            interaction_2 : "scroll"
        }, 
        visit_count:10
    }
})
```

根据此自定义事件，您可以创建一个自定义指标，用于计算 Chrome 浏览器访问该 `amazonaws.com` URL 的次数。以下定义在 `RUM/CustomMetrics/PageVisits` 命名空间中创建一个在您的账户中名为 `AmazonVisitsCount` 的指标。

```
{
    "AppMonitorName":"customer-appMonitor-name",
    "Destination":"CloudWatch",
    "MetricDefinitions":[
        {
            "Name":"AmazonVisitsCount",
            "Namespace":"PageVisit",
            "ValueKey":"event_details.visit_count",
            "UnitLabel":"Count",
            "DimensionKeys":{
                "event_details.current_url": "URL"
            },
            "EventPattern":"{\"metadata\":{\"browserName\":[\"Chrome\"]},\"event_type\":[\"my_custom_event\"],\"event_details\": {\"current_url\": [\"amazonaws.com\"]}}" 
        }
    ]
}
```

## 扩展指标
<a name="CloudWatch-RUM-vended-metrics"></a>

如果您设置了扩展指标，便可将任何默认的 CloudWatch RUM 指标发送到具有其他维度的 CloudWatch，以便这些指标提供更精细的视图。

有关默认 CloudWatch RUM 指标的更多信息，请参阅 [您可以使用 CloudWatch RUM 收集的 CloudWatch 指标](CloudWatch-RUM-metrics.md)。

一个目标可以包含的扩展指标定义和自定义指标定义的最大数量是 2000。对于您发送到每个目标的每个扩展指标或自定义指标，维度名称和维度值的每个组合都算作此限制的扩展指标。

向 CloudWatch 发送扩展指标时，您可以使用 CloudWatch RUM 控制台为它们创建 CloudWatch 告警。

您无需为针对 CloudWatch RUM 的默认指标创建的扩展指标付费。

### Web 应用程序扩展指标
<a name="CloudWatch-RUM-web-extended-metrics"></a>

Web 应用程序扩展指标支持以下维度：
+ `BrowserName`

  维度值示例：`Chrome`、`Firefox`、`Chrome Headless`
+ `CountryCode` 使用 ISO-3166 格式，带有两个字母的代码。

  维度值示例：`US`、`JP`、`DE`
+ `DeviceType`

  维度值示例：`desktop`、`mobile`、`tablet`、`embedded`
+ `FileType`

  维度值示例：`Image`、`Stylesheet`
+ `OSName`

  维度值示例：`Linux`、`Windows`、`iOS`、`Android`
+ `PageId`

### 移动应用程序扩展指标
<a name="CloudWatch-RUM-mobile-extended-metrics"></a>

移动应用程序指标支持以下维度：
+ `ScreenName`
  + 来自应用程序屏幕名称属性 `attributes.screen.name` 的值
  + 示例值：HomeScreen、SettingsView、ProfilePage
+ `DeviceModel`
  + 来自设备型号属性 `resource.attributes.device.model.name` 的值
  + 示例值：iPhone14,3、SM-G998B
+ `OSVersion`
  + 来自操作系统版本属性 `resource.attributes.os.version` 的值
  + 示例值：16.0、13.0

**注意**  
移动应用程序目前支持的默认指标：`ScreenLoadTime`、`ScreenLoadCount`、`NetworkLatency`、`Http4xxCount`、`Http5xxCount`、`CrashCount`、`ANRCount`、`AppHangCount`、`ColdLaunchTime`、`WarmLaunchTime`、`SessionCount`、`SpanPayloadSize` 和 `LogPayloadSize`。

### 使用控制台设置扩展指标
<a name="CloudWatch-RUM-extended-metrics-console"></a>

要使用控制台向 CloudWatch 发送扩展指标，请执行以下步骤。

有关使用 AWS API 将扩展指标发送到 CloudWatch 的信息，请参阅 [PutRumMetricsDestination](https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_PutRumMetricsDestination.html) 和 [BatchCreateRumMetricDefinitions](https://docs.aws.amazon.com/cloudwatchrum/latest/APIReference/API_BatchCreateRumMetricDefinitions.html)。

**要使用控制台设置应用程序监视器并向 CloudWatch 发送 RUM 扩展指标**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择 **Application Signals**、**RUM**。

1. 选择要发送指标的应用程序监视器名称。

1. 选择 **Configuration**（配置）选项卡，然后选择 **RUM extended metrics**（RUM 扩展指标）。

1. 选择 **Send metrics**（发送指标）。

1. 选择一个或多个与其他维度一起发送的指标名称。

1. 选择一个或多个因子用作这些指标的维度。当您做出选择时，您选择创建的扩展指标数量将显示在 **Number of extended metrics**（扩展指标数量）中。

   该数字的计算方法是将所选指标名称的数量乘以您创建的不同维度的数量。

   1. 要发送以页面 ID 作为维度的指标，请选择 **Browse for page ID**（浏览页面 ID），然后选择要使用的页面 ID。

   1. 要发送以设备类型作为维度的指标，请选择 **Desktop devices**（桌面设备）或 **Mobile and tablets**（移动设备和平板电脑）。

   1. 要发送以操作系统作为维度的指标，请在 **Operating system**（操作系统）下选择一个或多个操作系统。

   1. 要发送以浏览器类型作为维度的指标，请在 **Browsers**（浏览器）下选择一个或多个浏览器。

   1. 要发送以地理位置作为维度的指标，请在 **Locations**（位置）下选择一个或多个位置。

      只有此应用程序监视器报告指标的位置才会出现在列表中供您选择。

1. 完成选择后，选择 **Send metrics**（发送指标）。

1. （可选）在 **Extended metrics**（扩展指标）列表中，如要创建监视其中一个指标的告警，请在该指标行中选择 **Create alarm**（创建告警）。

   有关 CloudWatch 告警的一般信息，请参阅 [使用 Amazon CloudWatch 告警](CloudWatch_Alarms.md)。有关为 CloudWatch RUM 扩展指标设置告警的教程，请参阅 [教程：创建扩展指标并为其设置告警](#CloudWatch-RUM-extended-metrics-alarmtutorial)。

**停止发送扩展指标**

**使用控制台停止发送扩展指标**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择 **Application Signals**、**RUM**。

1. 选择要发送指标的应用程序监视器名称。

1. 选择 **Configuration**（配置）选项卡，然后选择 **RUM extended metrics**（RUM 扩展指标）。

1. 选择一个或多个指标名称和维度组合以停止发送。然后选择 **Actions**（操作）、**Delete**（删除）。

### 教程：创建扩展指标并为其设置告警
<a name="CloudWatch-RUM-extended-metrics-alarmtutorial"></a>

本教程将演示如何设置要发送到 CloudWatch 的扩展指标，以及如何为该指标设置告警。在本教程中，您将创建一个指标来跟踪 Chrome 浏览器上的 JavaScript 错误。

**设置该扩展指标并为其设置告警**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择 **Application Signals**、**RUM**。

1. 选择要发送指标的应用程序监视器名称。

1. 选择 **Configuration**（配置）选项卡，然后选择 **RUM extended metrics**（RUM 扩展指标）。

1. 选择 **Send metrics**（发送指标）。

1. 选择 **JSErrorCount**。

1. 在 **Browsers**（浏览器）下，选择 **Chrome**。

   这种 **JSErrorCount** 和 **Chrome** 的组合将向 CloudWatch 发送一个扩展指标。该指标仅计算使用 Chrome 浏览器的用户会话的 JavaScript 错误。指标名称将是 **JSErrorCount**，维度名称将是 **Browser**（浏览器）。

1. 选择 **Send metrics**（发送指标）。

1. 在 **Extended metrics**（扩展指标）列表中，在 **Name**（名称）下显示 **JSErrorCount** 并在 **BrowserName**（浏览器名称）下显示 **Chrome** 的行中选择 **Create alarm**（创建告警）。

1. 在 **Specify metric and conditions**（指定指标和条件）下，确认 **Metric name**（指标名称）和 **BrowserName**（浏览器名称）字段已预先填充正确的值。

1. 对于 **Statistic**（统计数据），选择要用于告警的统计数据。对于这种类型的计数指标，**Average**（平均值）是一个不错的选择。

1. 对于**时段**，选择 **5 分钟**。

1. 在 **Conditions**（条件）下，执行以下操作：
   + 选择 **Static**（静态）。
   + 选择 **Greater**（大于），指定当错误数高于您要指定的阈值时告警应进入 ALARM 状态。
   + 在 **than...** 下，输入告警阈值数字。当 5 分钟内的错误数超过此数字时，告警将进入 ALARM 状态。

1. （可选）默认情况下，一旦错误数在 5 分钟内超过您设置的阈值数字，告警就会进入 ALARM 状态。您也可以选择更改此设置，使告警仅在超过此数字的时间多于一个 5 分钟周期时才进入 ALARM 状态。

   为此，请选择 **Additional configuration**（其他配置），然后为 **Datapoints to alarm**（触发告警的数据点数）指定错误数超过阈值的时间需要达到多少个 5 分钟周期才能触发告警。例如，您可以选择 2 选 2，仅在连续两个 5 分钟周期超过阈值时触发告警；您也可以选择 3 选 2，当连续三个 5 分钟周期中的任意两个超过阈值时触发告警。

   有关此类告警评估的更多信息，请参阅 [告警评估](alarm-evaluation.md)。

1. 选择**下一步**。

1. 对于 **Configure actions**（配置操作），指定当告警进入 ALARM 状态时应进行的操作。要使用 Amazon SNS 接收通知，请执行以下操作：
   + 选择 **Add notification（添加通知）**。
   + 选择**告警中**。
   + 选择一个现有的 SNS 主题或创建一个新主题。如果您创建了一个新主题，请为其指定一个名称，并向其添加至少一个电子邮件地址。

1. 选择**下一步**。

1. 输入告警的名称和描述（可选），然后选择 **Next**（下一步）。

1. 检查详细信息，然后选择 **Create alarm**（创建告警）。

# CloudWatch RUM 的数据保护和数据隐私
<a name="CloudWatch-RUM-privacy"></a>

AWS [责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)适用于 Amazon CloudWatch RUM 中的数据保护和数据隐私。如该模式中所述，AWS 负责保护运行所有 AWS 云的全球基础设施。您负责维护对托管在此基础结构上的内容的控制。有关数据隐私的更多信息，请参阅[数据隐私常见问题](https://aws.amazon.com/compliance/data-privacy-faq/)。有关欧洲数据保护的信息，请参阅 AWS 安全博客上的 [AWS 责任共担模式和 GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/) 博客文章。有关遵守 GDPR 要求的更多资源，请参阅[一般数据保护条例 (GDPR) 中心](https://aws.amazon.com/compliance/gdpr-center/)。

Amazon CloudWatch RUM 会根据对要收集的终端用户数据的输入生成一个代码段，可将其嵌入到网站或 Web 应用程序代码中。由代码段下载和配置的 Web 客户端使用 Cookie（或类似技术）来帮助您收集终端用户数据。Cookie（或类似技术）的使用受某些司法管辖区的数据隐私法规约束。在使用 Amazon CloudWatch RUM 之前，强烈建议您评估适用法律规定的合规性义务，包括要求您针对 Cookie 的使用和终端用户数据的处理（包括收集）提供合法的隐私声明，并获得任何必要同意的任何适用法律要求。有关 Web 客户端如何使用 Cookie（或类似技术）以及 Web 客户端所收集的终端用户数据的更多信息，请参阅 [CloudWatch RUM Web 客户端收集的信息](CloudWatch-RUM-datacollected.md) 和 [CloudWatch RUM Web 客户端 Cookie（或类似技术）](#CloudWatch-RUM-cookies)。

强烈建议您不要在自由格式字段中输入敏感标识信息（例如终端用户客户账户号码、邮箱地址或其他个人信息）。您输入到 Amazon CloudWatch RUM 或其他服务中的任何数据都可能包含在诊断日志中。



## CloudWatch RUM Web 客户端 Cookie（或类似技术）
<a name="CloudWatch-RUM-cookies"></a>

默认情况下，CloudWatch RUM Web 客户端会收集有关用户会话的某些数据。您可以选择启用 Cookie，让 Web 客户端收集在页面加载间持续存在的用户 ID 和会话 ID。用户 ID 由 RUM 随机生成。

如果启用了这些 Cookie，当您查看此应用程序监控的 RUM 控制面板时，RUM 可以显示以下类型的数据。
+ 基于用户 ID 的汇总数据，例如唯一用户数量和出错的不同用户数量。
+ 基于会话 ID 的汇总数据，例如会话数量和出错的会话数量。
+ *用户历程*，每个采样用户会话所包含的页面序列。

**重要**  
如果不启用这些 Cookie（或类似技术），Web 客户端仍会记录有关终端用户会话的某些信息，例如浏览器类型/版本、操作系统类型/版本、设备类型等。收集这些信息是为了提供特定于页面的洞察，例如 Web 重要信息、页面浏览次数和出错页面。有关所记录数据的更多信息，请参阅 [CloudWatch RUM Web 客户端收集的信息](CloudWatch-RUM-datacollected.md)。

# CloudWatch RUM Web 客户端收集的信息
<a name="CloudWatch-RUM-datacollected"></a>

本节将记录 **PuTrumEvent** 架构，其定义了可以使用 CloudWatch RUM 从用户会话中收集的数据结构。

**PuTrumEvent** 请求将包含以下字段的数据结构发送到 CloudWatch RUM。
+ 此批次 RUM 事件的 ID
+ 应用程序监控详细信息，包括以下内容：
  + 应用程序监控 ID
  + 受监控的应用程序版本
+ 用户详细信息，包括以下内容。**只有应用程序监控启用 Cookie 时才会收集此信息。**
  + Web 客户端生成的用户 ID
  + 会话 ID
+ 此批次中的 [RUM 事件](#CloudWatch-RUM-datacollected-event)数组。

## RUM 活动架构
<a name="CloudWatch-RUM-datacollected-event"></a>

每个 RUM 事件的结构均包含以下字段。
+ 事件 ID
+ 时间戳
+ 事件类型
+ 用户代理
+ [Metadata](#CloudWatch-RUM-datacollected-metadata)
+ [RUM 事件详细信息](#CloudWatch-RUM-datacollected-eventDetails)

## RUM 事件元数据
<a name="CloudWatch-RUM-datacollected-metadata"></a>

元数据包括页面元数据、用户代理元数据、地理位置元数据和域元数据。

### 页面元数据
<a name="CloudWatch-RUM-datacollected-metadata-page"></a>

页面元数据包括以下内容：
+ 页面 ID
+ 页面标题
+ 父页面 ID。– **只有应用程序监控启用 Cookie 时才会收集此信息。**
+ 交互深度 – **只有在应用程序监控启用 Cookie 时才会收集此信息。**
+ 页面标签 – 您可以向页面事件添加标签，将页面组合在一起。有关更多信息，请参阅 [使用页面组](CloudWatch-RUM-page-groups.md)。

### 用户代理元数据
<a name="CloudWatch-RUM-datacollected-metadata-useragent"></a>

用户代理元数据包括以下内容：
+ 浏览器语言
+ 浏览器名称
+ 浏览器版本
+ 操作系统名称
+ 操作系统版本
+ 设备类型
+ 平台类型

### 地理位置元数据
<a name="CloudWatch-RUM-datacollected-metadata-geolocation"></a>

地理位置元数据包括以下内容：
+ 国家/地区代码
+ 细分代码

### 域元数据
<a name="CloudWatch-RUM-datacollected-metadata-domain"></a>

域元数据包括 URL 域。

## RUM 事件详细信息
<a name="CloudWatch-RUM-datacollected-eventDetails"></a>

根据事件类型，事件的详细信息遵循以下类型的架构之一。

### 会话开启事件
<a name="CloudWatch-RUM-datacollected-sessionstart"></a>

此事件不包含字段。**只有应用程序监控启用 Cookie 时才会收集此信息。**

### 页面视图架构
<a name="CloudWatch-RUM-datacollected-pageview"></a>

**Page view**（页面视图）事件包含以下属性。您可以通过配置 Web 客户端来停用页面视图收集。有关更多信息，请参阅 [CloudWatch RUM Web 客户端文档](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md)。


| 名称 | Type | 说明 | 
| --- | --- | --- | 
|  **页面 ID** |  字符串  |  在应用程序中唯一代表此页面的 ID。默认情况下，这是 URL 路径。  | 
|  **父页面 ID** |  字符串  |  用户导航到当前页面时所在页面的 ID。**只有应用程序监控启用 Cookie 时才会收集此信息。**  | 
|  **交互深度** |  字符串  |  **只有应用程序监控启用 Cookie 时才会收集此信息。**  | 

### JavaScript 错误架构
<a name="CloudWatch-RUM-datacollected-JavaScriptError"></a>

代理生成的 JavaScript 错误事件包含以下属性。仅当您选择收集错误遥测时，Web 客户端才会收集这些事件。


| 名称 | Type | 说明 | 
| --- | --- | --- | 
|  **错误类型** |  字符串  |  错误名称（如果存在）。有关更多信息，请参阅 [Error.prototype.name](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/name)。 某些浏览器可能不支持错误类型。  | 
|  **错误消息** |  字符串  |  错误的消息。有关更多信息，请参阅 [Error.prototype.message](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/message)。如果错误字段不存在，则这是错误事件消息。有关更多信息，请参阅 [ErroRevent](https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent)。 不同浏览器之间的错误消息可能不一致。  | 
|  **堆栈跟踪** |  字符串  |  错误的堆栈跟踪（如果存在）将被截断为 150 个字符。有关更多信息，请参阅 [Error.prototype.stack](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Stack)。 某些浏览器可能不支持堆栈跟踪。  | 

### DOM 事件架构
<a name="CloudWatch-RUM-datacollected-DOMEvent"></a>

代理生成的文档对象模型 (DOM) 事件包含以下属性。默认情况下，不会收集这些事件。只有在激活交互遥测时才会收集。有关更多信息，请参阅 [CloudWatch RUM Web 客户端文档](https://github.com/aws-observability/aws-rum-web/blob/main/docs/cdn_installation.md)。


| 名称 | Type | 说明 | 
| --- | --- | --- | 
|  **Event (事件)** |  字符串  |  DOM 事件的类型，例如单击、滚动或悬停。有关更多信息，请参阅[事件参考](https://developer.mozilla.org/en-US/docs/Web/Events)。  | 
|  **元素** |  字符串  |  DOM 元素类型  | 
|  **元素 ID** |  字符串  |  如果生成事件的元素有 ID，则此属性存储该 ID。有关更多信息，请参阅 [Element.id](https://developer.mozilla.org/en-US/docs/Web/API/Element/id)。  | 
|  **CSSLocator** |  字符串  |  用于识别 DOM 元素的 CSS 定位器。  | 
|  **InteractionId** |  字符串  |  用户与 UI 之间交互的唯一 ID。  | 

### 导航事件架构
<a name="CloudWatch-RUM-datacollected-NavigationEvent"></a>

只有在应用程序监控激活性能遥测时，才会收集导航事件。

导航事件使用 [Navigation timing Level 1](https://www.w3.org/TR/navigation-timing/#performancetiming) 和 [Navigation timing Level 2](https://w3c.github.io/navigation-timing) API。并非所有浏览器都支持 Level 2 API，因此这些较新的字段是可选的。

**注意**  
时间戳指标基于 [DOMHighResTimestamp](https://www.w3.org/TR/hr-time-2/#sec-domhighrestimestamp)。使用 Level 2 API，默认情况下，所有时间都相对于 `startTime`。但是对于 Level 1，需从时间戳指标中减去 `navigationStart` 指标以获取相对值。所有时间戳值均以毫秒为单位。

导航事件包含以下属性。


| 名称 | Type | 说明 | 备注 | 
| --- | --- | --- | --- | 
|  **initiatorType** |  字符串  |  表示启动性能事件的资源类型。 |  **值：**“navigation” **Level 1：**“navigation” **Level 2：**entryData.initiatorType | 
|  **navigationType** |  字符串  |  表示导航类型。此属性非必需。 |  **值：**该值必须是以下之一： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-datacollected.html) | 
|  **startTime** |  数字  |  指示触发事件的时间。 |  **值：**0 **Level 1：**entryData.navigationStart - entryData.navigationStart  **Level 2：**entryData.startTime | 
|  **unloadEventStart** |  数字  |  指示引发 `unload` 事件后，窗口中上一个文档开始卸载的时间。 |  **值：**如果不存在上一个文档，或者上一个文档或者其中一个所需的重新导向不是同一来源，则返回值为 0。 **Level 1：** <pre>entryData.unloadEventStart > 0<br />  ? entryData.unloadEventStart - entryData.navigationStart<br />  : 0<br /></pre> **Level 2：**entryData.unloadEventStart | 
|  **promptForUnload** |  数字  |  卸载文档所用的时间。换言之，`unloadEventStart` 和 `unloadEventEnd` 之间的时间。`UnloadEventEnd` 表示卸载事件处理程序完成的时刻（以毫秒为单位）。 |  **值：**如果不存在上一个文档，或者上一个文档或者其中一个所需的重新导向不是同一来源，则返回值为 0。 **Level 1：**entryData.unloadEventEnd - entryData.unloadEventStart **Level 2：**entryData.unloadEventEnd - entryData.unloadEventStart | 
|  **redirectCount** |  数字  |  表示在当前浏览的上下文中自上次非重新导向导航以来的重新导向次数。 此属性非必需。 |  **值：**如果没有重新导向，或者如果有与目标文档不同源的任何重新导向，则返回值为 0。 **Level 1：**不可用 **Level 2：**entryData.redirectCount | 
|  **redirectStart** |  数字  |  第一次 HTTP 重新导向开始的时间。  |  **值：**如果没有重新导向，或者如果有与目标文档不同源的任何重新导向，则返回值为 0。 **Level 1：** <pre>entryData.redirectStart > 0<br />  ? entryData.redirectStart - entryData.navigationStart<br />  : 0</pre> **Level 2：**entryData.redirectStart | 
|  **redirectTime** |  数字  |  HTTP 重新导向所用的时间。这是 `redirectStart` 与 `redirectEnd` 之间的差异。  |  **Level 1：** : entryData.redirectEnd - entryData.redirectStart **Level 2：** : entryData.redirectEnd - entryData.redirectStart | 
|  **WorkerStart** |  数字  |  这是 `PerformanceResourceTiming` 接口的属性。这标志着工件线程操作开始。 此属性非必需。 |  **值：**如果 Service Worker 线程已运行，或紧靠启动 Service Worker 线程之前，则此属性将返回紧靠分派 `FetchEvent` 前的时间。如果 Service Worker 未拦截资源，则返回 0。 **Level 1：**不可用 **Level 2：**entryData.workerStart | 
|  **workerTime** |  数字  |  如果 Service Worker 未拦截资源，则返回工件线程操作所需的时间。 此属性非必需。 |  **Level 1：**不可用  **Level 2：**<pre>entryData.workerStart > 0<br />   ? entryData.fetchStart - entryData.workerStart<br />   : 0</pre>  | 
|  **fetchStart** |  数字  |  浏览器准备好使用 HTTP 请求获取文档的时间。这在检查任何应用程序缓存之前完成。 |  **Level 1：** <pre>: entryData.fetchStart > 0<br />  ? entryData.fetchStart - entryData.navigationStart<br />  : 0</pre> **Level 2：**entryData.fetchStart | 
|  **domainLookupStar** |  数字  |  域查找开始的时间。 |  **值：**如果使用持久连接或信息存储在缓存或本地资源中，则该值将与 `fetchStart` 相同。 **Level 1：** <pre>entryData.domainLookupStart > 0<br />  ? entryData.domainLookupStart - entryData.navigationStart<br />  : 0</pre> **Level 2：**entryData.domainLookupStart | 
|  **dns** |  数字  |  域名查找所需的时间。 |  **值：**如果缓存了资源和 DNS 记录，则预期值为 0。 **Level 1：**entryData.domainLookupEnd - entryData.domainLookupStart **Level 2：**entryData.domainLookupEnd - entryData.domainLookupStart | 
|  **nextHopProtocol** |  字符串  |  表示用于获取资源的网络协议的字符串。 此属性非必需。 |  **Level 1：**不可用 **Level 2：**entryData.nextHopProtocol | 
|  **connectStart** |  数字  |  紧靠用户代理开始建立与服务器的连接以检索文档之前的时间。 |  **值：**如果使用了 RFC2616 持久连接，或者如果从相关应用程序缓存或本地资源中检索当前文档，则此属性将返回 `domainLookupEnd` 值。 **Level 1：** <pre>entryData.connectStart > 0<br />  ? entryData.connectStart - entryData.navigationStart<br />  : 0</pre> **Level 2：**entryData.connectStart  | 
|  **connect** |  数字  |  评估建立传输连接或执行 SSL 身份验证所需的时间。其中还包括浏览器发出过多并发请求时所用的受阻时间。  |  **Level 1：**entryData.connectEnd - entryData.connectStart **Level 2：**entryData.connectEnd - entryData.connectStart | 
|  **secureConnectionStart** |  数字  |  如果当前页面的 URL 模式为“https”，则此属性将返回紧靠用户代理启动握手过程以保护当前连接之前的时间。如果未使用 HTTPS，则返回 0。有关 URL 模式的更多信息，请参阅 [URL 表示形式](https://url.spec.whatwg.org/#concept-url-scheme)。  |  **公式：**entryData.secureConnectionStart | 
|  **tlsTime** |  数字  |  完成 SSL 握手所需的时间。  |  **Level 1：** <pre>entryData.secureConnectionStart > 0<br />   ? entryData.connectEnd - entryData.secureConnectionStart<br />   : 0</pre> **Level 2：** <pre>entryData.secureConnectionStart > 0<br />   ? entryData.connectEnd - entryData.secureConnectionStart<br />   : 0</pre>  | 
|  **requestStart** |  数字  |  紧靠用户代理开始从服务器、相关应用程序缓存或本地资源请求资源之前的时间。  | **Level 1：** <pre>: entryData.requestStart > 0<br />  ? entryData.requestStart - entryData.navigationStart<br />  : 0<br /></pre> **Level 2：**entryData.requestStart | 
|  **timeToFirstByte** |  数字  |  发出请求后接收信息第一个字节所需的时间。此时间相对于 `startTime`。  | **Level 1：**entryData.responseStart - entryData.requestStart **Level 2：**entryData.responseStart - entryData.requestStart | 
|  **responseStart** |  数字  |  紧靠用户代理的 HTTP 解析器从相关应用程序缓存、本地资源或服务器接收响应的第一个字节之后的时间。  | **Level 1：** <pre>entryData.responseStart > 0<br />   ? entryData.responseStart - entryData.navigationStart<br />   : 0</pre> **Level 2：**entryData.responseStart   | 
|  **responseTime** |  字符串  |  以字节形式从相关应用程序缓存、本地资源或服务器接收完整响应所用的时间。  | **Level 1：** <pre>entryData.responseStart > 0<br />  ? entryData.responseEnd - entryData.responseStart<br />  : 0</pre> **Level 2：** <pre>entryData.responseStart > 0<br />  ? entryData.responseEnd - entryData.responseStart<br />  : 0</pre>  | 
|  **domInteractive** |  数字  |  解析器在主文档上完成工作以及构建 HTML DOM 所用的时间。此时，其 `Document.readyState` 变为“交互式”，并引发相应的 `readystatechange` 事件。  | **Level 1：** <pre>entryData.domInteractive > 0<br />  ? entryData.domInteractive - entryData.navigationStart<br />  : 0</pre> **Level 2：**entryData.domInteractive  | 
|  **domContentLoadedEventStart** |  数字  |  表示紧靠用户代理在当前文档中触发 DOMContentLoaded 事件之前的时间值。初始 HTML 文档完全加载和解析后，将触发 DOMContentLoaded 事件。此时，主 HTML 文档已完成解析，浏览器开始构建渲染树，并且还需要加载子资源。此步骤不会等待样式表、图像和子框架完成加载。  | **Level 1：** <pre>entryData.domContentLoadedEventStart > 0<br />  ? entryData.domContentLoadedEventStart - entryData.navigationStart<br />  : 0<br /></pre> **Level 2：**entryData.domContentLoadedEventStart  | 
|  **domContentLoaded** |  数字  |  渲染树构建的此开启时间和结束时间使用 `domContentLoadedEventStart` 和 `domContentLoadedEventEnd` 标记。其允许 CloudWatch RUM 跟踪执行情况。此属性是 `domContentLoadedStart` 与 `domContentLoadedEnd` 之间的差异。 在此期间，DOM 和 CSSOM 已准备就绪。此属性将等待脚本执行，但异步和动态创建的脚本除外。如果脚本依赖样式表，`domContentLoaded` 也将等待样式表。其不会等待图像。  在 Google Chrome 的网络面板中，`domContentLoadedStart` 和 `domContentLoadedEnd` 的实际值与 `domContentLoaded` 近似。这表示从页面加载过程开始的 HTML DOM \$1 CSSOM 渲染树构建时间。如果是导航指标，`domContentLoaded` 值表示开始和结束值之间的差异，这是仅下载子资源和渲染树构建所需的时间。   | **Level 2：**entryData.domContentLoadedEventEnd - entryData.domContentLoadedEventStart  **Level 2：**entryData.domContentLoadedEventEnd - entryData.domContentLoadedEventStart  | 
|  **domComplete** |  数字  |  紧靠浏览器将当前文档的当前文档准备就绪状态设置为完成之前的时间。此时，子资源（例如图像）的加载已经完成。这包括下载 CSS 和同步 JavaScript 等阻止内容所用的时间。在 Google Chrome 的网络面板中，此属性与 `loadTime` 近似。  | **Level 1：** <pre>entryData.domComplete > 0<br />  ? entryData.domComplete - entryData.navigationStart<br />  : 0<br /></pre> **Level 2：**entryData.domComplete  | 
|  **domProcessingTime** |  数字  |  响应和加载事件开始之间的总时间。  | **Level 1：**entryData.loadEventStart - entryData.responseEnd **Level 2：**entryData.loadEventStart - entryData.responseEnd  | 
|  **loadEventStart** |  数字  |  紧靠当前文档 `load` 事件触发之前的时间。 |  **Level 1：** <pre>entryData.loadEventStart > 0<br />  ? entryData.loadEventStart - entryData.navigationStart<br />  : 0<br /></pre> **Level 2：**entryData.loadEventStart | 
|  **loadEventTime** |  数字  |  `loadEventStart` 与 `loadEventEnd` 之间的差异。在此期间，将触发等待此加载事件的其他函数或逻辑。 |  **Level 1：**entryData.loadEventEnd - entryData.loadEventStart **Level 2：**entryData.loadEventEnd - entryData.loadEventStart | 
|  **duration** |  字符串  |  持续时间为页面总加载时间。其记录下载主页面及其所有同步子资源的时间，以及渲染页面的时间。稍后还会继续下载脚本等异步资源。此属性是 `loadEventEnd` 与 `startTime` 属性之间的差异。  | **Level 1：**entryData.loadEventEnd - entryData.navigationStart **Level 2：**entryData.duration | 
|  **headerSize** |  数字  |  返回 `transferSize` 与 `encodedBodySize` 之间的差异。 此属性非必需。  | **Level 1：**不可用 **Level 2：**entryData.transferSize - entryData.encodedBodySize **Level 2：**entryData.transferSize - entryData.encodedBodySize | 
|  **compressionRatio** |  数字  |  `encodedBodySize` 和 `decodedBodySize` 的比率。`encodedBodySize` 的值是不包括 HTTP 标头的资源的压缩大小。`decodedBodySize` 的值是不包括 HTTP 标头的资源的解压大小。 此属性非必需。  | **Level 1：**不可用。 **Level 2：**<pre>entryData.encodedBodySize > 0<br />  ? entryData.decodedBodySize / entryData.encodedBodySize<br />  : 0</pre>  | 
|  **navigationTimingLevel** |  数字  |  Navigation timing API 版本。  | **值：**1 或 2  | 

### 资源事件架构
<a name="CloudWatch-RUM-datacollected-ResourceEvent"></a>

只有在应用程序监控已激活性能遥测时，才会收集资源事件。

时间戳指标基于 [DOMHighResTimeStamp typedef](https://www.w3.org/TR/hr-time-2/#sec-domhighrestimestamp)。对于 Level 2 API，默认情况下，所有计时都相对于 `startTime`。但是对于 Level 1 API，需从时间戳指标中减去 `navigationStart` 指标以获取相对值。所有时间戳值均以毫秒为单位。

代理生成的资源事件包含以下属性。


| 名称 | Type | 说明 | 备注 | 
| --- | --- | --- | --- | 
|  **targetUrl** |  字符串  |  返回资源的 URL。 |  **公式：**[entryData.name](http://entrydata.name/) | 
|  **initiatorType** |  字符串  |  表示启动性能资源事件的资源类型。 |  **值：**"resource" **公式：**entryData.initiatorType | 
|  **duration** |  字符串  |  返回 `responseEnd` 与 `startTime` 属性之间的差异。此属性非必需。  | **公式：**entryData.duration | 
|  **transferSize** |  数字  |  返回获取的资源大小（八位字节），包括响应标头字段和响应有效负载正文。此属性非必需。  | **公式：**entryData.transferSize | 
|  **fileType** |  字符串  |  从目标 URL 模式派生的扩展。  |   | 

### 最大内容绘制事件架构
<a name="CloudWatch-RUM-datacollected-LargestPaintEvent"></a>

最大内容绘制事件包含以下属性。

只有在应用程序监控已激活性能遥测时，才会收集这些事件。


| 名称 | 描述 | 
| --- | --- | 
|  **值** |  有关更多信息，请参阅 [Web 重要信息](https://web.dev/vitals/)。 | 

### 首次输入延迟事件
<a name="CloudWatch-RUM-datacollected-FirstInputDelayEvent"></a>

首次输入延迟事件包含以下属性。

只有在应用程序监控已激活性能遥测时，才会收集这些事件。


| 名称 | 描述 | 
| --- | --- | 
|  **值** |  有关更多信息，请参阅 [Web 重要信息](https://web.dev/vitals/)。 | 

### 累计布局偏移事件
<a name="CloudWatch-RUM-datacollected-CumulativeShift"></a>

累计布局转移事件包含以下属性。

只有在应用程序监控已激活性能遥测时，才会收集这些事件。


| 名称 | 描述 | 
| --- | --- | 
|  **值** |  有关更多信息，请参阅 [Web 重要信息](https://web.dev/vitals/)。 | 

### HTTP 事件
<a name="CloudWatch-RUM-datacollected-HTTP"></a>

HTTP 事件包含以下属性。其中将包含 `Response` 字段或 `Error` 字段，但无法二者皆包含。

只有在应用程序监控已激活 HTTP 性能遥测时，才会收集这些事件。


| 名称 | 描述 | 
| --- | --- | 
|  **请求** |  请求字段包含以下内容： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-datacollected.html)  | 
|  **响应** |  响应字段包含以下内容： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-datacollected.html)  | 
|  **错误** |  错误字段包含以下内容： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM-datacollected.html)  | 

### X-Ray 跟踪事件架构
<a name="CloudWatch-RUM-datacollected-xraytraceEvent"></a>

只有在应用程序监控已激活 X-Ray 跟踪时，才会收集这些事件。

有关 X-Ray 跟踪事件架构的信息，请参阅 [AWS X-Ray 分段文档](https://docs.aws.amazon.com/xray/latest/devguide/xray-api-segmentdocuments.html)。

# 单页应用程序的路由更改计时
<a name="CloudWatch-RUM-route-change-timing"></a>

在传统的多页面应用程序中，当用户请求加载新内容时，用户实际上是在向服务器请求新的 HTML 页面。因此，CloudWatch RUM Web 客户端使用常规性能 API 指标来捕获加载时间。

但是，单页 Web 应用程序使用 JavaScript 和 Ajax 来更新界面，而无需从服务器加载新页面。浏览器计时 API 不会记录单页更新，而是使用路由更改计时。

CloudWatch RUM 支持监控来自服务器的整页加载和单页更新，但有以下区别：
+ 对于路由更改计时，没有浏览器提供的指标，例如 `tlsTime`、`timeToFirstByte` 等等。
+ 对于路由更改计时，`initiatorType` 字段将为 `route_change`。

CloudWatch RUM Web 客户端监听可能导致路由变更的用户交互，当记录此类用户交互时，Web 客户端会记录一个时间戳。如果满足以下两个条件，则将开始路由更改计时：
+ 浏览器历史记录 API（浏览器前进和后退按钮除外）用于执行路由更改。
+ 路由更改检测时间与最新用户交互时间戳之间的差异小于 1000 ms。这样可以避免数据偏斜。

然后，一旦路由更改计时开始，如果没有正在进行的 AJAX 请求和 DOM 更改，则该计时结束。然后，最新完成的活动的时间戳将用作完成时间戳。

如果有持续的 AJAX 请求或 DOM 变更超过 10 秒（默认），则路由更改计时将超时。在这种情况下，CloudWatch RUM Web 客户端将不再记录此路由更改的计时。

因此，路由更改事件的持续时间按以下公式计算：

```
(time of latest completed activity) - (latest user interaction timestamp)
```

# 管理使用 CloudWatch RUM 的应用程序
<a name="CloudWatch-RUM-manage"></a>

使用这些章节中的步骤管理应用程序对 CloudWatch RUM 的使用。

**Topics**
+ [如何查找已生成的代码段？](CloudWatch-RUM-find-code-snippet.md)
+ [编辑 CloudWatch RUM 应用程序监控设置](CloudWatch-RUM-edit-application.md)
+ [停止使用 CloudWatch RUM 或删除应用程序监控](CloudWatch-RUM-delete-appmonitor.md)

# 如何查找已生成的代码段？
<a name="CloudWatch-RUM-find-code-snippet"></a>

要查找已为应用程序生成的 CloudWatch RUM 代码段，请按照以下步骤操作。

**查找已生成的代码段**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择 **Application Signals**、**RUM**。

1. 导航到**配置**选项卡的**代码片段**部分。

1. 为相应埋点选择**复制/下载**。

# 编辑 CloudWatch RUM 应用程序监控设置
<a name="CloudWatch-RUM-edit-application"></a>

要更改应用程序监控的设置，请按以下步骤操作。您可以更改除应用程序监控名称之外的任何设置。

**编辑应用程序对 CloudWatch RUM 的使用方式**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择 **Application Signals**、**RUM**。

1. 选择应用程序名称旁边的按钮，然后选择 **Actions**（操作）、**Edit**（编辑）。

1. 更改除应用程序监控名称之外的任何设置。有关设置的更多信息，请参阅 [创建用于 Web 应用程序的 CloudWatch RUM 应用程序监视器](CloudWatch-RUM-get-started-create-app-monitor.md)。

1. 完成后，选择**保存**。

   更改设置会更改代码段。现在，您必须将更新后的代码段粘贴到应用程序中。

1. 在创建代码片段之后，选择**复制到剪贴板**或**下载**，然后选择**完成**。

   要使用新设置开启监控，请将代码段插入应用程序中。

# 停止使用 CloudWatch RUM 或删除应用程序监控
<a name="CloudWatch-RUM-delete-appmonitor"></a>

要停止在应用程序中使用 CloudWatch RUM，请从应用程序代码中删除 RUM 生成的代码段。

要删除 RUM 应用程序监控，请按以下步骤操作。

**删除应用程序监控**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 在导航窗格中，选择 **Application Signals**、**RUM**。

1. 选择应用程序名称旁边的按钮，然后选择 **Actions**（操作）、**Delete**（删除）。

1. 在确认框中，输入 **Delete**，然后选择 **Delete**（删除）。

1. 如果您尚未执行此操作，请从应用程序代码中删除 CloudWatch RUM 代码段。

# CloudWatch RUM 故障排除
<a name="CloudWatch-RUM-troubleshooting"></a>

本章节包含的提示可以帮助您对 CloudWatch RUM 进行故障排除。

## 应用程序没有数据
<a name="CloudWatch-RUM-troubleshooting-nodata"></a>

首先，请确保代码段已正确插入应用程序中。有关更多信息，请参阅 [将 CloudWatch 应用程序监控代码片段插入应用程序](CloudWatch-RUM-get-started-insert-code-snippet.md)。

如果这不是问题所在，则可能是没有流量传入应用程序。通过与用户相同的方式访问应用程序来生成一些流量。

## 已停止记录应用程序的数据
<a name="CloudWatch-RUM-troubleshooting-nonewdata"></a>

应用程序可能经更新，现在不再包含 CloudWatch RUM 代码段。检查应用程序代码。

另一种可能性是，有人可能已经更新了代码段，但后来没有将更新的代码段插入应用程序中。按照 [如何查找已生成的代码段？](CloudWatch-RUM-find-code-snippet.md) 中的说明查找当前正确的代码段，然后将其与粘贴到应用程序中的代码段进行比较。