联盟跟踪数据
报告细粒度性能指标
使用 GraphQL 作为 API 层的一个好处是GraphQL允许实现细粒度、字段级别的跟踪对每个执行的操作进行。图 OS 平台可以消费和聚合这些跟踪来提供关于您的超图使用情况及性能的详细洞察。
您的超图's 路由器可以生成联盟跟踪并向图 OS 报告。
报告流程
联盟跟踪的总体流程如下:
- 路由器从客户端收到一个操作。
- 路由器为操作生成一个查询计划,并将子查询委派给各个子图。
- 每个被查询的子图都将响应数据返回给路由器。
- 以下每个
extensions
字段均包含对应子查询的数据跟踪。 - 子图必须支持联邦跟踪格式才能在响应中包含跟踪数据。请参阅本节。
- 以下每个
- 路由器从子图表中收集子-查询跟踪集,并以查询计划的形式排列。
- 路由器将联邦跟踪报告给 GraphOS 以进行处理。
总之,子图向路由器报告时间和错误信息,路由器负责汇总这些指标并将它们报告给GraphOS。
启用联邦跟踪
在你的子图
要使子图将跟踪数据包含在其对路由器的响应中,它必须使用支持跟踪格式的与子图兼容的库。
要检查你的子图库是否支持联邦跟踪,请参阅FEDERATED TRACING
在此页面上的库条目本页。
如果你的库支持联邦跟踪,请参阅其文档了解如何启用此功能。
如果你的子图使用Apollo Server配合@apollo/subgraph
,联邦跟踪默认启用。您可以使用 Apollo Server 的内联跟踪插件来自定义此行为。
在 Apollo 路由器中
请参阅将 Apollo 路由器使用数据发送到 GraphOS。
@apollo/gateway
您可以使用 @apollo/server
包的 内置使用情况报告插件 为您的网关启用联邦跟踪。通过 APOLLO_KEY
环境变量为网关提供API密钥,以便网关将指标报告到默认的入口点。为确保 subgraphs 不会报告指标,可以不提供 APOLLO_KEY
,或者安装 ApolloServerPluginUsageReportingDisabled
插件 到您的 ApolloServer
。
这些选项将导致Apollo网关从底层 subgraphs 收集跟踪信息,并将其与查询计划一起传递给Apollo度量入口。
默认情况下,度量报告给当前 GraphOS 变体。要更改报告的变体,请设置 APOLLO_GRAPH_VARIANT
环境变量。
从subgraph公开跟踪数据的方式
本节解释了您的 路由器 如何与带有编码跟踪信息的 subgraphs 进行通信。为了启用联邦跟踪,不需要理解这一点。
您的 路由器 检查所有 subgraph 响应的 extensions
字段 是否存在 ftv1
字段。该字段包含对 subgraph 执行的子查询的跟踪信息的表示,作为跟踪的 protobuf表示 的Base64编码表示。
从 subgraph 获取此信息,路由器 在其请求中包含头对 'apollo-federation-include-trace': 'ftv1'
(如果它已配置为收集跟踪数据)。如果 subgraph 支持 联邦跟踪,则将它附加到响应的 extensions
字段中。
跟踪是如何构建和汇总的
您的 路由器 以查询计划的形式构建迹线,其中嵌入一个用于查询计划中每个提取操作的单个 查询计划,这表示子查询迹线和它们是从底层 子图 中提取的顺序。
阿波罗从这些迹线聚合的字段级统计信息是从子图中操作执行的字段收集的。换句话说,字段统计信息是根据 查询计划器 实现的运算而不是客户端进行的运算来收集的。另一方面,操作级统计信息是对客户端执行的运算进行的聚合,这意味着即使查询计划改变了,统计信息仍对应于相同客户端提交的操作。
错误的工作方式
阿波罗平台通过 formatError
选项为客户端提供修改错误详情的功能。此外,还有支持通过将 sendErrors
选项传递到 内联痕迹插件 修改指标入口错误详情的功能。
当修改客户端的错误时,您可能想使用此选项来隐藏实现细节,如数据库错误,以便用户无法看到。当修改用于报告的错误时,您可能想隐藏或删除个人数据,如用户ID或电子邮件。
由于联邦指标收集是通过从一组分布式 子图 收集延迟和错误信息,这些选项也从这些子图以及路由器受到尊重。子图在其 ftv1
扩展中将错误嵌入到 rewriteError
方法(在子图中传递给内联痕迹插件,而不是网关中的使用报告插件)应用后,网关只报告通过该扩展发送的错误,并忽略向最终用户报告的错误格式。此功能允许子图实现者确定如何向用户和在指标中显示错误信息,而无需网关包含任何可能是子图特定的逻辑。