返回顶部

8.【go-kit教程】go-kit链路追踪

  • 在Go kit中,可以使用OpenTelemetry来实现链路追踪功能。

  • OpenTelemetry是一个云原生的分布式应用追踪系统,可以帮助开发人员跟踪和分析分布式系统的性能和行为。它提供了标准化的API和规范,可以在不同的编程语言和框架中实现链路追踪功能。

  • 在Go kit中,可以使用 github.com/open-telemetry/opentelemetry-gogithub.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-kithttptransport.NewServer() 函数创建了一个HTTP handler,并在handler上应用了 otelcontrib.NewOpenTelemetryMiddleware() 中间件,从而实现了endpoint级别的链路追踪。最后,我们使用 go-kitmux.NewRouter() 函数创建了一个HTTP server,并在server上应用了 otelcontrib.NewHTTPServerMiddleware() 中间件,从而实现了服务级别的链路追踪。

posted @ 2023-02-25 22:03  高薪程序员  阅读(77)  评论(0编辑  收藏  举报