OpenTelemetry 提供了一些能力有助于在应用程序中实现插桩,其中 OpenTelemetry 针对每种语言提供了一个 Core 库用于插桩。此外,针对语言的不同,它们也可能会提供一些自动插桩库或者是其他的一些组件库。以 Java 语言为例,它提供了如下代码库:

  • Core:提供 OpenTelemetry API 和 SDK 的基本实现,基于该能力,可以实现手动插桩。
  • Instrumentation:涵盖 Core 中的全部功能,同时提供了一些框架和库的自动插桩能力。
  • Contrib:一些其他可选的组件补充,例如 JMX 指标收集等。

当然,对于不同的语言而言,提供的库也不太一样,例如对于 Ruby ,它提供了一个单一的代码库通知支持手动和自动插桩。
虽然针对编程语言的不同,OpenTelemetry 提供的插桩机制并不完全一样,但是在本文下面的内容中,我们将会介绍一些通用的部分。

自动插桩

添加依赖

为了实现自动插桩,我们首先需要添加若干个依赖库,而根据语言的不同,添加的方式也会有所差异。这些依赖库至少会提供 OpenTelemetry API 和 SDK 的实现。某些编程语言可能需要针对每种类型的插桩单独引入对应的依赖库。同时,通常来讲我们还需要引入一个 Export 依赖用于数据导出。

OpenTelemetry 插桩配置

OpenTelemetry 相关的配置通常都支持通过环境变量进行设置,对于具体的编程语言而言,可能还有各自支持的其他方案。在配置中,至少应该包含一个服务名称用于标识当前插桩的服务。此外,在 OpenTelemetry 插桩库中,可能还会包含如下配置:

  • 数据源配置
  • 导出库配置
  • 传播器配置
  • 资源配置

手动插桩

引入 OpenTelemetry API 和 SDK

在手动插桩的场景下,第一步就是将 OpenTelemetry 引入服务的代码中。需要注意的是,如果你开发的是一个 Lib 库或可引用的组件,那么你应该只依赖 OpenTelemetry API 。如果你开发的是一个独立运行的业务模块或者服务,那么你将会依赖 OpenTelemetry API 和 SDK(SDK 中会包含各种导出器的实现,需要在业务模块选择并开启)。

配置 OpenTelemetry API

为了能够创建 traces 和 metrics 数据,你首先需要创建一个 tracer 和 meter provider。通过,SDK 应该提供一个默认的 provider 用于创建对应的实例,从而你可以创建指定名称和版本的 tracer 和 meter。你设置的名称应该能明确标识当前插桩的内容,如果你编写的是一个 lib 库,那么你应该使用一个唯一标识名称(例如com.legitimatebusiness.myLibrary)来说明所有由它产生的span和metrics指标。同样,最好在创建 tracer 和 meter 时,也应该设置一个对应的版本号来标识你的服务/lib库的版本。

配置 OpenTelemetry SDK

如果你现在是在开发一个业务服务,那么你还需要配置 OpenTelemetry SDK,从而可以将遥测数据导出到某个后端存储服务。这一过程建议过程配置文件等方式来实现配置。

创建遥测数据

配置完成 API 和 SDK 之后,你就可以通过 provider 得到的 tracer 和 meter 对象来创建 traces 和 metrics 遥测数据了。此外,你还可以通过插件等方式来为自动创建 tracer 和 meter 事件,相关插件列表可以参考 https://opentelemetry.io/registry/

导出数据

当你得到了遥测数据之后,你肯定希望把它们发送到某个后端服务存储起来。OpenTelemetry 之后两类主要的方式进行遥测数据导出到后端存储服务:

  • 直接发送给后端存储;
  • 通过 OpenTelemetry Collector 代理转发到后端存储;

在程序中直接导出遥测数据到后端存储依赖在程序中导入一个或多个 Exportor,还需要在程序中将 OpenTelemetry 内存中的 span 和 metric 指标转换称为 Jaeger 或 Prometheus 等后端服务需要的格式。
对于 Collector 代理方案而言,OpenTelemetry 所有的 SDK 都支持了一种名为 OTLP 的数据协议。通过该协议就可以将相关的数据转发给 OpenTelemetry Collector 服务。而 Collector 本身是一个独立的二进制程序,可以作为服务实例的代理或 Sidecar 运行,也可以在单独的主机上运行。可以通过 Collector 进行转发并配置对应的后端服务,由 Collector 进行数据格式处理并发送到期望的下游服务。

除了 Jaeger 或 Prometheus 等开源工具之外,越来越多的公司支持从 OpenTelemetry 获取遥测数据,详情可以参考:https://opentelemetry.io/vendors/