我正在尝试建立一个本地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网关,所以现在我通过istio网关访问服务A
。然而结果是一样的,我可以看到gateway->A
的痕迹,但没有任何进一步的追踪
如果查询不存在的标头,某些Web框架将返回空字符串。我在Spring Boot和KoaJS中看到过这个。
如果Istio没有发送任何跟踪头,则此头逻辑会导致我们为那些不存在的标头发送空字符串,从而中断跟踪。
我的建议是在获取头文件的值后,将带有空字符串的值作为其值,并传播剩余的值。