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

spring-cloud-gateway 3.× 接入ddtrace 出现断链 #54

Closed lrwh closed 6 months ago

lrwh commented 10 months ago

问题

在请求头设置一个x-datadog-trace-id,经过网关层服务到下游服务,在下游服务入口处打印出的日志请求头x-datadog-trace-id值变化了。但是如果不加ddtrace的agent则是正常的。

image

其中 ddtrace 版本 为 v1.8.5-guance

java 版本

java环境:version 11.0.10

架构信息

spring-boot-starter-webflux 2.4.3
spring-boot-starter-data-redis-reactive 2.4.3
spring-cloud-starter-gateway 3.0.2
spring-cloud-starter-netflix-eureka-client 3.0.2
spring-cloud-starter-openfeign 3.0.2
spring-cloud-starter-sleuth 3.0.2
micrometer-registry-prometheus 1.6.4
knife4j-micro-spring-boot-starter 3.0.2
knife4j-spring-boot-starter 3.0.2
redis.clients.jedis 2.9.0
com.ctrip.framework.apollo.apollo-client 1.7.0-sino

期望

期望能够串联链路

songlonqi-java commented 9 months ago

测试

测试源码引用gitee上一个demo : https://gitee.com/tianxingfy/spring-cloud-gateway-demo

测试过程

gateway-test-demo gateway-test-demo2 tx-gateway 三个服务编译mvn package

运行:

# 启动 demo01
java -javaagent:/home/songlq/ddtrace/dd-java.jar -Ddd.service=demo01 -jar target/demo-0.0.1-SNAPSHOT.jar

# 启动demo02
java -javaagent:/home/songlq/ddtrace/dd-java.jar -Ddd.service=demo01 -jar target/demo2-0.0.1-SNAPSHOT.jar

# 启动 gateway
java -javaagent:/home/songlq/ddtrace/dd-java.jar   -Ddd.service=gateway -jar target/tx-gateway-0.0.1-SNAPSHOT.jar

发送curl 请求:

# curl
curl -H "x-datadog-trace-id: 4641233628968455336" -H "x-datadog-parent: 6053029447799132885" http://localhost:8080/api/business/health

image

我测试是ok的。 使用的ddtrace是最新版本。

rhinuxx commented 9 months ago

感谢回复,不过其实我想知道,能不能相同的版本复现问题。从而确定是否这个版本的ddtrace毕现,而只需要升级ddtrace就可以解决了

songlonqi-java commented 9 months ago

我方才 v1.8.5-guance 测了下,也是可以透传过去的

curl -H "x-datadog-trace-id: 4641233628968455361" -H "x-datadog-paren7: 6053094479913286" http://localhost:8080/api/business/health

在demo1中 打印headers:

    @RequestMapping("/health")
    public String health(@RequestHeader Map<String, String> headers) {
        System.out.println("health check");
        headers.forEach((key,val) -> {System.out.println("key="+key+"val="+val);});
        return "business 1";
    }

结果:

key=user-agentval=curl/7.64.0
key=acceptval=*/*
key=x-datadog-paren7val=6053094479913286
key=forwardedval=proto=http;host="localhost:8080";for="0:0:0:0:0:0:0:1%0:39856"
key=x-forwarded-forval=0:0:0:0:0:0:0:1%0
key=x-forwarded-protoval=http
key=x-forwarded-prefixval=/api
key=x-forwarded-portval=8080
key=x-forwarded-hostval=localhost:8080
key=hostval=localhost:6002
key=content-lengthval=0
key=x-datadog-trace-idval=4641233628968455361
key=x-datadog-parent-idval=7279483465240776710
key=x-datadog-sampling-priorityval=1
health check

4641233628968455361 这个链路id从gateway传递到demo01中了

lrwh commented 9 months ago

@songlonqi-java 你测试的版本与 @rhinuxx 使用版本不一致,建议使用一样的版本进行测试,目前查看 demo 的版本信息如下:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

gateway 2.0 和 3.0 架构上有很大的变化,建议重新测试

songlonqi-java commented 9 months ago

我JDK是17 升级到spring-boot 3.0 , 测试依旧是没有问题的。从gateway到后端服务,链路是串联的

lrwh commented 7 months ago

应该是客户代码逻辑上有些问题,先close,后续如果有需要再开启

lrwh commented 6 months ago

经验证,是客户使用上存在问题。