把 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/http、database/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。