阿里云可观测联合 Datadog 发布 OpenTelemetry Go 自动插桩工具

简介: 阿里云联合社区推出 OpenTelemetry Go 编译时自动插桩方案,基于 -toolexec 实现零代码修改的链路追踪与监控,支持 HTTP、gRPC 等常用框架,低开销、高兼容,助力 Go 应用无缝接入可观测体系。

在云原生可观测性领域,OpenTelemetry 已经成为事实上的标准。相比于 Java 拥有成熟的字节码增强技术,Go 语言作为静态编译型语言,长期以来缺乏一种成熟、低侵入的自动插桩方案。目前的现有方案主要有:


1. eBPF:功能强大但主要偏向系统调用层面,对应用层上下文(如 HTTP Header 传播)的处理较为复杂。


2. 手动埋点:代码改动大,维护成本高,不仅要改业务代码,还得改依赖库的调用方式,显式地在各个关键节点添加 Trace 和 Metrics 逻辑。


为此,阿里云可观测团队和程序语言团队探索了 Go 编译时插桩解决方案,并将其核心能力捐赠给 OpenTelemetry 社区,形成了 opentelemetry-go-compile-instrumentation[1]项目。在和 Datadog、Quesma 等公司的共同努力下,我们发布了首个预览版本 v0.1.0[2]


工作原理


自动插桩工具的核心在于利用 Go 编译器的 -toolexec 参数。-toolexec 会拦截 Go 编译命令,替换成我们的插桩工具。这样,在代码被编译之前,我们就有机会对它进行分析和修改。整个过程可以概括为两个阶段:

1. 依赖分析

在编译开始前,工具会分析应用的构建流程(go build -n),识别出项目中使用的第三方库如 net/http, grpc, redis 等。然后,它会自动生成一个文件otel.runtime.go,将对应的 Hook 代码(监测逻辑,后面用 Hook 代码表示)引入到构建依赖中。

2. 代码注入

当编译器处理目标函数时,工具利用 -toolexec 拦截编译,然后修改该目标函数的代码,在函数入口插入一段蹦床代码(Trampoline Code),蹦床代码会跳转到预先写好的 Hook 函数中。

  • 进入函数前(Before):Hook 记录开始时间,提取上下文信息(如 HTTP Headers),启动 Span。
  • 函数执行:执行原有的业务逻辑。
  • 退出函数后(After):Hook 捕获返回值或 Panic,结束 Span,记录耗时。

这种方式的优点是零运行时开销(除了必要的监测逻辑执行时间),因为插桩是直接编译进二进制文件的,不需要像 eBPF 那样在内核态和用户态之间切换,也不需要像 Java Agent 那样在启动时加载。


HTTP 插桩示例

让我们通过一个简单的 HTTP 例子来看看它是如何使用的。

package main
import ...
func main() {
    http.HandleFunc("/greet", func(w http.ResponseWriter, r *http.Request) {
        w.Write([ ]byte("Hello, OpenTelemetry!"))
    })
    log.Fatal(http.ListenAndServe(":8080", nil))
}

手动插桩

需要手动引入 OpenTelemetry SDK,手动创建 Tracer,在 Handler 里手动 StartEnd Span。

package main
import ...
func initTracer() func(context.Context) error { 
  /* ...几十行初始化代码... */
}
func main() {
    // 1. 初始化 Tracer
    shutdown := initTracer()
    defer shutdown(context.Background())
    // 2. 包装 Handler
    handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 3. 手动提取 Context,开始 Span
        tracer := otel.Tracer("demo-server")
        ctx, span := tracer.Start(r.Context(), "GET /greet")
        // 4. 确保结束 Span
        defer span.End() 
        // 5. 可能还需要手动记录属性
        span.SetAttributes(attribute.String("http.method", "GET"))
        w.Write([]byte("Hello, OpenTelemetry!"))
    })
    // 6. ListenAndServe 也可能需要包装...
    log.Fatal(http.ListenAndServe(":8080", handler))
}

对于成百上千个接口的微服务,这种改造成本是灾难性的。

自动插桩

1. 下载工具:到 Release 页面[2]下载

2. 编译应用:./otel-linux-amd64 go build -o myapp

3. 配置运行:export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4317" export OTEL_SERVICE_NAME="my-app" ./myapp


编译器会默默地将 HTTP 请求的监测逻辑“织入”到应用二进制文件中。配置好 OpenTelemetry 的导出端点(如 Jaeger 或控制台),运行生成的 server。访问 /greet 接口时, Tracing 数据已经自动生成并上报了,包含了请求路径、耗时、状态码等信息。


从商业化到开源

我们在深度实践 eBPF 技术的过程中,虽然认可其强大,但也发现它难以完美处理应用层上下文。更重要的是,我们不断听到用户反馈,大家对繁琐的手动埋点和高昂的维护成本感到困扰。


为了解决这个痛点,我们开始探索 Go 编译时自动插桩方案,将其上线至阿里云可观测 ARMS 产品[3],在这片最严苛的“试验田”里不断迭代,逐步演化成一套成熟的解决方案,不仅能实现零代码修改的链路追踪,还扩展支持了丰富的指标统计、Runtime 监控乃至持续剖析等高级功能,甚至还可以通过自定义扩展的功能完成对企业内部 sdk 的埋点[4]

调用链分析

持续剖析

