GuanceCloud / dd-trace-java

Datadog APM client for Java
https://docs.datadoghq.com/tracing/languages/java
Apache License 2.0
9 stars 3 forks source link

dubbo 2.7.6 支持 #31

Closed lrwh closed 1 year ago

lrwh commented 1 year ago

客户dubbo环境为 2.7.6,接入 ddtrace 后,发现服务拓扑图无法正常链接,以下是服务拓扑图

1681090004502

经排查几个的 agent 几个版本(包含重构后的版本),均存在这个问题。

通过日志排查分析,consumer 可以正常将 traceid 通过 inject 注入,provider 无法取出对应的参数信息,导致 provider 构建 span 无法获取 consumer 的 trace 信息,产生了新的 trace 信息,从而导致链路断裂。

472a5388c616e3307303bba780225e4

以下是本机测试效果,与客户环境结论一致。

1681089962302

最终结论:dubbo 探针不支持 2.7.6版本,需要提供版本支持。

lrwh commented 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 信息

1681204904301