我有一个调用 grpc 服务 A 的客户端调用另一个 grpc 服务 B。我想使用ServerInterceptor实现来捕获从客户端开始的根跨度(级别 1)下的整个调用跟踪,并将服务 A 作为其子跨度(级别 2 ) 和服务 B 作为下一级子跨度(在第 3 级),如下所示:
Client Span
|
|__ Server A Span
|
|__ Server B Span
我想为此目的使用客户端和服务器拦截器,因为我可以跟踪所有方法调用,而无需显式检测整个产品代码。因此,我需要在进行每个子调用时将跨度上下文注入父跨度,以便子级拦截器可以在创建自己的跨度时提取并将其用作父跨度。
由于我需要在服务器启动时声明并传递所有拦截器,如此处所示,因此这些拦截器不会相互交互。在这种情况下,如何在每个级别动态注入跨度上下文?有没有办法在拦截另一个呼叫时将 ServerInterceptor 添加到已启动的服务中?
换句话说,如何在使用单独的服务器跟踪拦截器跟踪的服务之间传播 spans 上下文?
这是我添加拦截器的方式:
server = ServerBuilder.forPort(port)
.addService(ServerInterceptors.intercept(service, someInterceptor,
someOtherInterceptor, serverTracingInterceptor))
.build()
.start();
我正在尝试创建类似于这些的服务器和客户端跟踪拦截器: ServerTracingInterceptor.java, ClientTracingInterceptor.java。
如果这是不可能的,你能建议替代方法吗?
谢谢!