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

时间:2019-01-09 09:28:03

标签: java interceptor grpc grpc-java opentracing

我有一个客户端,该客户端调用一个grpc服务A,该客户端又调用另一个grpc服务B。我想使用ServerInterceptor实现在客户端和服务A的根范围(级别1)下捕获整个调用跟踪作为其子范围(级别2),将服务B作为下一级子范围(级别3),如下所示:

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

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

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

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

这是我添加拦截器的方式:

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

我正在尝试创建类似于以下内容的服务器和客户端跟踪拦截器: ServerTracingInterceptor.javaClientTracingInterceptor.java

如果这不可能,您能否建议替代方法?

谢谢!

1 个答案:

答案 0 :(得分:1)

这绝对是一个错误。请针对opentracing java-grpc提交问题