监控和日志记录 - Amazon AppSync
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

监控和日志记录

要监控您的Amazon AppSync GraphQL API 并帮助调试与请求相关的问题,您可以开启对 Amazon Lo CloudWatch gs 的日志记录。

设置和配置

要在 GraphQL API 上启用自动日志记录,请使用Amazon AppSync 控制台。

  1. 登录 Amazon Web Services Management Console并打开 AppSync 控制台

  2. API 页面上,选择 GraphQL API 的名称。

  3. 在 API 主页的导航窗格中,选择 “设置”

  4. Logging (日志记录) 下,执行以下操作:

    1. 打开 “启用日志”。

    2. 要查看详细的请求级别日志,请选中 “包含详细内容” 下的复选框。 (可选)

    3. 字段解析器日志级别下,选择首选的字段级日志记录级别(错误全部)。 (可选)

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

  5. 选择 Save(保存)。

手动配置 IAM 角色

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

IAM 控制台中,使用名称创建AWSAppSyncPushToCloudWatchLogsPolicy具有以下定义的新策略:

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

接下来,使用该名称创建一个新角色 AWSAppSyncPushToCloudWatchLogsRole,并将新创建的策略附加到该角色。将此角色的信任关系编辑为以下内容:

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

复制角色 ARN 并在为Amazon AppSync GraphQL API 设置日志记录时使用它。

CloudWatch 指标

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

4XXError

由于客户端配置不正确,请求无效而导致的错误。通常,这些错误发生在 GraphQL 处理之外的任何地方。例如,当请求包含不正确的 JSON 负载或不正确的查询、服务受到限制或授权设置配置错误时,可能会发生这些错误。

单位计数。使用 Sum 统计数据以得出这些错误的总出现次数。

5XXError

在运行 GraphQL 查询期间遇到错误。例如,当调用空或不正确的架构的查询时,可能会发生这种情况。当 Amazon Cognito 用户池 ID 或Amazon区域无效时,也会发生这种情况。或者,如果在处理请求期间Amazon AppSync 遇到问题,也可能发生这种情况。

单位计数。使用 Sum 统计数据以得出这些错误的总出现次数。

Latency

从 Amazon AppSync 从客户端收到请求到其将响应返回给客户端所经过的时间。这不包括响应进入终端设备所遇到的网络延迟。

单位毫秒。使用平均值统计数据可评估预期延迟。

Requests

您账户中的所有 API 已处理的请求(查询+突变)的数量(按区域划分)。

单位计数。在特定区域中处理的所有请求的数量。

TokensConsumed

的分配条件Requests为 aRequest 消耗的资源量(处理时间和使用的内存)。通常,每个代币Request消耗一个代币。但是Request,消耗大量资源的 a 会根据需要分配额外的代币。

单位计数。分配给在特定区域处理的请求的代币数量。

实时订阅

所有指标都在一个维度中发出:GraphQLAPIId。这意味着所有指标都与 GraphQL API ID 相结合。以下指标与 GraphQL 订阅量高于纯订阅量有关 WebSockets:

ConnectSuccess

成功 WebSocket 连接的次数Amazon AppSync。可以在没有订阅的情况下进行连接。

单位计数。使用 Sum 统计数据可得出成功连接的总出现次数。

ConnectClientError

Amazon AppSync 由于客户端错误而被拒绝的 WebSocket 连接数。这可能意味着服务受到限制或授权设置配置不正确。

单位计数。使用 Sum 统计数据以得出客户端连接错误的总出现次数。

ConnectServerError

处理连接时源自 Amazon AppSync 的错误数。当出现意外的服务器端问题时,通常会发生这种错误。

单位计数。使用 Sum 统计数据以得出服务器端连接错误的总出现次数。

DisconnectSuccess

成功 WebSocket 断开连接的次数Amazon AppSync。

单位计数。使用 Sum 统计数据可得出成功断开连接的总出现次数。

DisconnectClientError

断开 WebSocket连接Amazon AppSync 时产生的客户端错误的数量。

单位计数。使用 Sum 统计数据可得出断开连接错误的总出现次数。

DisconnectServerError

断开 WebSocket连接Amazon AppSync 时产生的服务器错误的数量。

单位计数。使用 Sum 统计数据可得出断开连接错误的总出现次数。

SubscribeSuccess

