编程 把 go build 换成 otelc go build:OpenTelemetry Go 编译期插桩 v1 发布

2026-09-16 20:01:57

go build 换成 otelc go build:OpenTelemetry Go 编译期插桩 v1 发布

官方公告:OpenTelemetry Go Compile-Time Instrumentation v1(2026-07-16,作者 Kemal Akkoyun,Datadog)

背景

Java、Python、Node.js、.NET 多年来都可以用 agent 在启动时挂载,零改代码接入 OpenTelemetry。Go 是例外:Go 程序编译成单个静态二进制,没有运行时可挂钩,开发者只能手工埋点,或者用进程外 eBPF agent。

2025 年初 SIG 成立,由 Alibaba 与 Datadog 联合构建统一、厂商中立的 Go 构建期插桩方式,v1 是该项目的首个稳定版本。如果你构建并运行 Go 服务,只需改动构建二进制或容器镜像的一行命令,就能拿到应用及其依赖的 OpenTelemetry trace 和 metric,无需修改代码。对平台工程师和 SRE 来说,这意味着不必等每个团队自己埋点,就能给整个 fleet 的服务加上可观测性。

它是什么

项目通过 Go 工具链的 -toolexec 机制挂钩标准 Go 工具链,在编译时把 OpenTelemetry 插桩注入到你的代码、依赖和标准库中。没有独立 agent,运行期无需 attach。插桩直接编译进二进制,应用代码不含插桩关注点,同时覆盖你不拥有的第三方库。

v1 关键能力

  • 零代码插桩:不改代码就能给应用与依赖插桩。
  • 编译期注入,无额外运行期开销:插桩编进二进制,而不是运行期挂载。
  • 第三方与标准库覆盖:覆盖你不拥有的依赖和标准库包。
  • v1 支持的插桩net/httpdatabase/sql、gRPC、Redis 以及 Go runtime metrics 等常见库与框架,持续增加。
  • 基于规则、可扩展:通过 SIG 的插桩规则格式为新库添加支持。
  • 语义约定合规:输出的遥测遵循当前 OpenTelemetry 语义约定。
  • 对 CI/CD 友好:可在开发期运行,也可接入构建流水线。

上手

项目提供命令行工具 otelc,包装标准 Go 工具链。构建只需一行改动:

otelc go build

go 之后的所有参数都会转发给工具链,构建其余部分不变;容器构建同样适用。默认情况下 otelc 会发现模块中受支持的库并自动插桩,无需配置、无需改代码。

何时使用

目前有三种互补方式获取 OpenTelemetry 遥测:

  • 编译期插桩(本项目):适合你能重新构建应用,且想要零代码改动、无额外运行期开销、覆盖依赖与标准库。
  • eBPF 插桩(OpenTelemetry eBPF Instrumentation,OBI):适合无法重新构建二进制,或想要进程外、零代码、多语言插桩。
  • 手工插桩(OpenTelemetry Go API):适合自定义 span 与领域特定遥测,可与前两者组合。

v1 只覆盖部分插桩而非整个 Go 生态,覆盖率会逐版本增长。依赖的库尚未覆盖时,可以为它加规则,或者把编译期插桩与手工 span 组合。

下一步

  • 增加更多插桩。
  • 基于 Registry 的发现:用 OpenTelemetry Registry 发现与分发插桩,无需等待新 otelc 版本即可获得新库支持。
  • 性能:继续压低构建期与运行期成本。
  • 推广与文档。

参与

  • 试用并反馈(GitHub discussions 与 issues)。
  • 为你使用的库插桩。
  • 加入 SIG(CNCF Slack 的 #otel-go-compile-instrumentation)。

致谢维护者 Xabier Martinez (Cabify)、Yi Yang (Alibaba)、Haibin Zhang (Alibaba)、Dario Castañé (Datadog),以及通过 LFX Mentorship 加入的 Azhar Momin。

推荐文章

程序员茄子在线接单