加入我们,于10月8日至10日在纽约市学习有关 GraphQL Federation 和 API 平台工程的最新技巧、趋势和新闻。加入我们参加2024年纽约市的 GraphQL Summit
文档
免费开始

从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设置,以便在需要时在日志中打印查询计划,以便进行进一步的调试。

下一个
首页
评分文章评分在GitHub上编辑编辑论坛Discord

©2024Apollo Graph Inc.,商业名称Apollo GraphQL。

隐私政策

公司