成功注册到Amazon AppSync 的订阅数量 WebSocket。没有订阅就可以建立连接,但是如果没有连接,则不可能有订阅。

单位计数。使用 Sum 统计数据以得出成功订阅的总发生次数。

SubscribeClientError

由于客户端错误而被 Amazon AppSync 拒绝的订阅数。当 JSON 负载不正确、服务受限或授权设置配置错误时,可能会发生这种情况。

单位计数。使用 Sum 统计数据以得出客户端订阅错误的总出现次数。

SubscribeServerError

处理订阅时源自 Amazon AppSync 的错误数。当出现意外的服务器端问题时,通常会发生这种错误。

单位计数。使用 Sum 统计数据以得出服务器端订阅错误的总出现次数。

UnsubscribeSuccess

成功处理的取消订阅请求的数量。

单位计数。使用 Sum 统计数据获取成功取消订阅请求的总次数。

UnsubscribeClientError

因 Client 端错误Amazon AppSync 而被拒绝的取消订阅请求的数量。

单位计数。使用 Sum 统计数据获取客户端取消订阅请求错误的总发生次数。

UnsubscribeServerError

处理取消订阅请求Amazon AppSync 时产生的错误数量。当出现意外的服务器端问题时,通常会发生这种错误。

单位计数。使用 Sum 统计数据来获取服务器端取消订阅请求错误的总发生次数。

PublishDataMessageSuccess

已成功发布的订阅事件消息的数量。

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

PublishDataMessageClientError

由于客户端错误而无法发布的订阅事件消息的数量。

Unit: 计数。使用 Sum 统计数据以得出客户端发布订阅事件错误的总出现次数。

PublishDataMessageServerError

发布订阅事件消息时源自 Amazon AppSync 的错误数。当出现意外的服务器端问题时,通常会发生这种错误。

单位计数。使用 Sum 统计数据以得出服务器端发布订阅事件错误的总出现次数。

PublishDataMessageSize

已发布的订阅事件消息的大小。

单位字节

ActiveConnections

1 分钟内从客户端到Amazon AppSync 的并发 WebSocket 连接数。

单位计数。使用 Sum 统计数据以得出建立的连接总数。

ActiveSubscriptions

1 分钟内来自客户端的并发订阅数。

单位计数。使用 Sum 统计数据以得出有效订阅的总数。

ConnectionDuration

连接保持打开状态的时间量。

单位毫秒。使用 Average 统计数据可评估连接持续时间。

InvalidationSuccess

订阅数量因变异而成功失效(取消订阅)$extensions.invalidateSubscriptions()

单位计数。使用 Sum 统计数据检索成功取消订阅的总数。

CloudWatch 日志

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

请求级日志

配置请求级日志(包括详细内容)时,将记录以下信息:

  • 消耗的代币数量

  • 请求和响应 HTTP 标头

  • 请求中正在运行的 GraphQL 查询

  • 整体操作摘要

  • 已注册的新的和现有的 GraphQL 订阅

字段级别的日志

配置字段级日志记录时,将记录以下信息:

  • 生成的请求映射,其中包含每个字段的源和参数

  • 每个字段的转换响应映射,其中包括解析该字段后得出的数据

  • 每个字段的跟踪信息

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

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

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

字段级别日志记录配置为使用以下日志级别:

  • None-未捕获任何字段级别的日志。

  • E@@ rror-针对出现错误的字段记录以下信息:
    • 服务器响应中的错误部分

    • 字段级别错误

    • 所生成的请求/响应函数,已针对错误字段获得解析

  • 全部-记录查询中所有字段的以下信息:
    • 字段级别跟踪信息

    • 所生成的请求/响应函数,已针对每个字段获得解析

监控的优势

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

