Go 自动 SDK

使用自动 SDK 集成手动 span 和零代码 eBPF span。

OpenTelemetry Go eBPF 自动插桩框架,由 OBI 等工具使用,支持通过自动 SDK 与手动插桩的 OpenTelemetry span 集成。

什么是自动 SDK?

自动 SDK 是一个完全实现的、自定义的 OpenTelemetry Go SDK,旨在与 Go eBPF 自动插桩兼容。这使得自动插桩的包(例如 net/http)能够支持与手动 span 的上下文传播。

何时应使用它?

OpenTelemetry Go eBPF 插桩目前仅支持有限数量的包。您可能仍希望扩展此插桩并在您的代码中创建自定义 span。自动 SDK 通过使用共享的跟踪上下文插桩您的自定义 span 来实现此目的,该上下文也将由自动 span 使用。

如何使用它?

OpenTelemetry Go v1.36.0 发布以来,自动 SDK 作为标准 Go API 的间接依赖项自动导入。您可以通过检查 go.mod 文件中的 go.opentelemetry.io/auto/sdk 来确认您的项目是否包含自动 SDK。

使用自动 SDK 创建手动 span 与使用标准 Go 插桩创建 span 基本相同。

有了自动 SDK,使用它就像使用 tracer.Start() 创建手动 span 一样简单

package main

import (
	"log"
	"net/http"

	"go.opentelemetry.io/otel"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		// Get tracer
		tracer := otel.Tracer("example-server")

		// Start a manual span
		_, span := tracer.Start(r.Context(), "manual-span")
		defer span.End()

		// Add an attribute for demonstration
		span.SetAttributes()
		span.AddEvent("Request handled")
	})

	log.Println("Server running at :8080")
	log.Fatal(http.ListenAndServe(":8080", nil))
}

在此示例中,eBPF 框架会自动插桩传入的 HTTP 请求,然后将手动 span 链接到与 HTTP 库相同的跟踪。请注意,此示例中没有初始化 TracerProvider。自动 SDK 会注册自己的 TracerProvider,这对于启用 SDK 至关重要。

本质上,除了在由 Go 零代码代理插桩的应用程序中创建手动 span 之外,您无需做任何事情来启用自动 SDK。只要您不手动注册全局 TracerProvider,自动 SDK 就会自动启用。

自动 SDK TracerProvider

在大多数用例中,无需手动与自动 SDK 的内置 TracerProvider 进行交互。但是,对于某些高级用例,您可能希望手动配置自动 SDK 的 TracerProvider。您可以使用 auto.TracerProvider() 函数访问它。

import (
	"go.opentelemetry.io/otel"
    autosdk "go.opentelemetry.io/auto/sdk"
)

func main() {
	tp := autosdk.TracerProvider()
	otel.SetTracerProvider(tp)
}

自动 SDK 是如何工作的?

当应用程序由 OpenTelemetry eBPF 插桩时,eBPF 程序将查找应用程序中是否存在 go.opentelemetry.io/auto/sdk 依赖项(请记住,此依赖项默认包含在 go.opentelemetry.io/otel 中;它不需要显式导入)。如果找到,eBPF 程序将在全局 OpenTelemetry SDK 中启用一个布尔值,指示 OpenTelemetry 使用自动 SDK TracerProvider。

然后,自动 SDK 的工作方式与任何其他 SDK 非常相似,实现了所有规范要求的功能。主要区别在于它还由 eBPF 进行自动插桩,以统一与其他 eBPF 插桩库的上下文传播。

本质上,自动 SDK 是 OpenTelemetry eBPF 识别并协调与标准 OpenTelemetry API 的上下文传播的方式,通过插桩 OpenTelemetry 函数符号,就像它为任何其他包做的那样。


最后修改于 2025 年 9 月 26 日: go: Add Auto SDK docs page (#7842) (538b3b7a)