从GraphOS路由器或@apollo/gateway调试子图请求
记录查询计划和子图调用以协助调试问题查询
随着你的图增长,你可能会因为某种原因需要调试一个有问题查询。GraphOS路由器和@apollo/gateway
都充当你联邦图的人口,并提供调试请求的方法。
每个客户端请求都会通过一个叫做查询规划的过程,生成要执行的子图请求。您可以在路由器和网关中记录查询计划。
带有标题的查询计划输出
使用路由器 v0.16.0+ 和@apollo/gateway
v2.5.4+,您可以在圭霖语响应扩展中返回以下查询计划的标题:
- 包含Apollo-Query-Plan-Experimental头段会返回响应扩展中的查询计划
- 另外,包含Apollo-Query-Plan-Experimental-Format头段并带上支持选项之一会改变输出格式:
- 值为prettified时,返回查询计划的可读字符串
- 值为internal时,返回查询计划的JSON表示
日志路由子图调用
如果您想在路由实例中调试子图HTTP请求,可以使用Rhai脚本来输出必要的信息。下面是一个示例Rhai脚本:
⚠️ 注意
虽然可以记录变量,但Apollo强烈建议不要这样做,以避免将敏感信息泄露到日志中。
fn subgraph_service(service, subgraph) {service.map_request(|request| {log_info(`Subgraph: ${subgraph} Query: ${request.subgraph.body.query}`);});}
上面示例中,在subgraph_service钩子的map_request函数中的内联闭包用来记录子图相关信息。
要启用查询计划,必须在具有--dev标志的路由器中运行并利用Apollo测试沙盒来显示您的查询计划。
作为使用--dev的替代方案,您还可以通过以下配置选项启用查询计划,但Apollo强烈反对这样做,因为该功能未来可能会被删除或重命名。
plugins:experimental.expose_query_plan: true
记录 @apollo/gateway
子图调用
要在@apollo/gateway实例中调试对subgraphs的查询,可以使用一个buildService
函数来记录操作名称和主体。
⚠️ 注意
虽然可以记录变量,但Apollo强烈建议不要这样做,以避免敏感信息泄露到日志中。
class DebugDataSource extends RemoteGraphQLDataSource {willSendRequest({request}: GraphQLDataSourceProcessOptions<Record<string, any>>): void | Promise<void> {console.log(`Operation name: ${request.operationName}`);console.log(`Query body: ${request.query}`);}}const gateway = new ApolloGateway({debug: true,supergraphSdl,buildService({url}) {return new DebugDataSource({url});}});
上面的代码片段创建了一个新的名为DebugDataSource
的类,通过willSendRequest
钩子来记录操作名称和正文,该钩子在执行前被调用。
最后,它还启用了网关配置中的debug
设置,以便在需要时在日志中打印查询计划,以便进行进一步的调试。