【问题标题】:Auto propogate traces in envoy在特使中自动传播痕迹
【发布时间】:2020-05-07 10:20:12
【问题描述】:

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

它还指出

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

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

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

【问题讨论】:

  • 只有应用程序才能知道从 A 到 B 的客户端调用是先前调用的结果,还是其他/不相关的结果。 Envoy 无法做出这个猜测。这就是为什么您需要传播标头。

标签: distributed istio envoyproxy opentracing distributed-tracing


【解决方案1】:

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

所以:

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

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

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

【讨论】:

    【解决方案2】:

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


    因此它会警告我们以下情况:

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

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

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


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

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

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

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

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2022-10-05
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      相关资源
      最近更新 更多