OpenTracing 是一个分布式链路追踪(Distributed Tracing)的行业标准接口规范。它不提供具体的实现,而是定义了一套 API,让开发者能够以统一的方式在代码中进行埋点。

核心概念

OpenTracing 的数据模型可以概括为以下三个关键术语:

术语定义
Trace (追踪)一个完整请求在分布式系统中的全路径。逻辑上可以看作是由多个 Span 组成的有向无环图 (DAG)。
Span (跨度)链路中的最小工作单元。代表了系统中的一个逻辑操作(如一次 RPC 调用、一次数据库查询)。
SpanContext携带跨服务传递的状态信息(如 Trace ID, Span ID),用于将不同服务的 Span 串联起来。

为什么需要 OpenTracing?

在没有统一规范之前,每个链路追踪系统(如 Zipkin, Jaeger)都有自己的 API。这导致了以下问题:

  1. 厂商锁定:一旦选择了某个追踪系统,业务代码中就会充斥着该系统的私有 API。如果想更换系统,需要重写所有埋点。
  2. 库/框架适配困难:开源框架(如 gRPC, Gin)很难为每一个追踪系统都写一套适配代码。

OpenTracing 的价值:解耦了“埋点代码”与“追踪系统实现”。业务代码只依赖 OpenTracing API,底层实现可以像换插件一样随时更换。

业务团队与基础架构的协作

在实际落地中,链路追踪通常由基础架构团队和业务团队共同维护:

  • 基础架构团队 (Infrastructure)
    • 搭建追踪后端(如 Jaeger 集群、Elasticsearch 存储)。
    • 提供通用插件(如 HTTP 中间件、RPC 拦截器)实现自动埋点
  • 业务团队 (Business)
    • 手动埋点:记录业务内部的关键逻辑耗时(如复杂算法、循环处理)。
    • 上下文传递:在异步调用(线程池、消息队列)中确保 SpanContext 不丢失,维持链路完整。

现状:OpenTelemetry

OpenTracing 目前已经进入 CNCF 归档状态,并与 OpenCensus 合并为 OpenTelemetry

关于 OpenCensus

OpenCensus 是由 Google 发起并开源的一套库,它的侧重点与 OpenTracing 有所不同:

  • 不仅是 API:OpenCensus 不仅定义了规范,还提供了多语言的 SDK 库(如 Go, Java, C++),开发者可以直接集成。
  • 多维观测:除了链路追踪 (Tracing),它还内置了对指标 (Metrics) 的支持,这在当时是一个巨大的优势。
  • 内置导出器:它自带了许多后端导出器 (Exporters),可以直接将数据推送到 Stackdriver, Prometheus, Zipkin 等。

合并的必然性:由于 OpenTracing 强于规范和生态适配,而 OpenCensus 强于实现和多维数据,两者的合并标志着观测性领域从“百家争鸣”走向了“大一统”的 OpenTelemetry 时代。