

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# CloudWatch 用于监控和记录 GraphQL API 数据
<a name="monitoring"></a>

您可以使用 CloudWatch 指标和日志记录和调试 GraphQL API。 CloudWatch 这些工具使开发人员能够有效地监控性能，排查问题并优化 GraphQL 操作。

CloudWatch metrics 是一种工具，可提供各种指标来监控 API 性能和使用情况。这些指标分为两个主要类别：

1. **常规 API 指标**：包括用于跟踪客户端和服务器错误的 `4XXError` 和 `5XXError`、用于测量响应时间的 `Latency`、用于监控 API 调用总数的 `Requests` 以及用于跟踪资源使用情况的 `TokensConsumed`。

1. **实时订阅指标**：这些指标侧重于 WebSocket 连接和订阅活动。它们包括关于连接请求、成功连接、订阅注册、消息发布以及活跃连接和订阅的指标。

本指南还介绍了增强指标，这些指标提供了有关解析器性能、数据来源交互和各项 GraphQL 操作的更精细数据。这些指标提供了更深入的见解，但也带来了额外的成本。

CloudWatch 日志是一种为 Graph APIs QL 启用日志功能的工具。可以在 API 的两个级别上设置日志：

1. **请求级日志**：这些日志捕获整体请求信息，包括 HTTP 标头、GraphQL 查询、操作摘要和订阅注册。

1. **字段级日志**：这些日志提供有关各个字段解析的详细信息，包括请求和响应映射以及每个字段的跟踪信息。

您可以配置日志记录、解释日志条目以及使用日志数据进行故障排除和优化。 AWS AppSync 提供了各种日志类型，可显示查询的执行、解析、验证和字段解析数据。

## 设置和配置
<a name="setup-and-configuration"></a>

要在 GraphQL API 上开启自动日志功能，请使用控制台。 AWS AppSync 