{ "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 日,Amazon AppSync 生成日志事件为完全结构化的 JSON。这可以帮助您使用 Logs Insights 和 Amazon Service 等 CloudWatch 日志分析 OpenSearch 服务来了解您的 GraphQL 请求的性能和架构字段的使用特征。例如,您可以轻松识别具有较大延迟的解析程序,这可能是导致性能问题的根本原因。您还可以识别架构中最常用和最不常用的字段,并评估弃用 GraphQL 字段的影响。

冲突检测和同步记录

如果Amazon AppSync API 将 CloudWatch 日志记录配置为将字段解析器日志级别设置为 “全部”,则会向日志组Amazon AppSync 发出冲突检测和解决信息。这可以详细了解Amazon AppSync API 如何应对冲突。为了帮助您解释响应,日志中提供了以下信息:

conflictType

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

conflictHandlerConfigured

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

message

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

syncAttempt

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

data

如果配置的冲突处理程序是Automerge,则填充此字段以显示对每个字段做出的Automerge决定。提供的操作可以是:

  • RE JECTED-当Automerge拒绝传入字段值而取代服务器中的值时。

  • Automerge添@@ -由于服务器中没有预先存在的值,在传入字段上添加时。

  • AP PENDEAutomerge D-将传入值附加到服务器中存在的列表值时。

  • AutomergeMERGED-将传入值@@ 合并到服务器中存在的 Set 值时。

使用代币数量来优化您的请求

消耗少于或等于 1,500 KB 秒内存和 vCPU 时间的请求将分配一个令牌。资源消耗超过 1,500 KB 秒的请求会收到额外的令牌。例如,如果请求消耗 3,350 KB 秒,则会为该请求Amazon AppSync 分配三个令牌(向上舍入到下一个整数值)。默认情况下,在每个Amazon区域,每秒最多向账户中的 APIAmazon AppSync 分配 2,000 个请求令牌。如果您的 API 每个 API 平均每秒使用两个令牌,则您将被限制为每秒 1,000 个请求。如果您每秒需要的代币数量超过分配的数量,则可以提交请求以增加请求令牌速率的默认配额。有关更多信息,请参阅《Amazon一般参考指南》中的Amazon AppSync终端节点和配额和Service Quotas 用户指南中的请求增加配额

每次请求的代币数量过高可能表明有机会优化您的请求并提高 API 的性能。可能增加您的每次请求令牌数量的因素包括:

  • 您的 GraphQL 架构的大小和复杂性。

  • 请求和响应映射模板的复杂性。

  • 每个请求的解析器调用次数。

  • 解析条件返回的数据量。

  • 下游数据源的延迟。

  • 需要连续数据源调用(而不是parallel 或批量调用)的架构和查询设计。

  • 日志配置,尤其是字段级和详细的日志内容。

注意

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

日志类型引用

RequestSummary

  • requestId:请求的唯一标识符。

  • graphQLAPIId:发出请求的 GraphQL API 的 ID。

  • statusCode:HTTP 状态码响应。

  • 延迟:请求的 End-to-end 延迟,以纳秒为单位,以整数表示。

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

ExecutionSummary

  • requestId:请求的唯一标识符。

  • graphQLAPIId:发出请求的 GraphQL API 的 ID。

  • startTime:GraphQL 处理请求的开始时间戳,采用 RFC 3339 格式。

  • EndTime:GraphQL 处理请求的endTime 戳,采用 RFC 3339 格式。

  • 持续时间:以纳秒为单位的 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" }

跟踪

  • 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 日志

以下是您可以运行的查询示例,以获取有关 GraphQL 操作的性能和运行状况的可行的见解。这些示例在 Logs Insight CloudWatch s 控制台中以示例查询的形式提供。在CloudWatch控制台中,选择 Log s Insights,选择 GraphQL APIAmazon AppSync 的日志组,然后在 “示例Amazon 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 服务分析您的日志

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

使用 OpenSearch 服务时,使用 “cwl*” 作为筛选模式来搜索 OpenSearch 索引。 OpenSearch 服务索引从日志流式传输 CloudWatch 的日志,前缀为 “cwl-”。为了区分Amazon AppSync API 日志与发送到 Serv OpenSearch ice 的其他 CloudWatch 日志,我们建议您在搜索中graphQLAPIID.keyword=YourGraphQLAPIID添加额外的筛选表达式。

日志格式迁移

2019 年 5 月 8 日当天或之后Amazon AppSync 生成的日志事件被格式化为完全结构化的 JSON。要分析 2019 年 5 月 8 日之前的 GraphQL 请求,您可以使用GitHub 示例中提供的脚本将较旧的日志迁移到完全结构化的 JSON。如果需要在 2019 年 5 月 8 日之前使用日志格式,请使用以下设置创建支持服务单:将 Type (类型) 设置为 Account Management (账户管理),然后将 Category (类别) 设置为 General Account Question (一般账户问题)

您还可以使用指标筛选条件 CloudWatch 将日志数据转换为数值 CloudWatch 指标,供您生成图表或设置警报。