3

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

{"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 的请求。

我已经记录了请求中发送的标头。服务 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: 

服务 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-id, x-b3-traceid, x-b3-sampled, 和x-b3-spanid数学。有一些标题没有设置。另外,我通过 LoadBalancer 类型的 k8s 服务 IP 访问服务 A,而不是通过入口。不知道这是否可能是问题所在。

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

4

1 回答 1

3

如果查询不存在的标头,某些 Web 框架会返回空字符串。我在 Spring Boot 和 KoaJS 中看到了这一点。

如果 Istio 未发送任何跟踪标头,则此标头逻辑会导致我们为那些中断跟踪的不存在的标头发送空字符串。

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

于 2018-08-31T08:36:35.580 回答