

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 CloudWatch 監控和記錄 GraphQL API 資料
<a name="monitoring"></a>

您可以使用 CloudWatch 指標和 CloudWatch 日誌來記錄和偵錯 GraphQL API。這些工具可讓開發人員有效地監控效能、疑難排解問題，並最佳化其 GraphQL 操作。

CloudWatch 指標是一種工具，提供廣泛的指標來監控 API 效能和用量。這些指標分為兩個主要類別：

1. **一般 API 指標**：這些指標包括`4XXError``5XXError`用於追蹤用戶端和伺服器錯誤、`Latency`用於測量回應時間、`Requests`用於監控 API 呼叫總數，以及`TokensConsumed`用於追蹤資源用量的 和 。

1. **即時訂閱指標**：這些指標著重於 WebSocket 連線和訂閱活動。其中包括連線請求、成功連線、訂閱註冊、訊息發佈以及作用中連線和訂閱的指標。

本指南也推出增強型指標，提供更精細的解析程式效能、資料來源互動和個別 GraphQL 操作資料。這些指標提供更深入的洞見，但會產生額外的成本。

CloudWatch Logs 是一種工具，可為您的 GraphQL APIs 啟用記錄功能。日誌可以設定為 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. 在 **Logging (記錄)**，執行以下項目：

   1. 開啟**啟用日誌**。

   1. 如需詳細的請求層級記錄，請選取**包含詳細內容**下的核取方塊。（選用）

   1. 在**欄位解析程式日誌層級**下，選擇您偏好的欄位層級記錄層級 (**無**、**錯誤**、**資訊**、**偵錯**或**全部**)。（選用）

   1. 在**建立或使用現有角色**下，選擇**新角色**以建立新的 AWS Identity and Access Management (IAM)，允許 AWS AppSync 將日誌寫入 CloudWatch。或者，選擇**現有角色**以選取 AWS 帳戶中現有 IAM 角色的 Amazon Resource Name (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，並在設定 an AWS AppSync GraphQL API 的記錄時使用它。

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

您可以使用 CloudWatch 指標來監控並提供有關可能導致 HTTP 狀態碼或延遲之特定事件的提醒。發出下列指標：

### 指標清單
<a name="cw-metrics-list"></a>

 `4XXError`   
由於不正確的用戶端組態而使請求無效所產生的錯誤。一般而言，這些錯誤會在 GraphQL 處理之外的任何位置發生。例如，當請求包含不正確的 JSON 承載或不正確的查詢、服務受到調節或授權設定設定錯誤時，可能會發生這些錯誤。  
 **單位**：*計數*。使用總和統計以取得這些錯誤的總次數。

 `5XXError`   
執行 GraphQL 查詢期間遇到的錯誤。例如，這可能會在叫用空白或不正確的結構描述查詢時發生。當 Amazon Cognito 使用者集區 ID 或 AWS 區域無效時，也可能發生這種情況。或者，如果 AWS AppSync 在處理請求期間遇到問題，也可能發生這種情況。  
 **單位**：*計數*。使用總和統計以取得這些錯誤的總次數。

 `Latency`   
當 AWS AppSync 從用戶端接收請求到傳回回應給用戶端之間的時間。這不包含回應到達最終裝置所發生的網路延遲。  
 **單位**：*毫秒*。使用平均統計資料以評估預期的延遲。

`Requests`  
依區域列出您帳戶中所有 APIs 已處理的請求 （查詢 \$1 變動） 數量。  
 **單位**：*計數*。在特定區域中處理的所有請求數量。

`TokensConsumed`  
權杖`Requests`會根據 `Request` 消耗的資源量 （使用的處理時間和記憶體） 配置給 。通常，每個 都會`Request`使用一個字符。不過，`Request`消耗大量資源的 會視需要配置額外的字符。  
 **單位**：*計數*。配置給在特定區域中處理之請求的字符數量。

`NetworkBandwidthOutAllowanceExceeded`  
在 AWS AppSync 主控台的快取設定頁面上，**快取運作狀態指標**選項可讓您啟用此快取相關運作狀態指標。
由於輸送量超過彙總頻寬限制而捨棄的網路封包。這對於診斷快取組態中的瓶頸很有用。在 指標`API_Id`中指定 ，以記錄特定 API `appsyncCacheNetworkBandwidthOutAllowanceExceeded` 的資料。  
 **單位**：*計數*。在超過 ID 所指定 API 的頻寬限制後捨棄的封包數量。

`EngineCPUUtilization`  
在 AWS AppSync 主控台的快取設定頁面上，**快取運作狀態指標**選項可讓您啟用此快取相關運作狀態指標。
配置給 Redis OSS 程序的 CPU 使用率 （百分比）。這對於診斷快取組態中的瓶頸很有用。在 指標`API_Id`中指定 ，以記錄特定 API `appsyncCacheEngineCPUUtilization` 的資料。  
 **單位**：*百分比*。Redis OSS 程序目前針對 ID 指定的 API 使用的 CPU 百分比。

### 即時訂閱
<a name="cw-metrics-real-time-subscriptions"></a>

所有指標都會在一個維度中發出：**GraphQLAPIId**。這意味著所有指標都與 GraphQL API ID 相結合。下列指標與透過純 WebSockets的 GraphQL 訂閱相關：

#### 指標清單
<a name="cw-metrics-real-time-subscriptions-list"></a>

`ConnectRequests`  
對 提出的 WebSocket 連線請求數量 AWS AppSync，包括成功和失敗的嘗試。  
**單位**：*計數*。使用總和統計資料來取得連線請求的總數。

`ConnectSuccess`   
成功連線到 AWS AppSync 的 WebSocket 連線數目。您可以在沒有訂閱的情況下連線。  
**單位**：*計數*。使用總和統計以取得這些成功連線的總次數。

`ConnectClientError`   
由於用戶端錯誤， AWS AppSync 拒絕的 WebSocket 連線數目。這可能表示服務已調節，或授權設定設定錯誤。  
**單位**：*計數*。使用總和統計以取得這些用戶端連線錯誤的總次數。

`ConnectServerError`   
處理連線時源自 AWS AppSync 的錯誤數目。發生未預期的伺服器端問題時，通常會發生這種情況。  
**單位**：*計數*。使用總和統計以取得這些伺服器端連線錯誤的總次數。

`DisconnectSuccess`   
與 AWS AppSync 成功中斷 WebSocket 連線的數量。  
**單位**：*計數*。使用總和統計以取得這些成功中斷連線的總次數。

`DisconnectClientError`   
中斷 WebSocket 連線時，源自 AWS AppSync 的用戶端錯誤數目。  
**單位**：*計數*。使用總和統計以取得這些中斷連線錯誤的總次數。

`DisconnectServerError`   
中斷 WebSocket 連線時，源自 AWS AppSync 的伺服器錯誤數目。  
**單位**：*計數*。使用總和統計以取得這些中斷連線錯誤的總次數。

`SubscribeSuccess`   
透過 WebSocket 成功註冊至 AWS AppSync 的訂閱數量。沒有訂閱的連線是有可能的，但沒有連線的訂閱是不可能的。  
**單位**：*計數*。使用總和統計以取得這些成功訂閱的總次數。

`SubscribeClientError`   
由於用戶端錯誤而遭 AWS AppSync 拒絕的訂閱數量。當 JSON 承載不正確、服務受到調節或授權設定錯誤時，就會發生這種情況。  
**單位**：*計數*。使用總和統計以取得這些用戶端訂閱錯誤的總次數。

`SubscribeServerError`   
處理訂閱時源自 AWS AppSync 的錯誤數目。發生未預期的伺服器端問題時，通常會發生這種情況。  
**單位**：*計數*。使用總和統計以取得這些伺服器端訂閱錯誤的總次數。

`UnsubscribeSuccess`   
已成功處理的取消訂閱請求數量。  
**單位**：*計數*。使用總和統計資料來取得成功取消訂閱請求的總出現次數。

`UnsubscribeClientError`   
由於用戶端錯誤， AWS AppSync 拒絕的取消訂閱請求數量。  
**單位**：*計數*。使用總和統計資料來取得用戶端取消訂閱請求錯誤的總發生次數。

`UnsubscribeServerError`   
處理取消訂閱請求時，源自 AWS AppSync 的錯誤數目。發生未預期的伺服器端問題時，通常會發生這種情況。  
**單位**：*計數*。使用總和統計資料來取得伺服器端取消訂閱請求錯誤的總發生次數。

`PublishDataMessageSuccess`   
已成功發佈的訂閱事件訊息數目。  
**單位**：*計數*。使用總和統計以取得已順利發佈之訂閱事件訊息的總計。

`PublishDataMessageClientError`   
因為用戶端錯誤而無法發佈的訂閱事件訊息數目。  
`Unit`：*計數*。使用總和統計以取得這些用戶端發佈訂閱事件錯誤的總次數。

`PublishDataMessageServerError`   
發佈訂閱事件訊息時，源自 AWS AppSync 的錯誤數目。發生未預期的伺服器端問題時，通常會發生這種情況。  
**單位**：*計數*。使用總和統計以取得這些伺服器端發佈訂閱事件錯誤的總次數。

`PublishDataMessageSize`   
已發佈的訂閱事件訊息大小。  
**單位**：*位元組*。

`ActiveConnections`   
1 分鐘內從用戶端到 AWS AppSync 的並行 WebSocket 連線數。  
**單位**：*計數*。使用總和統計來取得開啟的連線總數。

`ActiveSubscriptions`   
在 1 分鐘內來自用戶端同時訂閱的數量。  
**單位**：*計數*。使用總和統計來取得使用中的訂閱總數。

`ConnectionDuration`   
連線保持開啟的時間。  
**單位**：*毫秒*。使用平均統計資料來評估連線持續時間。

`OutboundMessages`  
已成功發佈的計量訊息數量。一個計量訊息等於 5 kB 的交付資料。  
**單位**：*計數*。使用總和統計資料來取得成功發佈的計量訊息總數。

`InboundMessageSuccess`  
成功處理傳入訊息的數量。變動叫用的每個訂閱類型都會產生一個傳入訊息。  
**單位**：*計數*。使用總和統計資料來取得成功處理傳入訊息的總數。

`InboundMessageError`  
由於 API 請求無效而無法處理的傳入訊息數量，例如超過 240 kB 訂閱承載大小限制。  
**單位**：*計數*。使用總和統計資料來取得與 API 相關處理失敗的傳入訊息總數。

`InboundMessageFailure`  
由於 錯誤而無法處理的傳入訊息數量 AWS AppSync。  
**單位**：*計數*。使用總和統計資料來取得與處理失敗 AWS AppSync相關的傳入訊息總數。

`InboundMessageDelayed`  
延遲傳入訊息的數量。違反傳入訊息速率配額或傳出訊息速率配額時，傳入訊息可能會延遲。  
**單位**：*計數*。使用總和統計資料來取得延遲的傳入訊息總數。

`InboundMessageDropped`  
捨棄傳入訊息的數量。違反傳入訊息速率配額或傳出訊息速率配額時，可以捨棄傳入訊息。  
**單位**：*計數*。使用總和統計資料來取得已捨棄的傳入訊息總數。

`InvalidationSuccess`  
使用 的變動成功使訂閱失效 （取消訂閱） 的數目`$extensions.invalidateSubscriptions()`。  
**單位**：*計數*。使用總和統計資料來擷取已成功取消訂閱的訂閱總數。

`InvalidationRequestSuccess`  
已成功處理的失效請求數量。  
**單位**：*計數*。使用總和統計資料來取得已成功處理的失效請求總數。

`InvalidationRequestError`  
由於 API 請求無效而無法處理的失效請求數量。  
**單位**：*計數*。使用總和統計資料來取得發生 API 相關處理失敗的失效請求總數。

`InvalidationRequestFailure`  
由於 錯誤而無法處理的失效請求數量 AWS AppSync。  
**單位**：*計數*。使用總和統計資料來取得發生 AWS AppSync相關處理失敗的失效請求總數。

`InvalidationRequestDropped`  
超過失效請求配額時捨棄的失效請求數量。  
**單位**：*計數*。使用總和統計資料來取得捨棄失效請求的總數。

#### 比較傳入和傳出訊息
<a name="inbound-outbound-comparison"></a>

執行變動時，會叫用具有該變動 *@aws\$1subscribe* 指令的訂閱欄位。每個訂閱調用都會產生一個傳入訊息。例如，如果兩個訂閱欄位在 *@aws\$1subscribe* 中指定相同的變動，則呼叫該變動時會產生兩個傳入訊息。

一個傳出訊息等於傳送至 WebSocket 用戶端的 5 kB 資料。例如，將 15 kB 的資料傳送至 10 個用戶端會產生 30 則傳出訊息 (15 kB \$1 10 個用戶端/每則訊息 5 kB = 30 則訊息）。

您可以請求增加傳入或傳出訊息的配額。如需詳細資訊，請參閱《 *AWS 一般參考*指南》中的[AWS AppSync 端點和配額](https://docs.aws.amazon.com/general/latest/gr/appsync.html#limits_appsync)，以及《*Service Quotas 使用者指南*》中[請求提高配額](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)的指示。

### 增強型指標
<a name="enhanced-metrics"></a>

增強型指標會發出 API 用量和效能的精細資料，例如 AWS AppSync 請求和錯誤計數、延遲和快取命中/遺失。所有增強型指標資料都會傳送到您的 CloudWatch 帳戶，而且您可以設定要傳送的資料類型。

**注意**  
使用增強型指標時，會收取額外費用。如需詳細資訊，請參閱 Amazon 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 Logs。此程序包含建立日誌群組和日誌串流，並以這些日誌向日誌串流報告。

當您開啟 GraphQL API 上的記錄並提出請求時， AWS AppSync 會在日誌群組下建立日誌群組和日誌串流。日誌群組的命名是遵循 `/aws/appsync/apis/{graphql_api_id}` 格式。在每個日誌群組中，日誌將進一步分為日誌串流。它們會依照記錄資料回報的**上次事件時間**進行排序。

每個日誌事件都會標記為該請求的 **x-amzn-RequestId**。這可協助您篩選 CloudWatch 中的日誌事件，以取得該請求的所有記錄資訊。您可以從每個 GraphQL AWS AppSync 請求的回應標頭取得 RequestId。

欄位層級記錄是用以下日誌層級設定的：
+ **無** - **不會擷取欄位層級日誌。**
+   
** **錯誤** - **僅**針對錯誤類別中的欄位記錄以下資訊：**  
  + 伺服器回應的錯誤區段
  + 欄位層級錯誤
  + 產生的請求/回應功能已解析錯誤的欄位
+   
** **資訊** - **僅**記錄資訊和錯誤類別中欄位的下列資訊：**  
  + 資訊層級訊息
  + 透過 `$util.log.info`和 傳送的使用者訊息 `console.log`
  + 不會顯示欄位層級追蹤和映射日誌。
  + 如果包含詳細內容的欄位層級記錄設定為 `INFO`或更高版本， 會 AWS AppSync 新增轉換的映射範本記錄訊息。這將包含新增至轉換映射範本的任何資訊，或解析程式或函數執行的 JavaScript 程式碼的輸出，如果您打算將敏感資訊，例如密碼或授權標頭，傳送到下游資料來源，且不希望 日誌中的資訊。
+   
** **偵錯** - **僅**針對偵錯、資訊和錯誤類別中的欄位記錄以下資訊：**  
  + 偵錯層級訊息
  + 透過 `$util.log.info`、`console.log`、 和 `$util.log.debug`傳送的使用者訊息 `console.debug`
  + 不會顯示欄位層級追蹤和映射日誌。
+   
** **全部** - 記錄查詢中**所有**欄位的下列資訊：**  
  + 欄位層級追蹤資訊
  + 為每個欄位解析的產生請求/回應函數

### 監控的優點
<a name="benefits-of-enabling-monitoring"></a>

您可以使用記錄和指標來識別、故障診斷和最佳化您的 GraphQL 查詢。例如，這些將協助您使用查詢中每個欄位記錄的追蹤資訊以偵錯延遲問題。為了示範，假設您使用 GraphQL 查詢中巢狀的一或多個解析程式。CloudWatch Logs 中的範例欄位操作看起來可能會類似以下內容：

```
{
    "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
}
```

在上述日誌結果中，**路徑**會顯示從執行名為 的查詢所傳回資料中的單一項目`singlePost()`。在此範例中，它代表第一個索引 (0) **的名稱**欄位。**startOffset** 提供從 GraphQL 查詢操作開始的位移。**持續時間**是解析欄位的總時間。這些值非常有用，可以診斷為何來自特定資料來源的資料的執行速度低於預期，或特定欄位是否降低了整個查詢的速度。例如，您可以選擇增加 Amazon DynamoDB 資料表的佈建輸送量，或從導致整體操作效能不佳的查詢中移除特定欄位。

自 2019 年 5 月 8 日起， AWS AppSync 會以全結構化 JSON 的形式產生日誌事件。這可協助您使用 CloudWatch Logs Insights 和 Amazon OpenSearch Service 等日誌分析服務，以了解 GraphQL 請求的效能，以及結構描述欄位的使用特性。例如，您可以輕鬆找出延遲時間很長，並且可能是效能問題根本原因的解析程式。您也可以找出結構描述中最常用和最不常用的欄位，並評估移除 GraphQL 欄位的影響。

### 衝突偵測和同步記錄
<a name="aws-appsync-monitoring-conflict-detection-and-sync-logging"></a>

如果 an AWS AppSync API 已將**欄位解析程式日誌層級**設定為**全部**的 CloudWatch Logs 記錄，則 AWS AppSync 會向日誌群組發出衝突偵測和解決資訊。這可讓您深入了解 AWS AppSync API 如何回應衝突。為了協助您解譯回應，日誌中提供下列資訊：

#### 指標清單
<a name="aws-appsync-monitoring-conflict-detection-and-sync-logging-list"></a>

 `conflictType`   
詳述發生的衝突原因是版本不符或客戶提供的條件所致。

 `conflictHandlerConfigured`   
說明請求時在解析程式中設定的衝突處理常式。

 `message`   
提供如何偵測和解決衝突的相關資訊。

 `syncAttempt`   
在最終拒絕請求之前，伺服器為了同步資料而嘗試的次數。

 `data`   
如果設定的衝突處理常式是 `Automerge`，則會填入此欄位，以顯示每個欄位所`Automerge`採取的決策。提供的動作可能是：  
+  **拒絕** - 當 `Automerge`拒絕傳入欄位值，以支持伺服器中的值。
+  **ADDED** - 當 因為伺服器中沒有預先存在的值而`Automerge`新增傳入欄位時。
+  **附加** - 當 將傳入值`Automerge`附加到伺服器中存在的清單值。
+  **MERGED** - 當 `Automerge` 將傳入值合併到伺服器中存在之 Set 的值時。

### 使用字符計數來最佳化您的請求
<a name="aws-appsync-using-token-counts-to-optimize-requests"></a>

耗用小於或等於 1，500 KB 秒記憶體和 vCPU 時間的請求會分配一個字符。資源耗用超過 1，500 KB-秒的請求會收到額外的權杖。例如，如果請求耗用 3，350 KB-秒， AWS AppSync 會將三個字符 （四捨五入至下一個整數值） 分配給請求。根據預設， AWS AppSync 每秒最多會將 5，000 或 10，000 個請求權杖分配給您帳戶中APIs，具體取決於其部署所在的 AWS 區域。如果您的 APIs 平均每秒使用兩個字符，則每秒限制為 2，500 或 5，000 個請求。如果您需要比分配數量更多的字符/秒，您可以提交請求，以提高請求字符速率的預設配額。如需詳細資訊，請參閱*AWS 一般參考 《指南*》中的 [AWS AppSync 端點和配額](https://docs.aws.amazon.com/general/latest/gr/appsync.html#limits_appsync)，以及[《Service Quotas 使用者指南》中的請求提高配額](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)。 *Service Quotas *

高每個請求字符計數可能表示有機會最佳化您的請求並改善 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：**請求的唯一識別符。
+  **graphQLAPIId：**提出請求的 GraphQL API ID。
+  **statusCode：**HTTP 狀態碼回應。
+  **latency：**請求的端對端延遲，以奈秒為單位，並且為整數。

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

### ExecutionSummary
<a name="executionsummary"></a>
+  **requestId：**請求的唯一識別符。
+  **graphQLAPIId：**提出請求的 GraphQL API ID。
+  **startTime：**請求的 GraphQL 處理開始時間戳記，格式為 RFC 3339。
+  **endTime：**GraphQL 處理請求的結束時間戳記，以 RFC 3339 格式顯示。
+  **持續時間：**經過的總 GraphQL 處理時間，以奈秒為單位，以整數表示。
+  **version：**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：**請求的唯一識別符。
+  **graphQLAPIId：**提出請求的 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 Logs Insights 分析您的日誌
<a name="analyzing-your-logs-with-amazon-cloudwatch-logs-insights"></a>

以下是您可以執行的查詢範例，您可以透過這些執行取得您 GraphQL 操作效能及運作狀態的可採取動作詳情。這些範例可在 CloudWatch Logs Insights 主控台中作為範例查詢使用。在 [CloudWatch 主控台](https://console.aws.amazon.com/cloudwatch)中，選擇 **Logs 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 Service 分析您的日誌
<a name="analyze-your-logs-with-amazon-elasticsearch-service"></a>

您可以使用 Amazon OpenSearch Service 搜尋、分析和視覺化您的 AWS AppSync 日誌，以識別操作問題的效能瓶頸和根本原因。您可以找出延遲最長和錯誤最多的解析程式。此外，您可以使用 OpenSearch Dashboards 建立具有強大視覺化效果的儀表板。OpenSearch Dashboards 是 OpenSearch Service 中提供的開放原始碼資料視覺化和探索工具。使用 OpenSearch Dashboards，您可以持續監控 GraphQL 操作的效能和運作狀態。例如，您可以建立儀表板來視覺化 GraphQL 請求的 P90 延遲，並深入了解每個解析程式的 P90 延遲。

使用 OpenSearch Service 時，請使用**「cwl\$1」**做為篩選條件模式來搜尋 OpenSearch 索引。OpenSearch Service 會為從 CloudWatch Logs 串流的日誌編製索引，字首為**「cwl-」**。若要將傳送至 OpenSearch Service 的其他 CloudWatch 日誌中的 differentiate AWS AppSync API 日誌，建議您將 的其他篩選條件表達`graphQLAPIID.keyword=YourGraphQLAPIID`式新增至您的搜尋。

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

 AWS AppSync 產生的日誌事件主要格式化為全結構化 JSON。不過，某些診斷和中繼處理訊息可能會以非結構化格式發出。如果您需要將非結構化日誌遷移至完全結構化的 JSON，您可以使用 [GitHub 範例](https://github.com/aws-samples/aws-appsync-cwl-migrator)提供的指令碼。

您也可以在 CloudWatch 中使用[指標篩選條件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatchLogsConcepts.html)，將日誌資料轉換為數值 CloudWatch 指標，以便在它們上繪製或設定警示。