对于一些常见的框架和库,OpenTelemetry 提供了自动化的工具来完成链路追踪的埋点。这些库和工具可以自动为我们创建和管理 Span,以及传播上下文,使得我们能更专注于自己的应用代码。
例如,对于 HTTP 服务和客户端,OpenTelemetry 提供了为 Go 的 net/http
包自动创建 Span 的中间件。使用这些中间件,我们可以将创建和结束 Span,以及上下文的传播等操作自动化。
以下是一个使用自动 HTTP 服务链路追踪中间件的示例:
代码语言:javascript复制package main
import (
"net/http"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
)
func main() {
handler := http.NewServeMux()
handler.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// Your handler code here...
})
http.ListenAndServe(":8000", otelhttp.NewHandler(handler, "my-server"))
}
在这个示例中,otelhttp.NewHandler
函数接收我们的 HTTP 处理器和一个服务名称,并返回一个新的处理器。这个新的处理器会为每个请求自动创建一个 Span,并将 Span 的上下文注入到请求的 context 中。
对于 HTTP 客户端,我们也可以使用 otelhttp
包提供的 http.Client
封装:
package main
import (
"net/http"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
)
func main() {
client := http.Client{Transport: otelhttp.NewTransport(http.DefaultTransport)}
// This request will be traced
resp, err := client.Get("http://example.com")
// handle resp and err...
}
在这个示例中,otelhttp.NewTransport
函数接收一个 http.RoundTripper
(通常是 http.DefaultTransport
),并返回一个新的 http.RoundTripper
。这个新的 http.RoundTripper
会为每个请求自动创建一个 Span,并将 Span 的上下文注入到 HTTP 请求的 headers 中。
这样,我们的代码中就不需要手动创建和管理 Span,或者处理上下文的传播了。只需要在我们的项目中添加这些中间件或封装,就可以自动完成链路追踪的埋点。
需要注意的是,这些中间件和封装只适用于它们所支持的库和框架。对于其他不被支持的库和框架,或者我们的自定义代码,我们可能还需要手动创建和管理 Span。