分布式追踪的常见问题
如何使用 Istio 实现分布式追踪?
Istio 使用 Envoy的分布式追踪系统集成。 由应用程序负责为后续传出请求转发追踪的 header 信息。
您可以在分布式链路追踪概述和 Envoy 链路追踪文档中找到更多信息。
使用 Istio 进行分布式追踪需要什么?
Istio 允许报告服务网格中工作负载到工作负载间通信的追踪 Span。 然而,为了将各种追踪 Span 整合在一起以获得完整的流量图,应用程序必须在传入和传出请求之间传播追踪上下文信息。
具体来说,Istio 依靠应用程序来转发 Envoy 生成的请求 ID 和标准标头。这些标头包括:
x-request-id
traceparent
tracestate
Zipkin 用户必须确保他们传播 B3 链路追踪标头。
x-b3-traceid
x-b3-spanId
x-b3-parentspanid
x-b3-sampled
x-b3-flags
b3
标头传播可通过客户端库完成,例如 OpenTelemetry。 它也可手动完成,如分布式链路追踪任务中所述。
基于 Envoy 的跟踪如何工作?
对于基于 Envoy 的跟踪集成,Envoy(Sidecar 代理)代表所代理的应用程序将跟踪信息直接发送到跟踪后端。
Envoy:
- 在请求代理时为请求生成请求 ID 和跟踪标头(例如
X-B3-TraceId
) - 根据请求和响应元数据(即响应时间)为每个请求生成跟踪范围
- 将生成的跟踪范围发送到跟踪后端
- 将跟踪头转发到代理的应用程序
Istio 支持 OpenTelemetry 和兼容的后端,包括 Jaeger。 其他支持的平台包括 Zipkin 和 Apache SkyWalking。
什么生成了初始链路头?
为什么 Istio 不能代替应用程序传播标头?
尽管 Istio Sidecar 将处理关联应用程序实例的入站和出站请求, 它没有将出站请求与导致它们的入站请求相关联的隐式方法。可以实现这种关联的唯一方法是通过应用程序传播相关信息 (例如标头)从入站请求到出站请求。头传播可以通过客户端库或手动完成。 提供了进一步的讨论使用 Istio 进行分布式跟踪需要什么?。
为什么我的请求没有被追踪?
在 default
配置文件中,
链路追踪的采样率被设置为 1%。这意味着 Istio 捕获的 100 个链路实例中只有 1 个会报告给跟踪后端。
demo
配置文件中的采样率设置为 100%。有关如何设置采样率的信息,
请参阅本节。
如果您仍然没有看到任何追踪数据,请确认您的端口是否符合 Istio 端口命名规范, 并公开适当的容器端口(例如,通过 pod spec)来启用 sidecar 代理(Envoy)能够对流量进行捕获。
如果您只看到与出口代理相关的链路数据,而没有看到入口代理, 则可能仍与 Istio 端口命名约定有关。
如何控制追踪数量?
Istio 通过 Envoy,目前支持基于百分比的采样策略来生成追踪信息。 有关如何设置此采样率的更多信息,请参阅本节。
Istio 支持请求跟踪 vert.x 事件总线消息吗?
目前 Istio 不提供对发布/订阅和事件总线协议的支持。这些技术都遵循 best-effort 网络模型,网络传输容易遭到破坏。