Qi
go-kit链路追踪

go-kit链路追踪

作者: Qi 发表时间: 2024-01-02 87

在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() 中间件,从而实现了服务级别的链路追踪。

go-kit
mysql数据库

本文作者: Qi

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

我也是有底线的哦!

联系我呀

技术支持

学习网站

博主寄诗

学习是一辈子的事情,保持好奇心和学习的态度。

面对生活的挑战,要保持乐观的心态和勇气,相信自己能够克服困难。