这套方案在电商、短剧、AI 视频、汽车等众多领域客户处得到了成功验证。在看到它为用户带来巨大价值、并验证了其稳定性和可行性后,我们决定将其核心能力贡献给 OpenTelemetry 社区,希望它能成为一个普惠的技术。同时,我们与可观测领域的顶尖厂商 Datadog 协作,共同推进,最终促成了这个官方项目[1]的诞生。

目前项目处于活跃开发阶段,欢迎大家试用、反馈并参与贡献,共同构建更美好的云原生可观测生态。

相关链接:

[1] OpenTelemetry Go 编译插桩项目

https://github.com/open-telemetry/opentelemetry-go-compile-instrumentation

[2] Release 链接

https://github.com/open-telemetry/opentelemetry-go-compile-instrumentation/releases/tag/v0.1.0

[3] 阿里云 ARMS Go Agent 商业版

https://help.aliyun.com/zh/arms/application-monitoring/user-guide/monitoring-the-golang-applications

[4] 自定义扩展

https://help.aliyun.com/zh/arms/application-monitoring/use-cases/use-golang-agent-to-customize-scalability


来源  |  阿里云开发者公众号

作者  |  杨易(青风)

相关文章
|
2月前
|
Cloud Native Java 编译器
阿里云可观测联合 Datadog 发布 OpenTelemetry Go 自动插桩工具
面对 Go 语言长期缺乏成熟自动插桩方案的困境,阿里云联合 Datadog 推出 OpenTelemetry Go 编译时插桩工具,无需修改代码,只需 ./otel-go build,即可为 HTTP、gRPC、Redis 等组件自动注入链路追踪与指标采集能力。现已开源,欢迎试用!
287 33
|
3月前
|
运维 Prometheus 数据可视化
如何一键接入opentelemetry项目,实现可观测分析
本文揭秘如何通过Databuff实现OpenTelemetry的无缝接管,无需改造现有Collector,10分钟完成部署,实现服务与资源间的因果可观测性,呈现云网空间地图,助力运维智能化。
|
6月前
|
数据采集 人工智能 监控
零代码改造!LoongSuite AI 采集套件观测实战
在 AI 时代,随着模型和应用侧的快速演化,对于推理过程,成本和性能显得尤为重要,而端到端的 AI 可观测是其中至关重要的一环。本文将介绍端到端 AI 可观测的基本概念与痛点,并通过阿里云可观测团队最新开源的 AI 采集套件 LoongSuite Agent 来对大模型应用进行全链路可观测以解决这些痛点。帮助客户无侵入,低成本地进行全链路的大模型可观测。
614 61
零代码改造!LoongSuite AI 采集套件观测实战
|
2月前
|
存储 人工智能 安全
一文详解Kimi的AI Agent如何跑在阿里云上
Kimi携手阿里云,基于ACK与ACS Agent Sandbox构建端到端Agent基础设施:实现秒级沙箱启动、万级并发弹性调度、会话级状态保持及强安全隔离,支撑“深度研究”“OK Computer”等智能体产品稳定高效运行。(239字)
376 0
一文详解Kimi的AI Agent如何跑在阿里云上
|
5月前
|
人工智能 监控 Java
零代码改造 + 全链路追踪!Spring AI 最新可观测性详细解读
Spring AI Alibaba 通过集成 OpenTelemetry 实现可观测性,支持框架原生和无侵入探针两种方式。原生方案依赖 Micrometer 自动埋点,适用于快速接入;无侵入探针基于 LoongSuite 商业版,无需修改代码即可采集标准 OTLP 数据,解决了原生方案扩展性差、调用链易断链等问题。未来将开源无侵入探针方案,整合至 AgentScope Studio,并进一步增强多 Agent 场景下的观测能力。
2386 71
|
2月前
|
存储 数据采集 弹性计算
面向多租户云的 IO 智能诊断:从异常发现到分钟级定位
当 iowait 暴涨、IO 延迟飙升时,你是否还在手忙脚乱翻日志?阿里云 IO 一键诊断基于动态阈值模型与智能采集机制,实现异常秒级感知、现场自动抓取、根因结构化输出,让每一次 IO 波动都有据可查,真正实现从“被动响应”到“主动洞察”的跃迁。
381 66
|
3月前
|
存储 人工智能 运维
一行代码实现智能异常检测:UModel PaaS API 架构设计与最佳实践
阿里云 UModel PaaS API 发布:通过 Table + Object 双层抽象,屏蔽存储差异、自动处理字段映射与过滤条件,让每一个实体都成为一个‘可调用的对象’,真正实现‘以实体为中心’的智能可观测。
914 142
|
3月前
|
存储 自然语言处理 Kubernetes
基于 UModel 高效构建可观测场景统一实体搜索引擎
在复杂的云原生环境中,服务、Pod、主机等可观测实体动辄成千上万,散落在 APM、K8s、云资源等多个系统中。当故障发生时,如何快速从海量数据中“找到那个出问题的服务”,成为 SRE 和运维工程师的核心挑战。
289 70
|
3月前
|
监控 Java 开发工具
Android 崩溃监控实战:一次完整的生产环境崩溃排查全流程
某 App 新版上线后收到大量用户投诉 App 闪退和崩溃。仅凭一条崩溃日志和会话追踪,团队如何在2小时内锁定「快速刷新导致数据竞态」这一根因?本文带你复现真实生产环境下的完整排查路径:从告警触发、堆栈分析、符号化解析,到用户行为还原——见证 RUM 如何让“无法复现的线上崩溃”无所遁形。
482 51

热门文章

最新文章