OpenTelemetry

OpenTelemetry 是一个开源项目,旨在通过统一的工具集、API和SDK,简化在多样化的技术栈中集成可观测性功能,确保一致地收集、处理及导出应用性能数据。

Distributed Tracing关键技术-Tracing透传协议介绍

陈陈

Distributed Tracing天生就是为分布式系统而生了,在出现跨进程调用时,需要将上下文从一个进程传递到另外一个进程已保证上下文连续,这通常通过各种跨进程调用网络协议的协议头来实现,比如对于常见的http协议,通过http协议可拓展的request header来传递。

下面介绍目前主流的跨进程上下文传递协议

Jaeger透传协议头

  • uber-trace-id: 包含traceId、spanId、parentSpanId、sampleFlag,各部分用冒号分割。样例:1e4f4b9e8c5d778a:5e6d52a28c5d0e6d:1:1
  • uberctx-�: 用于传递额外的追踪信息或者业务数据,这些数据一般是键值对形势,且键在传递时以uberctx-开头。

Zipkin透传协议头

  • X-B3-TraceId: 表示一次完整的追踪ID。
  • X-B3-SpanId: 表示当前跨度的ID。
  • X-B3-ParentSpanId: 表示父跨度的ID。
  • X-B3-Sampled: 表示是否采样这个追踪。
  • X-B3-Flags: 用于标记追踪的一些特殊属性。
  • baggage-:用于传递额外的追踪信息或者业务数据,这些数据一般是键值对形势,且键在传递时以baggage-开头。

W3C透传协议头

  • traceparent:这是必须的头部,包含了追踪ID(Trace ID)、跨度ID(Span ID)、采样决策(Sampling Decision)和追踪选项(Trace Options),格式为traceparent=00-{TRACE_ID}-{SPAN_ID}-{TRACE_FLAGS}。样例:00-0af7651916cd4a8f82b7c8a41ce63eab-3deb0f8c8bf6662c-01
  • tracestate:这是一个可选的头部,用于携带自定义的追踪状态信息。它是一个逗号分隔的键值对列表,由服务提供商定义。样例:myfirstsource=1-123456789, mysecondsource=d4cda95b
  • baggage�:用于传递额外的追踪信息或者业务数据,分号分隔的键值对列表。样例:key1=value1;key2=value2

协议透传关键点

  • 大小写问题:有的网络协议对于大小写是不敏感的,比如http,此时当你使用Zipkin协议时,X-B3-TraceId和x-b3-traceid被认为是相同的, 甚至在一些sdk实现中会将传入的字符串强制转成小写,在做协议解析时需要注意这个问题。

  • 字符编码问题:当通过baggage传递一些额外的信息时,这些信息很有可能会出现一些中文字符导致协议解析出错,这种情况一般需要对可能出现问题的内容做MD5编码


observability.cn Authors 2024 | Documentation Distributed under CC-BY-4.0
Copyright © 2017-2024, Alibaba. All rights reserved. Alibaba has registered trademarks and uses trademarks.
浙ICP备2021005855号-32