【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 // ... }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25代码示例
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) }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52我们首先创建了一个Jaeger exporter,并将其设置为全局tracer provider。然后,我们使用
go-kit
的httptransport.NewServer()
函数创建了一个HTTP handler,并在handler上应用了otelcontrib.NewOpenTelemetryMiddleware()
中间件,从而实现了endpoint级别的链路追踪。最后,我们使用go-kit
的mux.NewRouter()
函数创建了一个HTTP server,并在server上应用了otelcontrib.NewHTTPServerMiddleware()
中间件,从而实现了服务级别的链路追踪。
上次更新: 2023/04/16, 18:35:33