0

基于文档,envoy 能够生成跟踪并将跟踪传播到 Jaeger 服务集群。

它还指出

为了充分利用跟踪,应用程序必须传播 Envoy 在调用其他服务时生成的跟踪标头。

因此,假设如果客户端调用 -> 服务 A -> 调用服务 B,则服务 A 被代理在特使后面。如果服务 A 调用服务 B,那么从 A 到 B 的调用也必须通过 envoy right。所以客户端调用服务A时envoy最初生成的跟踪Id,不会传播到服务B。

为什么应用程序(服务 A)需要转发这些标头?

4

2 回答 2

3

在服务网格中进行跟踪时,在代理后面,初始客户端调用生成的 traceID 仅在调用来自代理->代理时自动传播。

所以:

  1. 客户端发送请求
  2. 请求命中某个入口代理。生成跟踪 ID
  3. 请求被路由到服务 A 前面的代理 A。跟踪 ID 从入口代理传播到代理 A
  4. 请求命中微服务 A。跟踪 ID 在标头中传播到此处。
  5. 微服务 A 现在可以完全控制请求。如果服务在向服务 B 发出传出请求时丢弃了所有 HTTP 标头,那么 traceID 也将被丢弃。

为了解决这个问题,微服务 A 只需要知道哪些标头代表 traceID,如何附加到其中,以及一些状态以确保它能够发送到传出请求。然后你会得到一个完整的交易链。

如果没有服务传播标头,跟踪基本上会为您提供以微服务结尾的每条路径。仍然有用,但没有完整的图片。

于 2020-02-05T15:23:23.870 回答
0

我对此的解释是,我们需要记住,服务之间的通信需要支持转发/“传递”跟踪 ID,以便跟踪正常工作。


因此,它警告我们不要出现以下情况:

客户端调用 -> 服务 A #using http 请求,标头中有跟踪 ID。

Service A -> Service B #使用不支持 headers 的 tcp 请求,trace ID header 丢失。

这种情况可能会破坏或限制跟踪功能。


另一方面,如果我们有以下情况:

客户端调用 -> 服务 A #using http 请求,标头中有跟踪 ID。

服务 A -> 服务 B #使用 http 请求将跟踪 ID 转发给服务 B。

这种情况允许两个连接中都存在跟踪 ID 标头,因此可以记录跟踪,然后在跟踪服务仪表板中查看。然后我们可以探索请求所走的路径,并查看每一跳产生的延迟。

希望能帮助到你。

于 2020-01-21T12:41:01.293 回答