OpenTelemetry: 链路追踪自动埋点

2023-08-10 14:58:36 浏览数 (1)

对于一些常见的框架和库,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 封装:

代码语言:javascript复制
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。

0 人点赞