该项目利用了 Go 工具链的 -toolexec 扩展点。执行 go build 时实际是 go 命令在调度底层的 compile、link 等工具,-toolexec 允许指定一个“包装程序”拦截每次调用,类似 Unix 的 strace。
核心工具 otelc 作为 -toolexec 的包装程序,在编译器处理每个包时会:
- 解析 AST:读取当前包的抽象语法树
- 匹配规则:检查是否命中已注册的 instrumentation rule
- 注入代码:在编译前将 tracing/metrics 代码织入目标函数
- 透传编译:将改写后的源码交给原始 compile 继续编译
最终产出的二进制已内置探针代码,运行时不需要额外 Agent 进程、sidecar 或 eBPF 程序。与 Java Agent 在运行时改写字节码不同,Go 在 build 阶段完成所有改写,运行时零额外开销。




