我试图在安装了minikube
的{{1}}上建立本地k8s集群,但是在使用Jaeger启用分布式跟踪时遇到了问题。
我有3个微服务istio
。我正在传播所需的所有标头:
A -> B -> C
但是在Jaeger界面上,我只能看到对服务A的请求,而看不到去往服务B的请求。
我已经记录了请求中发送的标头。 服务A的标题:
{"x-request-id", "x-b3-traceid", "x-b3-spanid", "x-b3-parentspanid", "x-b3-sampled", "x-b3-flags", "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:
因此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
数学。有些头没有设置。
另外,我正在通过类型为LoadBalancer的k8s服务IP而不是通过入口访问服务A。不知道这可能是问题所在。
UPD:我已经设置了istio网关,所以现在我可以通过istio网关访问服务x-b3-spanid
。但是结果是一样的,我可以看到A
的跟踪,但没有任何进一步的跟踪
答案 0 :(得分:2)
如果查询不存在的标头,则某些Web框架会返回空字符串。我已经在Spring Boot和KoaJS中看到了这一点。
如果Istio没有发送任何跟踪标头,则此标头逻辑会导致我们为不存在的那些中断跟踪的标头发送空字符串。
我的建议是在获取标头的值之后,将标头中包含空字符串的标头过滤掉,并推广其余标头。