8.【go-kit教程】go-kit链路追踪
-
在Go kit中,可以使用OpenTelemetry来实现链路追踪功能。
-
OpenTelemetry是一个云原生的分布式应用追踪系统,可以帮助开发人员跟踪和分析分布式系统的性能和行为。它提供了标准化的API和规范,可以在不同的编程语言和框架中实现链路追踪功能。
-
在Go kit中,可以使用
github.com/open-telemetry/opentelemetry-go
和github.com/open-telemetry/opentelemetry-go-contrib
包来集成OpenTelemetry。import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/exporters/trace/jaeger" "go.opentelemetry.io/otel/sdk/trace" otelcontrib "go.opentelemetry.io/contrib" "github.com/go-kit/kit/endpoint" ) func main() { // 创建一个tracer exporter, err := jaeger.NewRawExporter(jaeger.WithCollectorEndpoint("http://localhost:14268/api/traces")) if err != nil { log.Fatal(err) } tp := trace.NewTracerProvider(trace.WithBatcher(exporter)) otel.SetTracerProvider(tp) // 注册OpenTelemetry的中间件 otelEndpoint := otelcontrib.NewOpenTelemetryMiddleware(endpoint, "my-service", otelcontrib.WithPropagators(propagation.NewCompositeTextMapPropagator())) // 运行OpenTelemetry的endpoint // ... }
-
代码示例
package main import ( "context" "fmt" "net/http" "os" "github.com/go-kit/kit/endpoint" httptransport "github.com/go-kit/kit/transport/http" "github.com/gorilla/mux" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/trace/jaeger" "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/propagation" otelcontrib "go.opentelemetry.io/contrib" ) func main() { // 创建Jaeger exporter并设置为全局tracer provider exporter, err := jaeger.NewRawExporter( jaeger.WithCollectorEndpoint("http://localhost:14268/api/traces"), ) if err != nil { fmt.Fprintf(os.Stderr, "failed to create exporter: %v\n", err) os.Exit(1) } provider := trace.NewTracerProvider( trace.WithBatcher(exporter), ) otel.SetTracerProvider(provider) // 创建HTTP server r := mux.NewRouter() r.Use(otelcontrib.NewHTTPServerMiddleware("my-service", otelcontrib.WithPropagators(propagation.NewCompositeTextMapPropagator()))) // 创建endpoint helloEndpoint := func(ctx context.Context, request interface{}) (interface{}, error) { return "Hello, World!", nil } helloHandler := httptransport.NewServer( otelcontrib.NewOpenTelemetryMiddleware(endpoint.Endpoint(helloEndpoint), "my-endpoint"), func(ctx context.Context, _ *http.Request) (interface{}, error) { return nil, nil }, ) r.Handle("/hello", helloHandler).Methods("GET") fmt.Println("listening on :8080...") http.ListenAndServe(":8080", r) }
-
我们首先创建了一个Jaeger exporter,并将其设置为全局tracer provider。然后,我们使用
go-kit
的httptransport.NewServer()
函数创建了一个HTTP handler,并在handler上应用了otelcontrib.NewOpenTelemetryMiddleware()
中间件,从而实现了endpoint级别的链路追踪。最后,我们使用go-kit
的mux.NewRouter()
函数创建了一个HTTP server,并在server上应用了otelcontrib.NewHTTPServerMiddleware()
中间件,从而实现了服务级别的链路追踪。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求