Istio 分布式跟踪与 Jaeger 不工作

Istio distributed tracing with Jaeger not working

我正在尝试设置本地 k8s 集群,并在 minikube 上安装了 istio,我在使用 Jaeger 启用分布式跟踪时遇到问题。 我有 3 个微服务 A -> B -> C。我正在传播所有需要的 headers:

{"x-request-id", "x-b3-traceid", "x-b3-spanid", "x-b3-parentspanid", "x-b3-sampled", "x-b3-flags", "x-ot-span-context"}

但是在Jaeger界面上,我只能看到对服务A的请求,看不到对服务B的请求。

我已经记录了请求中发送的 headers。 Headers 来自服务 A:

Header - x-request-id: c2804368-2ff0-9d90-a2aa-972537968924
Header - x-b3-traceid: 3a2400b40bbe5ed8
Header - x-b3-spanid: 3a2400b40bbe5ed8
Header - x-b3-parentspanid: 
Header - x-b3-sampled: 1
Header - x-b3-flags: 
Header - x-ot-span-context: 

Headers 来自服务 B:

Header - x-request-id: c2804368-2ff0-9d90-a2aa-972537968924
Header - x-b3-traceid: 3a2400b40bbe5ed8
Header - x-b3-spanid: 3a2400b40bbe5ed8
Header - x-b3-parentspanid:
Header - x-b3-sampled: 1
Header - x-b3-flags:
Header - x-ot-span-context:

因此 x-request-idx-b3-traceidx-b3-sampledx-b3-spanid 数学。有一些 headers 没有设置。 此外,我正在通过 LoadBalancer 类型的 k8s 服务 IP 访问服务 A,而不是通过入口。不知道这是否是问题所在。

UPD:我已经设置了 istio 网关,所以现在我正在通过 istio 网关访问服务 A。但是结果是一样的,我可以看到 gateway->A 的跟踪,但没有任何进一步的跟踪

如果查询 non-existent header,某些 Web 框架 return 空字符串。我在 Spring Boot 和 KoaJS 中看到过这个。

如果 Istio 未发送任何跟踪 headers,此 header 逻辑会导致我们为那些中断的 non-existent headers 发送空字符串跟踪。

我的建议是在获取 headers 的值后过滤掉空字符串作为其值的值并传播剩余的值。