使用 grpc 服务器拦截器进行嵌套的服务器调用

Using grpc server interceptors for nested server calls

我有一个调用 grpc 服务 A 的客户端调用另一个 grpc 服务 B。我想使用 ServerInterceptor 实现来捕获从客户端开始的根跨度(级别 1)下的整个调用跟踪,服务 A 作为其子跨度(级别 2),服务 B 作为下一级子跨度(在级别 3),如下所示:

Client Span
   |
   |__ Server A Span
              |
              |__ Server B Span

我想为此目的使用客户端和服务器拦截器,因为我可以跟踪所有方法调用而无需显式检测整个产品代码。因此,我需要在进行每个子调用时将 span 上下文与父 span 一起注入,以便子级别的拦截器可以在创建自己的 span 时将其提取并用作父 span。

由于我需要在服务器启动时声明并传递所有拦截器,如图所示here,这些拦截器不会相互交互。在这种情况下,如何在每个级别动态注入 span 上下文?有没有办法在拦截另一个调用的同时将 ServerInterceptor 添加到启动的服务中?

换句话说,如何在使用单独的服务器跟踪拦截器跟踪的服务之间传播 span 上下文?

以下是我添加拦截器的方式:

server = ServerBuilder.forPort(port)
.addService(ServerInterceptors.intercept(service, someInterceptor,
    someOtherInterceptor, serverTracingInterceptor))
.build()
.start();

我正在尝试创建与这些类似的服务器和客户端跟踪拦截器: ServerTracingInterceptor.java, ClientTracingInterceptor.java.

如果这不可能,您能否提出替代方法?

谢谢!

这绝对是一个错误。请针对 opentracing java-grpc

提交问题