OpenTelemetry (三) —— 埋点(Instrumenting)

1,152 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情

引言 —— OpenTelemetry 如何帮助应用自动或手动埋点?

为了使系统可观察,必须对系统进行埋点:也就是说,代码必须发出跟踪信息、指标和日志等数据。

无需对代码进行修改,就可以自动地从代码收集遥测数据。如果以前使用 APM 代理从应用程序中提取遥测数据,那么 OpenTelemetry 自动埋点功能将为你提供类似的现成体验。为了进一步简化应用程序的埋点,您可以通过针对 OpenTelemetry API 进行编码来给应用程序手动埋点。

为此,无需对代码中所有埋点数据使用的依赖进行更改:

  • OpenTelemetry 本地提供了一些开箱即用的 API
  • 对于没有这种集成的库,OpenTelemetry 项目提供了特定于语言的埋点库

请注意,对于大多数语言,可以同时使用手动和自动对程序进行埋点:自动检测将使您能够快速深入了解应用程序,手动检测能够更精细地对代码进行观测。手动和自动检测的确切安装机制因开发所使用的语言而异,但接下来会介绍一些共性。

自动埋点

对于实现了 OpenTelemetry 的特定语言,应用可以在无需改动任何代码的情况下进行埋点。虽然埋点的底层机制取决于语言,但至少这会将 OpenTelemetry API 和 SDK 能力加入到应用中。并且还会添加一些埋点组件和一些以来项。

必须配置服务名称以标识埋点的服务,OpenTelemetry 埋点配置可以通过环境变量配置,除了通过环境变量配置还提供多种其他配置选项,可能包括:

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

手动埋点

引入 OpenTelemetry API 和 SDK

手动埋点配置首先要将 OpenTelemetry 引入到应用代码中。如果是开发库或者由可运行的二进制文件使用的组件,那么只能调用通过调度 Telemetry API 来实现手动埋点。如果项目是独立的进程或服务,则可以使用 API 和引入 SDK。关于API 和 SDK 的更多信息,可以查看 OpenTelemetry Specification

配置 OpenTelemetry API

若要创建跟踪或指标,需要首先创建 tracer or meter provider。OpenTelemetry 推荐使用 SDK 来实现这些能力。然后,你将从该提供程序获取跟踪器或计量实例,并为其指定名称和版本。

配置 OpenTelemetry SDK

如果要构建服务进程,还需要使用 SDK 配置适当的选项,以便将遥测数据导出到某个分析后端。OpenTelemetry 建议通过配置文件或某种其他机制以编程方式处理此配置。OpenTelemetry 为每种语言提供应用可能希望优化选项。

创建遥测数据

配置 API 和 SDK 后,应用程序通过 SDK 中的 tracer 和 meter 对象创建链路追踪数据和指标数据。

导出数据

应用程序创建遥测数据后,需要将产生的遥测数据发送到对应的监测后端程序。OpenTelemetry 提供两种最主要的方式将应用程序产生的遥测数据导出到监测分析的后端程序,一种是直接从应用程序中导出,另一种是通过 OpenTelemetry Collector 代理导出。

进程内直接导出遥测数据,要求应用程序依赖导出器,导出器将 OpenTelemetry 的内存 span 和 metric 遥测数据转换为分析后端程序(如 Jaeger 或 Prometheus)的数据结构。OpenTelemetry Collector 作为一个独立的进程,可以作为服务实例的代理或 sidecar 运行,也可以在单独的主机上运行。可以将收集器配置为将此数据转发并导出到您选择的分析后端。