使用 CloudWatch 监控和记录 GraphQL API 数据
您可以使用 CloudWatch 指标和 CloudWatch 日志来记录和调试 GraphQL API。这些工具使开发人员能够有效地监控性能,排查问题并优化 GraphQL 操作。
CloudWatch 指标是一款工具,可提供各种指标来监控 API 性能和使用情况。这些指标分为两个主要类别:
-
常规 API 指标:包括用于跟踪客户端和服务器错误的
4XXError和5XXError、用于测量响应时间的Latency、用于监控 API 调用总数的Requests以及用于跟踪资源使用情况的TokensConsumed。 -
实时订阅指标:这些指标侧重于 WebSocket 连接和订阅活动。它们包括关于连接请求、成功连接、订阅注册、消息发布以及活跃连接和订阅的指标。
本指南还介绍了增强指标,这些指标提供了有关解析器性能、数据来源交互和各项 GraphQL 操作的更精细数据。这些指标提供了更深入的见解,但也带来了额外的成本。
CloudWatch Logs 是一款为 GraphQL API 启用日志记录功能的工具。可以在 API 的两个级别上设置日志:
-
请求级日志:这些日志捕获整体请求信息,包括 HTTP 标头、GraphQL 查询、操作摘要和订阅注册。
-
字段级日志:这些日志提供有关各个字段解析的详细信息,包括请求和响应映射以及每个字段的跟踪信息。
您可以配置日志记录,解释日志条目,以及使用日志数据进行问题排查和优化。AWSAppSync 提供各种日志类型,可显示查询的执行、解析、验证和字段解析数据。
设置和配置
要在 GraphQL API 上开启自动日志记录,请使用 AWS AppSync 控制台。
-
登录到 AWS 管理控制台,然后打开 AppSync 控制台
。 -
在 API 页面上,选择一个 GraphQL API 的名称。
-
在您的 API 主页的导航窗格中,选择设置。
-
在日志记录下面,执行以下操作:
-
开启启用日志记录。
-
要获取详细的请求级日志记录,请选中包含详细内容下面的复选框(可选)。
-
在字段解析器日志级别下面,选择所需的字段级日志记录级别(无、错误、信息、调试或全部)。(可选)
-
在创建或使用现有角色下面,选择新角色以创建新的 AWS Identity and Access Management (IAM) 角色,从而允许 AWS AppSync 将日志写入到 CloudWatch 中。或者,选择现有角色以选择您的 AWS 账户中的现有 IAM 角色的 Amazon 资源名称 (ARN)。
-
-
选择保存。
手动配置 IAM 角色
如果您选择使用现有的 IAM 角色,该角色必须为 AWS AppSync 授予将日志写入到 CloudWatch 所需的权限。要手动配置该角色,您必须提供服务角色 ARN,以使 AWS AppSync 可以在写入日志时担任该角色。
在 IAM 控制台AWSAppSyncPushToCloudWatchLogsPolicy 的新策略,该策略具有以下定义:
接下来,创建一个名为 AWSAppSyncPushToCloudWatchLogsRole 的新角色,并将新创建的策略附加到该角色。编辑该角色的信任关系以包含以下内容:
复制角色 ARN,并在为 AWS AppSync GraphQL API 设置日志记录时使用该 ARN。
CloudWatch 指标
您可以使用 CloudWatch 指标进行监控,并提供有关可能导致 HTTP 状态代码或源于延迟的特定事件的警报。将发出以下指标:
-
4XXError -
由于客户端配置不正确导致请求无效而产生的错误。通常,这些错误是在 GraphQL 处理以外的任何地方发生的。例如,如果请求包含不正确的 JSON 负载或不正确的查询,服务受到限制或未正确配置授权设置,则可能会出现这些错误。
单位:计数。使用 Sum 统计数据以得出这些错误的总出现次数。
-
5XXError -
在运行 GraphQL 查询期间遇到的错误。例如,在为空架构或不正确的架构调用查询时,可能会出现该错误。在 Amazon Cognito 用户池 ID 或 AWS 区域无效时,也可能会出现该错误。或者,如果 AWS AppSync 在处理请求期间遇到问题,也可能会出现该错误。
单位:计数。使用 Sum 统计数据以得出这些错误的总出现次数。
-
Latency -
在 AWS AppSync 从客户端收到请求到向客户端返回响应间隔的时间。这不包括响应进入终端设备所遇到的网络延迟。
单位:毫秒。使用平均值统计数据可评估预期延迟。
Requests-
您的账户中的所有 API 已处理的请求(查询 + 变量)数量(按区域划分)。
单位:计数。特定区域中处理的所有请求的数量。
TokensConsumed-
根据
Request使用的资源量(处理时间和使用的内存),为Requests分配令牌。通常,每个Request使用一个令牌。不过,根据需要,将为使用大量资源的Request分配额外的令牌。单位:计数。为特定区域中处理的请求分配的令牌数量。
NetworkBandwidthOutAllowanceExceeded-
注意
在 AWS AppSync 控制台的缓存设置页面上,缓存运行状况指标选项让您可以启用这个与缓存相关的运行状况指标。
因吞吐量超出聚合带宽限制而丢弃的网络数据包数。这对于诊断缓存配置中的瓶颈很有用。通过在
appsyncCacheNetworkBandwidthOutAllowanceExceeded指标中指定API_Id来记录特定 API 的数据。单位:计数。超出 ID 指定 API 的带宽限制后丢弃的数据包数。
EngineCPUUtilization-
注意
在 AWS AppSync 控制台的缓存设置页面上,缓存运行状况指标选项让您可以启用这个与缓存相关的运行状况指标。
分配给 Redis OSS 进程的 CPU 利用率(百分比)。这对于诊断缓存配置中的瓶颈很有用。通过在
appsyncCacheEngineCPUUtilization指标中指定API_Id来记录特定 API 的数据。单位:百分比。由 ID 指定 API 的 Redis OSS 进程当前使用的 CPU 百分比。
实时订阅
所有指标都在一个维度中发出:GraphQLAPIId。这意味着所有指标都与 GraphQL API ID 相结合。以下指标与纯 WebSockets 上的 GraphQL 订阅相关:
ConnectRequests-
向 AWS AppSync 发出的 WebSocket 连接请求的数量,包括成功和失败的尝试。
单位:计数。使用总和统计数据可获取连接请求总数。
ConnectSuccess-
到 AWS AppSync 的成功 WebSocket 连接数。可以在没有订阅的情况下进行连接。
单位:计数。使用 Sum 统计数据可得出成功连接的总出现次数。
ConnectClientError-
由于客户端错误而被 AWS AppSync 拒绝的 WebSocket 连接数。这可能意味着,服务受到限制或未正确配置授权设置。
单位:计数。使用 Sum 统计数据以得出客户端连接错误的总出现次数。
ConnectServerError-
处理连接时源于 AWS AppSync 的错误数。当出现意外的服务器端问题时,通常会发生这种错误。
单位:计数。使用 Sum 统计数据以得出服务器端连接错误的总出现次数。
DisconnectSuccess-
与 AWS AppSync 成功断开的 WebSocket 连接数。
单位:计数。使用 Sum 统计数据可得出成功断开连接的总出现次数。
DisconnectClientError-
断开 WebSocket 连接时源于 AWS AppSync 的客户端错误数。
单位:计数。使用 Sum 统计数据可得出断开连接错误的总出现次数。
DisconnectServerError-
断开 WebSocket 连接时源于 AWS AppSync 的服务器错误数。
单位:计数。使用 Sum 统计数据可得出断开连接错误的总出现次数。
SubscribeSuccess-
通过 WebSocket 在 AWS AppSync 中成功注册的订阅数。可以在没有订阅的情况下建立连接,但无法在没有连接的情况下进行订阅。
单位:计数。使用 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 的错误而导致无法处理的入站消息数量。
单位:计数。使用总和统计数据可获取与 AWS AppSync 相关的处理失败的入站消息总数。
InboundMessageDelayed-
延迟的入站消息数。当超过入站消息速率限额或出站消息速率限额时,可能会延迟入站消息。
单位:计数。使用总和统计数据可获取延迟的入站消息总数。
InboundMessageDropped-
丢弃的入站消息数。当超过入站消息速率限额或出站消息速率限额时,可能会丢弃入站消息。
单位:计数。使用总和统计数据可获取丢弃的入站消息总数。
InvalidationSuccess-
变更通过
$extensions.invalidateSubscriptions()成功使订阅失效(取消订阅)的次数。单位:计数。可以使用 Sum 统计数据检索成功取消订阅的总订阅数。
InvalidationRequestSuccess-
已成功处理的失效请求数。
单位:计数。使用总和统计数据可获取成功处理的失效请求总数。
InvalidationRequestError-
由于 API 请求无效而导致处理失败的失效请求的数量。
单位:计数。使用总和统计数据可获取与 API 相关的处理失败的失效请求总数。
InvalidationRequestFailure-
由于来自 AWS AppSync 的错误而导致处理失败的失效请求的数量。
单位:计数。使用总和统计数据可获取与 AWS AppSync 相关的处理失败的失效请求总数。
InvalidationRequestDropped-
当超过失效请求限额时丢弃的失效请求的数量。
单位:计数。使用总和统计数据可获取丢弃的失效请求的总数。
比较入站消息和出站消息
执行变更时会调用带有该变更的 @aws_subscribe 指令的订阅字段。每次订阅调用都会生成一条入站消息。例如,如果两个订阅字段在 @aws_subscribe 中指定了相同的变更,则调用该变更时会生成两条入站消息。
一条出站消息等于传输到 WebSocket 客户端的 5 KB 数据。例如,向 10 个客户端发送 15 KB 的数据会产生 30 条出站消息(15 KB * 10 个客户端/每条消息 5 KB = 30 条消息)。
您可以请求增加入站消息或出站消息的配额。有关更多信息,请参阅《AWS 一般参考》中的 AWS AppSync 端点和限额以及《服务配额用户指南》中的请求增加配额。
增强型指标
增强型指标会发出有关 API 使用情况和性能的精细数据,例如 AWS AppSync 请求和错误计数、延迟以及缓存命中数/未命中数。所有增强型指标数据均会发送至您的 CloudWatch 账户,您可以配置将要发送的数据的类型。
注意
使用增强型指标时会收取额外费用。有关更多信息,请参阅 Amazon CloudWatch 定价
这些指标可在 AWS AppSync 控制台的各个设置页面上找到。在 API 设置页面上,您可以使用增强型指标部分启用或禁用以下各项:
解析器指标行为:这些选项控制如何收集解析器的其他指标。您可以选择启用完整请求解析器指标(为请求中的所有解析器启用的指标)或每个解析器的指标(仅为配置设置为已启用的解析器启用的指标)。以下选项可用:
-
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单位:计数。
数据来源指标行为:这些选项控制如何收集数据来源的其他指标。您可以选择启用完整请求数据来源指标(为请求中的所有数据来源启用的指标)或每个数据来源的指标(仅为配置设置为已启用的数据来源启用的指标)。以下选项可用:
-
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 操作级指标。
-
Requests per operation (Request) -
指定 GraphQL 操作被调用的次数。
指标维度:
API_Id、Operation单位:计数。
-
GraphQL errors per operation (GraphQLError) -
在指定 GraphQL 操作期间发生的 GraphQL 错误数。
指标维度:
API_Id、Operation单位:计数。
CloudWatch 日志
您可以对任何新的或现有的 GraphQL API 配置两种类型的日志记录:请求级别和字段级别。
请求级日志
如果配置了请求级日志记录(包含详细内容),将记录以下信息:
-
使用的令牌数
-
请求和响应 HTTP 标头
-
请求中运行的 GraphQL 查询
-
总体操作摘要
-
已注册的新的和现有的 GraphQL 订阅
字段级日志
如果配置了字段级日志记录,将记录以下信息:
-
生成的请求映射,其中包含每个字段的源和参数
-
每个字段的转换响应映射,其中包括作为该字段解析结果的数据
-
每个字段的跟踪信息
如果您开启日志记录,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、$util.log.debug、console.log和console.debug发送的用户消息 -
不显示字段级跟踪和映射日志。
-
-
- 全部 - 记录查询中的所有字段的以下信息:
-
-
字段级别跟踪信息
-
为每个字段解析生成的请求/响应函数
-
监控优势
您可以使用日志记录和指标来识别、优化 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 }
在前面的日志结果中,path 显示运行名为 singlePost() 的查询而返回的数据中的单个项目。在该示例中,它表示第一个索引 (0) 处的 name 字段。startOffset 提供相对于 GraphQL 查询操作开始位置的偏移。duration 是解析该字段的总时间。这些值可用来排除下面这类问题:为何来自特定数据来源的数据的运行速度可能低于预期,或者特定字段是否降低了整个查询的速度等。例如,您可以选择增加 Amazon DynamoDB 表的预置吞吐量,或从查询中删除导致整体操作性能不佳的特定字段。
自 2019 年 5 月 8 日起,AWS AppSync 以完全结构化的 JSON 形式生成日志事件。这可以帮助您使用日志分析服务(例如 CloudWatch Logs Insights 和 Amazon OpenSearch Service)了解 GraphQL 请求的性能以及架构字段的使用特性。例如,您可以轻松识别具有较大延迟的解析器,这可能是导致性能问题的根本原因。您还可以识别架构中最常用和最不常用的字段,并评估弃用 GraphQL 字段的影响。
冲突检测和同步日志记录
如果 AWS AppSync API 配置了 CloudWatch Logs 日志记录,并将字段解析器日志级别设置为全部,则 AWS AppSync 向日志组发出冲突检测和解决信息。这提供了 AWS AppSync API 如何应对冲突的详细见解。为了帮助您解释响应,在日志中提供了以下信息:
-
conflictType -
详细说明是否由于版本不匹配或由于客户提供的状况而发生冲突。
-
conflictHandlerConfigured -
说明请求时在解析器上配置了冲突处理程序。
-
message -
提供有关如何检测和解决冲突的信息。
-
syncAttempt -
服务器在最终拒绝请求之前尝试同步数据的次数。
-
data -
如果配置的冲突处理程序为
Automerge,则填充该字段以显示Automerge为每个字段做出的决策。提供的操作可以是:-
REJECTED -
Automerge拒绝传入的字段值,而采用服务器中的值。 -
ADDED - 由于服务器中没有预先存在的值,
Automerge添加传入的字段。 -
APPENDED -
Automerge将传入的值附加到服务器中存在的列表值。 -
MERGED -
Automerge将传入的值合并到服务器中存在的集合值。
-
使用令牌计数优化您的请求
对于使用少于或等于 1,500 KB 秒内存和 vCPU 时间的请求,将分配一个令牌。对于使用超过 1,500 KB 秒资源的请求,将收到额外的令牌。例如,如果请求使用 3,350 KB 秒,则 AWS AppSync 为该请求分配三个令牌(向上舍入到下一个整数值)。默认情况下,AWS AppSync 每秒最多为您账户中的 API 分配 5000 或 10000 个请求令牌,具体取决于部署在哪个 AWS 区域。如果您的每个 API 平均每秒使用两个令牌,则每秒的请求数将分别限制为 2500 或 5000 个。如果您每秒需要的令牌数多于分配的数量,您可以提交请求以增加请求令牌速率的默认配额。有关更多信息,请参阅 AWS 一般参考 guide 中的 AWS AppSync endpoints and quotas 以及 Service Quotas User Guide 中的 Requesting a quota increase。
如果每个请求的令牌数较高,则可能表明需要优化您的请求并提高 API 性能。可能增加每个请求的令牌数的因素包括:
-
GraphQL 架构的大小和复杂性。
-
请求映射模板和响应映射模板的复杂性。
-
每个请求的解析器调用次数。
-
从解析器返回的数据量。
-
下游数据来源的延迟。
-
需要连续调用数据来源(而不是并行或批量调用)的架构和查询设计。
-
日志记录配置,特别是字段级和详细日志内容。
注意
除了 AWS AppSync 指标和日志以外,客户端还可以通过响应标头 x-amzn-appsync-TokensConsumed 访问请求中使用的令牌数。
日志大小限制
默认情况下,如果已启用日志记录,则 AWS AppSync 每次请求最多可发送 1 MB 的日志。超过此大小的日志将被截断。要减小日志大小,请为字段级日志选择 ERROR 日志记录级别并禁用 VERBOSE 日志记录,或者在不需要时完全禁用字段级日志。作为 ALL 日志级的替代方案,您可以使用增强型指标来获取有关特定解析器、数据来源或 GraphQL 操作的指标,或者利用 AppSync 提供的日志记录实用程序仅记录必要的信息。
日志类型参考
RequestSummary
-
requestId:请求的唯一标识符。
-
graphQLAPIId:发出请求的 GraphQL API 的 ID。
-
statusCode:HTTP 状态代码响应。
-
latency:请求的端到端延迟,以纳秒为单位,整数值。
{ "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 处理请求的结束时间戳,采用 RFC 3339 格式。
-
duration: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" }
跟踪
-
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 分析您的日志
以下是您可以运行的查询示例,以获取有关 GraphQL 操作的性能和运行状况的可行的见解。这些示例可作为 CloudWatch Logs Insights 控制台中的示例查询提供。在 CloudWatch 控制台
以下查询返回使用令牌数最多的前 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 分析您的日志
您可以使用 Amazon OpenSearch Service 搜索、分析和可视化您的 AWS AppSync 日志,以找出性能瓶颈和运行问题的根本原因。您可以识别具有最大延迟和最多错误的解析器。此外,您还可以使用 OpenSearch 控制面板创建具有强大可视化功能的控制面板。OpenSearch 控制面板是 OpenSearch Service 中提供的开源数据可视化和探索工具。通过使用 OpenSearch 控制面板,您可以持续监控 GraphQL 操作的性能和运行状况。例如,您可以创建控制面板以可视化 GraphQL 请求的 P90 延迟,并深入了解每个解析器的 P90 延迟。
在使用 OpenSearch Service 时,请将 "cwl*" 作为筛选模式以搜索 OpenSearch 索引。OpenSearch Service 使用 "cwl-" 前缀对从 CloudWatch Logs 流式传输的日志编制索引。要将 AWS AppSync API 日志与发送到 OpenSearch Service 的其他 CloudWatch 日志区分开,我们建议在搜索中添加额外的筛选条件表达式 graphQLAPIID.keyword=。YourGraphQLAPIID
日志格式迁移
AWS AppSync 在 2019 年 5 月 8 日或之后生成的日志事件的格式设置为完全结构化的 JSON。要分析 2019 年 5 月 8 日之前的 GraphQL 请求,您可以使用 GitHub 示例
您也可以使用 CloudWatch 中的指标筛选条件,将日志数据转换为数字 CloudWatch 指标,以使您可以为它们绘制图表或设置警报。