1. 登录 AWS 管理控制台 并打开[AppSync控制台](https://console.aws.amazon.com/appsync/)。

1. 在该**APIs**页面上，选择 GraphQL API 的名称。

1. 在您的 API 主页的导航窗格中，选择**设置**。

1. 在**日志记录**下面，执行以下操作：

   1. 开启**启用日志记录**。

   1. 要获取详细的请求级日志记录，请选中**包含详细内容**下面的复选框（可选）。

   1. 在**字段解析器日志级别**下面，选择所需的字段级日志记录级别（**无**、**错误**、**信息**、**调试**或**全部**）。（可选）

   1. 在 “**创建或使用现有角色**” 下，选择 “**新建角色**” 以创建允许 AWS AppSync 向其写入日志的新 AWS Identity and Access Management (IAM) CloudWatch。或者，选择**现有角色**以选择您的 AWS 账户中的现有 IAM 角色的 Amazon 资源名称 (ARN)。

1. 选择**保存**。

### 手动配置 IAM 角色
<a name="manual-role-configuration"></a>

如果您选择使用现有 IAM 角色，则该角色必须授予 AWS AppSync 写入日志所需的权限 CloudWatch。要手动配置，您必须提供服务角色 ARN，以便在写入日志时 AWS AppSync 可以代入该角色。

在 [IAM 控制台](https://console.aws.amazon.com/iam)中，创建一个名为 `AWSAppSyncPushToCloudWatchLogsPolicy` 的新策略，该策略具有以下定义：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}
```

------

接下来，使用名称创建一个新角色 **AWSAppSyncPushToCloudWatchLogsRole**，并将新创建的策略附加到该角色。编辑该角色的信任关系以包含以下内容：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
        "Effect": "Allow",
        "Principal": {
            "Service": "appsync.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
        }
    ]
}
```

------

复制角色 ARN 并在为 GraphQL AP AWS AppSync I 设置日志时使用它。

## CloudWatch 指标
<a name="cw-metrics"></a>

您可以使用 CloudWatch 指标来监控可能导致 HTTP 状态代码或延迟的特定事件，并提供有关这些事件的警报。将发出以下指标：

### 指标列表
<a name="cw-metrics-list"></a>

 `4XXError`   
由于客户端配置不正确导致请求无效而产生的错误。通常，这些错误是在 GraphQL 处理以外的任何地方发生的。例如，如果请求包含不正确的 JSON 负载或不正确的查询，服务受到限制或未正确配置授权设置，则可能会出现这些错误。  
 **单位**：*计数*。使用 Sum 统计数据以得出这些错误的总出现次数。

 `5XXError`   
在运行 GraphQL 查询期间遇到的错误。例如，在为空架构或不正确的架构调用查询时，可能会出现该错误。当 Amazon Cognito 用户池 ID 或 AWS 区域无效时，也可能发生这种情况。或者，如果在处理请求时 AWS AppSync 遇到问题，也可能发生这种情况。  
 **单位**：*计数*。使用 Sum 统计数据以得出这些错误的总出现次数。

 `Latency`   
从 AWS AppSync 收到来自客户端的请求到它向客户端返回响应之间的时间。这不包括响应进入终端设备所遇到的网络延迟。  
 **单位**：*毫秒*。使用平均值统计数据可评估预期延迟。

`Requests`  
您账户中所有 APIs 人已处理的请求（查询 \$1 突变）数量，按地区划分。  
 **单位**：*计数*。特定区域中处理的所有请求的数量。

`TokensConsumed`  
根据 `Request` 使用的资源量（处理时间和使用的内存），为 `Requests` 分配令牌。通常，每个 `Request` 使用一个令牌。不过，根据需要，将为使用大量资源的 `Request` 分配额外的令牌。  
 **单位**：*计数*。为特定区域中处理的请求分配的令牌数量。

`NetworkBandwidthOutAllowanceExceeded`  
在 AWS AppSync 控制台的缓存设置页面上，Cache Healt **h Metrics 选项允许您启用此与缓存相关的运行状况指标**。
因吞吐量超出聚合带宽限制而丢弃的网络数据包数。这对于诊断缓存配置中的瓶颈很有用。通过在 `appsyncCacheNetworkBandwidthOutAllowanceExceeded` 指标中指定 `API_Id` 来记录特定 API 的数据。  
 **单位**：*计数*。超出 ID 指定 API 的带宽限制后丢弃的数据包数。

`EngineCPUUtilization`  
在 AWS AppSync 控制台的缓存设置页面上，Cache Healt **h Metrics 选项允许您启用此与缓存相关的运行状况指标**。
分配给 Redis OSS 进程的 CPU 利用率（百分比）。这对于诊断缓存配置中的瓶颈很有用。通过在 `appsyncCacheEngineCPUUtilization` 指标中指定 `API_Id` 来记录特定 API 的数据。  
 **单位**：*百分比*。由 ID 指定 API 的 Redis OSS 进程当前使用的 CPU 百分比。

### 实时订阅
<a name="cw-metrics-real-time-subscriptions"></a>

所有指标都以一个维度发出：**图表QLAPIId**。这意味着所有指标都与 GraphQL API 相结合。 IDs以下指标与纯粹的 GraphQL 订阅有关： WebSockets

#### 指标列表
<a name="cw-metrics-real-time-subscriptions-list"></a>

`ConnectRequests`  
向发出的 WebSocket 连接请求数 AWS AppSync，包括成功和失败的尝试。  
**单位**：*计数*。使用总和统计数据可获取连接请求总数。

`ConnectSuccess`   
成功 WebSocket 连接的次数 AWS AppSync。可以在没有订阅的情况下进行连接。  
**单位**：*计数*。使用 Sum 统计数据可得出成功连接的总出现次数。

`ConnectClientError`   
 AWS AppSync由于客户端错误而被拒绝的 WebSocket 连接数。这可能意味着，服务受到限制或未正确配置授权设置。  
**单位**：*计数*。使用 Sum 统计数据以得出客户端连接错误的总出现次数。

`ConnectServerError`   
处理连接 AWS AppSync 时产生的错误数。当出现意外的服务器端问题时，通常会发生这种错误。  
**单位**：*计数*。使用 Sum 统计数据以得出服务器端连接错误的总出现次数。

`DisconnectSuccess`   
成功 WebSocket 断开连接的次数。 AWS AppSync  
**单位**：*计数*。使用 Sum 统计数据可得出成功断开连接的总出现次数。

`DisconnectClientError`   
断开 WebSocket 连接 AWS AppSync 时产生的客户端错误数。  
**单位**：*计数*。使用 Sum 统计数据可得出断开连接错误的总出现次数。

`DisconnectServerError`   
断开 WebSocket 连接 AWS AppSync 时产生的服务器错误数。  
**单位**：*计数*。使用 Sum 统计数据可得出断开连接错误的总出现次数。

`SubscribeSuccess`   
 AWS AppSync 通过成功注册的订阅数量 WebSocket。可以在没有订阅的情况下建立连接，但无法在没有连接的情况下进行订阅。  
**单位**：*计数*。使用 Sum 统计数据以得出成功订阅的总发生次数。

`SubscribeClientError`   
 AWS AppSync 由于客户端错误而被拒绝的订阅数量。如果 JSON 负载不正确，服务受到限制或未正确配置授权设置，则可能会出现该错误。  
**单位**：*计数*。使用 Sum 统计数据以得出客户端订阅错误的总出现次数。

`SubscribeServerError`   
处理订阅 AWS AppSync 时产生的错误数。当出现意外的服务器端问题时，通常会发生这种错误。  
**单位**：*计数*。使用 Sum 统计数据以得出服务器端订阅错误的总出现次数。

`UnsubscribeSuccess`   
已成功处理的取消订阅请求数。  
**单位**：*计数*。可以使用 Sum 统计数据获取成功取消订阅请求的总发生次数。

`UnsubscribeClientError`   
 AWS AppSync由于客户端错误而被拒绝的取消订阅请求的数量。  
**单位**：*计数*。可以使用 Sum 统计数据获取客户端取消订阅请求错误的总出现次数。

`UnsubscribeServerError`   
处理取消订阅请求 AWS AppSync 时产生的错误数。当出现意外的服务器端问题时，通常会发生这种错误。  
**单位**：*计数*。可以使用 Sum 统计数据获取服务器端取消订阅请求错误的总出现次数。

`PublishDataMessageSuccess`   
已成功发布的订阅事件消息的数量。  
**单位**：*计数*。使用 Sum 统计数据以得出成功发布的订阅事件消息的总数。

`PublishDataMessageClientError`   
由于客户端错误而无法发布的订阅事件消息的数量。  
`Unit`：*计数*。使用 Sum 统计数据以得出客户端发布订阅事件错误的总出现次数。

`PublishDataMessageServerError`   
发布订阅事件消息 AWS AppSync 时产生的错误数。当出现意外的服务器端问题时，通常会发生这种错误。  
**单位**：*计数*。使用 Sum 统计数据以得出服务器端发布订阅事件错误的总出现次数。

`PublishDataMessageSize`   
已发布的订阅事件消息的大小。  
**单位**：*字节*。

`ActiveConnections`   
1 分钟内从客户端到 AWS AppSync 的并发 WebSocket 连接数。  
**单位**：*计数*。使用 Sum 统计数据以得出建立的连接总数。

`ActiveSubscriptions`   
1 分钟内来自客户端的并发订阅数。  
**单位**：*计数*。使用 Sum 统计数据以得出有效订阅的总数。

`ConnectionDuration`   
连接保持打开状态的时间量。  
**单位**：*毫秒*。使用 Average 统计数据可评估连接持续时间。

`OutboundMessages`  
成功发布的计量消息数。一条计量消息等于 5 KB 的已传输数据。  
**单位**：*计数*。使用总和统计数据可获取成功发布的计量消息数。

`InboundMessageSuccess`  
成功处理的入站消息数量。突变调用的每种订阅类型都会生成一条入站消息。  
**单位**：*计数*。使用总和统计数据可获取成功处理的入站消息总数。

`InboundMessageError`  
由于 API 请求无效（例如超过 240 kB 订阅有效载荷大小限制）而导致处理失败的入站消息数量。  
**单位**：*计数*。使用总和统计数据可获取与 API 相关的处理失败的入站消息总数。

`InboundMessageFailure`  
由于来自的错误而导致无法处理的入站消息的数量 AWS AppSync。  
**单位**：*计数*。使用 Sum 统计数据获取出现 AWS AppSync相关处理失败的入站邮件的总数。

`InboundMessageDelayed`  
延迟的入站消息数。当超过入站消息速率限额或出站消息速率限额时，可能会延迟入站消息。  
**单位**：*计数*。使用总和统计数据可获取延迟的入站消息总数。

`InboundMessageDropped`  
丢弃的入站消息数。当超过入站消息速率限额或出站消息速率限额时，可能会丢弃入站消息。  
**单位**：*计数*。使用总和统计数据可获取丢弃的入站消息总数。

`InvalidationSuccess`  
变更通过 `$extensions.invalidateSubscriptions()` 成功使订阅失效（取消订阅）的次数。  
**单位**：*计数*。可以使用 Sum 统计数据检索成功取消订阅的总订阅数。

`InvalidationRequestSuccess`  
已成功处理的失效请求数。  
**单位**：*计数*。使用总和统计数据可获取成功处理的失效请求总数。

`InvalidationRequestError`  
由于 API 请求无效而导致处理失败的失效请求的数量。  
**单位**：*计数*。使用总和统计数据可获取与 API 相关的处理失败的失效请求总数。

`InvalidationRequestFailure`  
由于的错误而导致处理失败的失效请求数。 AWS AppSync  
**单位**：*计数*。使用 Sum 统计数据来获取具有 AWS AppSync相关处理失败的失效请求的总数。

`InvalidationRequestDropped`  
当超过失效请求限额时丢弃的失效请求的数量。  
**单位**：*计数*。使用总和统计数据可获取丢弃的失效请求的总数。

#### 比较入站消息和出站消息
<a name="inbound-outbound-comparison"></a>

执行变更时会调用带有该变更的 *@aws\$1subscribe* 指令的订阅字段。每次订阅调用都会生成一条入站消息。例如，如果两个订阅字段在 *@aws\$1subscribe* 中指定了相同的变更，则调用该变更时会生成两条入站消息。

一封出站消息等于向 WebSocket 客户端传送的 5 KB 数据。例如，向 10 个客户端发送 15 KB 的数据会产生 30 条出站消息（15 KB \$1 10 个客户端/每条消息 5 KB = 30 条消息）。

您可以请求增加入站消息或出站消息的配额。有关更多信息，请参阅《AWS 一般参考》**中的 [AWS AppSync 端点和限额](https://docs.aws.amazon.com/general/latest/gr/appsync.html#limits_appsync)以及《服务配额用户指南》**中的[请求增加配额](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)。

### 增强型指标
<a name="enhanced-metrics"></a>

增强型指标会发出有关 API 使用情况和性能的精细数据，例如 AWS AppSync 请求和错误计数、延迟以及缓存命中数/未命中数。所有增强型指标数据都将发送到您的 CloudWatch 账户，您可以配置要发送的数据类型。

**注意**  
使用增强型指标时会收取额外费用。有关更多信息，请参阅 [Amazon 定价中的**详细监控** CloudWatch定价](https://aws.amazon.com/cloudwatch/pricing/)等级。

这些指标可以在 AWS AppSync 控制台的各个设置页面上找到。在 API 设置页面上，您可以使用**增强型指标**部分启用或禁用以下各项：

**解析器指标行为**：这些选项控制如何收集解析器的其他指标。您可以选择启用完整请求解析器指标（为请求中的所有解析器启用的指标）或每个解析器的指标（仅为配置设置为已启用的解析器启用的指标）。以下选项可用：

#### 解析器指标行为列表
<a name="enhanced-resolver-metrics-list"></a>

 `GraphQL errors per resolver (GraphQLError)`   
每个解析器发生的 GraphQL 错误数。  
**指标维度**：`API_Id`、`Resolver`  
 **单位**：*计数*。

 `Requests per resolver (Request)`   
请求期间发生的调用次数。这按每个解析器进行记录。  
**指标维度**：`API_Id`、`Resolver`  
 **单位**：*计数*。

 `Latency per resolver (Latency)`   
完成一次解析器调用的时间。延迟以毫秒为单位进行测量，并按每个解析器进行记录。  
**指标维度**：`API_Id`、`Resolver`  
 **单位**：*毫秒*。

`Cache hits per resolver (CacheHit)`  
请求期间的缓存命中数。只有在使用缓存时才会发出此数据。缓存命中数按每个解析器进行记录。  
**指标维度**：`API_Id`、`Resolver`  
 **单位**：*计数*。

`Cache misses per resolver (CacheMiss)`  
请求期间的缓存未命中数。只有在使用缓存时才会发出此数据。缓存未命中数按每个解析器进行记录。  
**指标维度**：`API_Id`、`Resolver`  
 **单位**：*计数*。

**数据来源指标行为**：这些选项控制如何收集数据来源的其他指标。您可以选择启用完整请求数据来源指标（为请求中的所有数据来源启用的指标）或每个数据来源的指标（仅为配置设置为已启用的数据来源启用的指标）。以下选项可用：

#### 数据来源指标行为列表
<a name="enhanced-data-source-metrics-list"></a>

 `Requests per data source (Request)`   
请求期间发生的调用次数。请求按数据来源进行记录。如果启用了完整请求，则每个数据源都将在中拥有自己的条目 CloudWatch。  
**指标维度**：`API_Id`、`Datasource`  
 **单位**：*计数*。

 `Latency per data source (Latency)`   
完成一次数据来源调用的时间。延迟按每个数据来源进行记录。  
**指标维度**：`API_Id`、`Datasource`  
 **单位**：*毫秒*。

 `Errors per data source (GraphQLError)`   
调用数据来源期间发生的错误数。  
**指标维度**：`API_Id`、`Datasource`  
 **单位**：*计数*。

**操作指标**：启用 GraphQL 操作级指标。

#### 操作指标行为列表
<a name="enhanced-operation-metrics-list"></a>

 `Requests per operation (Request)`   
指定 GraphQL 操作被调用的次数。  
**指标维度**：`API_Id`、`Operation`  
 **单位**：*计数*。

 `GraphQL errors per operation (GraphQLError)`   
在指定 GraphQL 操作期间发生的 GraphQL 错误数。  
**指标维度**：`API_Id`、`Operation`  
 **单位**：*计数*。

## CloudWatch 日志
<a name="cwl"></a>

您可以对任何新的或现有的 GraphQL API 配置两种类型的日志记录：请求级别和字段级别。

### 请求级日志
<a name="request-level-logs"></a>

如果配置了请求级日志记录（**包含详细内容**），将记录以下信息：
+ 使用的令牌数
+ 请求和响应 HTTP 标头
+ 请求中运行的 GraphQL 查询
+ 总体操作摘要
+ 已注册的新的和现有的 GraphQL 订阅

### 字段级日志
<a name="field-level-logs"></a>

如果配置了字段级日志记录，将记录以下信息：
+ 生成的请求映射，其中包含每个字段的源和参数
+ 每个字段的转换响应映射，其中包括作为该字段解析结果的数据
+ 每个字段的跟踪信息

如果您开启日志记录，则 AWS AppSync 管理日 CloudWatch 志。该过程包括创建日志组和日志流，以及向日志流报告这些日志。

当您打开 GraphQL API 的日志记录并发出请求时， AWS AppSync 将在该日志组下创建一个日志组和日志流。日志组以 `/aws/appsync/apis/{graphql_api_id}` 格式命名。在每个日志组内，日志会进一步分成多个日志流。当报告已记录的数据时，这些日志按**上次事件时间**排序。

每个日志事件都标有该请求的 **x-amzn-RequestId**。这可以帮助您筛选日志事件 CloudWatch ，以获取有关该请求的所有已记录信息。你可以 RequestId 从每个 GraphQL AWS AppSync 请求的响应标头中获取。

字段级别日志记录配置为使用以下日志级别：
+ **无** - **不捕获任何字段级日志。**
+   
** **错误** - **仅**记录处于错误类别的字段的以下信息：**  
  + 服务器响应中的错误部分
  + 字段级别错误
  + 为错误字段解析的生成的 request/response 函数
+   
** **信息** - **仅**记录处于信息和错误类别的字段的以下信息：**  
  + 信息级别的消息
  + 通过 `$util.log.info` 和 `console.log` 发送的用户消息
  + 不显示字段级跟踪和映射日志。
  + 如果字段级日志记录设置为`INFO`或更高，且包含详细内容，则 AWS AppSync 添加转换后的映射模板日志消息。这将包含添加到转换后的映射模板中的任何信息，或者解析器或函数执行 JavaScript 代码的输出，如果您计划向下游数据源发送敏感信息（例如密码或授权标头），并且不希望这些信息出现在日志中，则不应使用该信息。
+   
** **调试** - **仅**记录处于调试、信息和错误类别的字段的以下信息：**  
  + 调试级别的消息
  + 通过 `$util.log.info`、`$util.log.debug`、`console.log` 和 `console.debug` 发送的用户消息
  + 不显示字段级跟踪和映射日志。
+   
** **全部** - 记录查询中的**所有**字段的以下信息：**  
  + 字段级别跟踪信息
  + 为每个字段解析的生成 request/response 函数

### 监控优势
<a name="benefits-of-enabling-monitoring"></a>

您可以使用日志记录和指标来识别、优化 GraphQL 查询和排除其问题。例如，这些将帮助您使用针对查询中的每个字段记录的跟踪信息调试延迟问题。为了对此进行演示，假设您正在使用一个或多个嵌套在 GraphQL 查询中的解析器。 CloudWatch 日志中的示例字段操作可能与以下内容类似：

```
{
    "path": [
        "singlePost",
        "authors",
        0,
        "name"
    ],
    "parentType": "Post",
    "returnType": "String!",
    "fieldName": "name",
    "startOffset": 416563350,
    "duration": 11247
}
```

这可能对应于 GraphQL 架构，类似于以下内容：

```
type Post {
  id: ID!
  name: String!
  authors: [Author]
}

type Author {
  id: ID!
  name: String!
}

type Query {
  singlePost(id:ID!): Post
}
```

在前面的日志结果中，**path** 显示运行名为 `singlePost()` 的查询而返回的数据中的单个项目。在该示例中，它表示第一个索引 (0) 处的 **name** 字段。**startOffset** 提供相对于 GraphQL 查询操作开始位置的偏移。**duration** 是解析该字段的总时间。这些值可用来排除下面这类问题：为何来自特定数据来源的数据的运行速度可能低于预期，或者特定字段是否降低了整个查询的速度等。例如，您可以选择增加 Amazon DynamoDB 表的预置吞吐量，或从查询中删除导致整体操作性能不佳的特定字段。

自 2019 年 5 月 8 日起， AWS AppSync 将日志事件生成为完全结构化的 JSON。这可以帮助您使用 Logs Insights 和 Amazon OpenSearch 服务等 CloudWatch 日志分析服务来了解 GraphQL 请求的性能和架构字段的使用特征。例如，您可以轻松识别具有较大延迟的解析器，这可能是导致性能问题的根本原因。您还可以识别架构中最常用和最不常用的字段，并评估弃用 GraphQL 字段的影响。

### 冲突检测和同步日志记录
<a name="aws-appsync-monitoring-conflict-detection-and-sync-logging"></a>

如果 AWS AppSync API 的 CloudWatch 日志记录配置为**字段解析器日志级别**设置为 “**全部**”，则会向日志 AWS AppSync 组发送冲突检测和解决信息。这提供了对 AWS AppSync API 如何应对冲突的详细见解。为了帮助您解释响应，在日志中提供了以下信息：

#### 指标列表
<a name="aws-appsync-monitoring-conflict-detection-and-sync-logging-list"></a>

 `conflictType`   
详细说明是否由于版本不匹配或由于客户提供的状况而发生冲突。

 `conflictHandlerConfigured`   
说明请求时在解析器上配置了冲突处理程序。

 `message`   
提供有关如何检测和解决冲突的信息。

 `syncAttempt`   
服务器在最终拒绝请求之前尝试同步数据的次数。

 `data`   
如果配置的冲突处理程序为 `Automerge`，则填充该字段以显示 `Automerge` 为每个字段做出的决策。提供的操作可以是：  
+  **REJECTED** - `Automerge` 拒绝传入的字段值，而采用服务器中的值。
+  **ADDED** - 由于服务器中没有预先存在的值，`Automerge` 添加传入的字段。
+  **APPENDED** - `Automerge` 将传入的值附加到服务器中存在的列表值。
+  **MERGED** - `Automerge` 将传入的值合并到服务器中存在的集合值。

### 使用令牌计数优化您的请求
<a name="aws-appsync-using-token-counts-to-optimize-requests"></a>

对于使用少于或等于 1,500 KB 秒内存和 vCPU 时间的请求，将分配一个令牌。对于使用超过 1,500 KB 秒资源的请求，将收到额外的令牌。例如，如果请求消耗 3,350 KB 秒，则向该请求 AWS AppSync 分配三个令牌（向上舍入到下一个整数值）。默认情况下，您账户 APIs 中每秒最多 AWS AppSync 分配 5,000 或 10,000 个请求令牌，具体取决于其部署所在的 AWS 区域。如果 APIs 每人平均每秒使用两个令牌，则每秒只能分别限制为 2,500 或 5,000 个请求。如果您每秒需要的令牌数多于分配的数量，您可以提交请求以增加请求令牌速率的默认配额。有关更多信息，请参阅*AWS 一般参考 指南*中的[AWS AppSync 终端节点和配额](https://docs.aws.amazon.com/general/latest/gr/appsync.html#limits_appsync)以及 Servic [e Quotas 用户指南中的请求增加](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)*配额*。

如果每个请求的令牌数较高，则可能表明需要优化您的请求并提高 API 性能。可能增加每个请求的令牌数的因素包括：
+  GraphQL 架构的大小和复杂性。
+  请求映射模板和响应映射模板的复杂性。
+  每个请求的解析器调用次数。
+  从解析器返回的数据量。
+  下游数据来源的延迟。
+  需要连续调用数据来源（而不是并行或批量调用）的架构和查询设计。
+  日志记录配置，特别是字段级和详细日志内容。

**注意**  
除了 AWS AppSync 指标和日志外，客户端还可以通过响应标头访问请求中消耗的令牌数量`x-amzn-appsync-TokensConsumed`。

### 日志大小限制
<a name="aws-appsync-log-size-limits"></a>

默认情况下，如果启用了日志记录， AWS AppSync 则每次请求最多可发送 1 MB 的日志。超过此大小的日志将被截断。要减小日志大小，请为字段级日志选择 `ERROR` 日志记录级别并禁用 `VERBOSE` 日志记录，或者在不需要时完全禁用字段级日志。作为`ALL`日志级别的替代方案，您可以使用增强指标来获取有关特定解析器、数据源或 GraphQL 操作的指标，或者利用 AppSync 提供的日志工具仅记录必要的信息。

## 日志类型参考
<a name="log-type-reference"></a>

### RequestSummary
<a name="requestsummary"></a>
+  **requestId：**请求的唯一标识符。
+  **图表QLAPIId：**发出请求的 GraphQL API 的 ID。
+  **statusCode：**HTTP 状态代码响应。
+  **延 End-to-end迟：**请求的延迟，以纳秒为单位，以整数表示。

```
{
     "logType": "RequestSummary",
     "requestId": "dbe87af3-c114-4b32-ae79-8af11f3f96f1",
     "graphQLAPIId": "pmo28inf75eepg63qxq4ekoeg4",
     "statusCode": 200,
     "latency": 242000000
}
```

### ExecutionSummary
<a name="executionsummary"></a>
+  **requestId：**请求的唯一标识符。
+  **图表QLAPIId：**发出请求的 GraphQL API 的 ID。
+  **startTime：**GraphQL 处理请求的开始时间戳，采用 RFC 3339 格式。
+  **endTime：**GraphQL 处理请求的结束时间戳，采用 RFC 3339 格式。
+  **duration：**GraphQL 总处理时间，以纳秒为单位，整数值。
+  **版本：**的架构版本 ExecutionSummary。
+   
** **parsing：****  
  +  **startOffset**：解析的起始偏移，以纳秒为单位，相对于调用，整数值。
  +  **duration：**解析所花费的时间，以纳秒为单位，整数值。
+   
** **validation：****  
  +  **startOffset**：验证的起始偏移，以纳秒为单位，相对于调用，整数值。
  +  **duration：**执行验证所花费的时间，以纳秒为单位，整数值。

```
{
    "duration": 217406145,
    "logType": "ExecutionSummary",
    "requestId": "dbe87af3-c114-4b32-ae79-8af11f3f96f1",
    "startTime": "2019-01-01T06:06:18.956Z",
    "endTime": "2019-01-01T06:06:19.174Z",
    "parsing": {
        "startOffset": 49033,
        "duration": 34784
    },
    "version": 1,
    "validation": {
        "startOffset": 129048,
        "duration": 69126
    },
    "graphQLAPIId": "pmo28inf75eepg63qxq4ekoeg4"
}
```

### 跟踪
<a name="tracing"></a>
+  **requestId：**请求的唯一标识符。
+  **图表QLAPIId：**发出请求的 GraphQL API 的 ID。
+  **startOffset**：字段解析的起始偏移，以纳秒为单位，相对于调用，整数值。
+  **duration：**解析字段所花费的时间，以纳秒为单位，整数值。
+  **fieldName：**所解析字段的名称。
+  **parentType：**所解析字段的父类型。
+  **returnType：**所解析字段的返回类型。
+  **path：**路径分段列表，从响应的根开始，以所解析字段结束。
+  **resolverArn：**用于字段解析的解析器的 ARN。可能不会出现在嵌套字段中。

```
{
    "duration": 216820346,
    "logType": "Tracing",
    "path": [
        "putItem"
    ],
    "fieldName": "putItem",
    "startOffset": 178156,
    "resolverArn": "arn:aws:appsync:us-east-1:111111111111:apis/pmo28inf75eepg63qxq4ekoeg4/types/Mutation/fields/putItem",
    "requestId": "dbe87af3-c114-4b32-ae79-8af11f3f96f1",
    "parentType": "Mutation",
    "returnType": "Item",
    "graphQLAPIId": "pmo28inf75eepg63qxq4ekoeg4"
}
```

## 使用 “日志见解” 分析您的 CloudWatch 日志
<a name="analyzing-your-logs-with-amazon-cloudwatch-logs-insights"></a>

以下是您可以运行的查询示例，以获取有关 GraphQL 操作的性能和运行状况的可行的见解。这些示例作为示例查询在 Logs Insight CloudWatch s 控制台中提供。在[CloudWatch控制台](https://console.aws.amazon.com/cloudwatch)中，选择 Lo **gs Insights**，选择您的 GraphQL API 的 AWS AppSync 日志组，然后在**示例AWS AppSync ****查询下选择查询**。

以下查询返回使用令牌数最多的前 10 个 GraphQL 请求：

```
filter @message like "Tokens Consumed"
| parse @message "* Tokens Consumed: *" as requestId, tokens
| sort tokens desc
| display requestId, tokens
| limit 10
```

以下查询返回具有最大延迟的前 10 个解析器：

```
  fields resolverArn, duration
| filter logType = "Tracing"
| limit 10
| sort duration desc
```

以下查询返回最常调用的解析器：

```
  fields ispresent(resolverArn) as isRes
| stats count() as invocationCount by resolverArn
| filter isRes and logType = "Tracing"
| limit 10
| sort invocationCount desc
```

以下查询返回映射模板中具有最多错误的解析器：

```
  fields ispresent(resolverArn) as isRes
| stats count() as errorCount by resolverArn, logType
| filter isRes and (logType = "RequestMapping" or logType = "ResponseMapping") and fieldInError
| limit 10
| sort errorCount desc
```

以下查询返回解析器延迟统计数据：

```
  fields ispresent(resolverArn) as isRes
| stats min(duration), max(duration), avg(duration) as avg_dur by resolverArn
| filter isRes and logType = "Tracing"
| limit 10
| sort avg_dur desc
```

以下查询返回字段延迟统计数据：

```
  stats min(duration), max(duration), avg(duration) as avg_dur
  by concat(parentType, '/', fieldName) as fieldKey
| filter logType = "Tracing"
| limit 10
| sort avg_dur desc
```

可以将 CloudWatch Logs Insights 查询的结果导出到 CloudWatch 仪表板。

## 使用 OpenSearch 服务分析您的日志
<a name="analyze-your-logs-with-amazon-elasticsearch-service"></a>

您可以使用 Amazon S OpenSearch ervice 搜索、分析和可视化您的 AWS AppSync 日志，以确定性能瓶颈和操作问题的根本原因。您可以识别具有最大延迟和最多错误的解析器。此外，您还可以使用 OpenSearch 仪表板创建具有强大可视化效果的仪表板。 OpenSearch 仪表板是 S OpenSearch ervice 中提供的开源数据可视化和探索工具。使用 OpenSearch 控制面板，您可以持续监控 GraphQL 操作的性能和运行状况。例如，您可以创建控制面板以可视化 GraphQL 请求的 P90 延迟，并深入了解每个解析器的 P90 延迟。

使用 S OpenSearch ervice 时，使用 **“cwl\$1”** 作为筛选器模式来搜索索 OpenSearch 引。 OpenSearch 服务使用前缀**为 “cwl-”** 对从 CloudWatch 日志流式传输的日志进行索引。为了将 AWS AppSync API 日志与发送到 OpenSearch 服务的其他 CloudWatch 日志区分开来，我们建议在搜索中`graphQLAPIID.keyword=YourGraphQLAPIID`添加额外的筛选表达式。

## 日志格式迁移
<a name="log-format-migration"></a>

 AWS AppSync 生成的日志事件主要采用完全结构化的 JSON 格式。但是，某些诊断和中间处理消息可能会以非结构化格式发出。如果您需要将非结构化日志迁移到完全结构化的 JSON，则可以使用[GitHub 示例](https://github.com/aws-samples/aws-appsync-cwl-migrator)中提供的脚本。

您还可以使用[指标筛选器](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatchLogsConcepts.html)将日志数据转换为数字 CloudWatch 指标，以便您可以对它们绘制图表或设置警报。 CloudWatch 