基于文档,envoy 能够生成跟踪并将跟踪传播到 Jaeger 服务集群。
它还指出
为了充分利用跟踪,应用程序必须传播 Envoy 在调用其他服务时生成的跟踪标头。
因此,假设如果客户端调用 -> 服务 A -> 调用服务 B,则服务 A 被代理在特使后面。如果服务 A 调用服务 B,那么从 A 到 B 的调用也必须通过 envoy right。所以客户端调用服务A时envoy最初生成的跟踪Id,不会传播到服务B。
为什么应用程序(服务 A)需要转发这些标头?
基于文档,envoy 能够生成跟踪并将跟踪传播到 Jaeger 服务集群。
它还指出
为了充分利用跟踪,应用程序必须传播 Envoy 在调用其他服务时生成的跟踪标头。
因此,假设如果客户端调用 -> 服务 A -> 调用服务 B,则服务 A 被代理在特使后面。如果服务 A 调用服务 B,那么从 A 到 B 的调用也必须通过 envoy right。所以客户端调用服务A时envoy最初生成的跟踪Id,不会传播到服务B。
为什么应用程序(服务 A)需要转发这些标头?
在服务网格中进行跟踪时,在代理后面,初始客户端调用生成的 traceID 仅在调用来自代理->代理时自动传播。
所以:
为了解决这个问题,微服务 A 只需要知道哪些标头代表 traceID,如何附加到其中,以及一些状态以确保它能够发送到传出请求。然后你会得到一个完整的交易链。
如果没有服务传播标头,跟踪基本上会为您提供以微服务结尾的每条路径。仍然有用,但没有完整的图片。
我对此的解释是,我们需要记住,服务之间的通信需要支持转发/“传递”跟踪 ID,以便跟踪正常工作。
因此,它警告我们不要出现以下情况:
客户端调用 -> 服务 A #using http 请求,标头中有跟踪 ID。
Service A -> Service B #使用不支持 headers 的 tcp 请求,trace ID header 丢失。
这种情况可能会破坏或限制跟踪功能。
另一方面,如果我们有以下情况:
客户端调用 -> 服务 A #using http 请求,标头中有跟踪 ID。
服务 A -> 服务 B #使用 http 请求将跟踪 ID 转发给服务 B。
这种情况允许两个连接中都存在跟踪 ID 标头,因此可以记录跟踪,然后在跟踪服务仪表板中查看。然后我们可以探索请求所走的路径,并查看每一跳产生的延迟。
希望能帮助到你。