8.5 启用基于Zipkin或Jaeger的分布式跟踪

在面向大型服务的体系架构中,分布式跟踪使得开发人员能够得到可视化的调用流程展示。在了解序列化、并行情况以及延迟分析的时候,这个功能至关重要。Istio中所使用的智能代理Envoy用三个功能来支撑系统范围内的跟踪:

·请求ID生成:Envoy将在需要时生成UUID并填充x-request-id HTTP标头。应用程序可以转发x-request-id标头以进行统一日志记录和跟踪。

·外部跟踪服务集成:Envoy支持可插拔的外部跟踪可视化提供程序。目前支持LightStep、Zipkin或者Zipkin兼容的后端(例如Jaeger)等。

·客户端跟踪ID加入:x-client-trace-id标头可用于将不受信任的请求ID加入可信内部x-request-id。

处理请求的HTTP连接管理器必须设置跟踪对象。有几种方法可以启动跟踪:

·由外部客户端通过x-client-trace-id标头。

·通过x-envoy-force-trace标头的内部服务。

·通过random_sampling运行时设置随机采样。

Envoy提供了报告网格内服务间通信跟踪信息的能力。然而一个调用流中,会有多个代理服务器生成的跟踪信息碎片,跟踪服务必须在出入站的请求中传播上下文信息,才能拼出完整的跟踪信息。不管使用的是哪个跟踪服务,都应该传播x-request-id,这样才能在被调用服务中启动相关性的记录。

为了理解Span之间的父子关系,跟踪服务自身也需要更多的上下文信息。这种需要可以通过在跟踪服务自身中直接使用OpenTracing API或者Zipkin跟踪器来完成,从而在入站请求中提取跟踪上下文,然后把上下文信息注入到后续的出站请求中。这种方法还可以让服务创建附加的Span,用来描述服务内部完成的工作。这对端到端跟踪的检查是很有帮助的。例如使用的是Zipkin,Envoy要传播的是B3 Header。(x-b3-traceid、x-b3-spanid、x-b3-parentspanid、x-b3-sampled以及x-b3-f lags、x-b3-sampled)也可以由外部客户端提出,用来启用或者禁用某个服务的跟踪请求。

一个端到端跟踪Trace由一个或多个跨度Span组成。一个Span就是一个逻辑上的工作单元,具有启动时间和时长,其中还会包含特定的元数据,Envoy生成的Span包含如下信息:

·使用--service-cluster设置的始发服务集群。

·请求的启动时间和持续时间。

·使用--service-node设置的始发服务主机。

·通过x-envoy-downstream-service-cluster标头设置下游集群。

·HTTP URL。

·HTTP方法。

·HTTP响应码。

·跟踪系统特定的元数据。

Span中还要包括一个名字或者操作名,这一信息通常是由服务所属主机定义的。也可以在路由上使用Decorator来进行自定义。还可以使用x-envoy-decorator-operation Header来设置名称。

Envoy自动把Span发送给跟踪信息采集器。跟踪服务会使用其中的上下文信息(例如Zipkin中的trace ID配置)来对多个Span进行拼装。