Closed lrwh closed 1 year ago
1、 2.7.6 版本,Consumer 通过 RpcContext
注入 trace 相关参数后,Provider 无法通过 RpcContext
提取相关字段,导致 trace 信息丢失,使用 RpcInvocation
也是同样的问题。但2.7.15
以上版本均正常提取,疑是 dubbo 自身问题。
2、通过使用 RpcInvocation
注入 trace 信息后,使用 toString()
可以看到attachments
存在 trace 相关信息,但是通过getAttachments()
仍无法获取参数信息,再次确认是 dubbo 源码 bug 所致。
RpcInvocation 部分源码如下:
package org.apache.dubbo.rpc;
...
public class RpcInvocation implements Invocation, Serializable {
...
@Override
public Map<String, String> getAttachments() {
return attachments;
}
@Override
public String toString() {
return "RpcInvocation [methodName=" + methodName + ", parameterTypes="
+ Arrays.toString(parameterTypes) + ", arguments=" + Arrays.toString(arguments)
+ ", attachments=" + attachments + "]";
}
RpcInvocation [methodName=sayHello, parameterTypes=[class java.lang.String], arguments=[world], attachments={input=399, path=com.steven.springboot.demo.DemoService, x-datadog-parent-id=2873575898912583678, x-datadog-sampling-priority=1, remote.application=dubbo-springboot-demo-consumer, x-datadog-tags=_dd.p.dm=-1, dubbo=2.0.2, x-datadog-trace-id=3124467397194067274, interface=com.steven.springboot.demo.DemoService, version=0.0.0}]
3、既然无法通过getAttachments()
获取相关信息,而attachments
是一个私有成员变量,所以采用反射的方式获取属性信息
Map<String, String> attachments = (Map<String, String>) getValue(RpcInvocation.class, carrier.getInvocation(), "attachments");
测试结果,通过这种方式 Provider 可以正确获取 trace 信息
客户dubbo环境为 2.7.6,接入 ddtrace 后,发现服务拓扑图无法正常链接,以下是服务拓扑图
经排查几个的 agent 几个版本(包含重构后的版本),均存在这个问题。
通过日志排查分析,consumer 可以正常将 traceid 通过 inject 注入,provider 无法取出对应的参数信息,导致 provider 构建 span 无法获取 consumer 的 trace 信息,产生了新的 trace 信息,从而导致链路断裂。
以下是本机测试效果,与客户环境结论一致。
最终结论:dubbo 探针不支持 2.7.6版本,需要提供版本支持。