在go中使用jaeger进行链路追踪

76 阅读1分钟

配置写死

import (
	"DBProject/src/DB"
	"context"
	"fmt"
	"github.com/opentracing/opentracing-go"
	"github.com/uber/jaeger-client-go"
	jaegercfg "github.com/uber/jaeger-client-go/config"
	"io"
)

func initJaeger(serviceName string) (io.Closer, error) {
	cfg := jaegercfg.Configuration{
		//采样器的配置
		Sampler: &jaegercfg.SamplerConfig{
			//常量采样器,这意味着每个 trace 都会被采样
			Type:  jaeger.SamplerTypeConst,
			Param: 1,
		},
		Reporter: &jaegercfg.ReporterConfig{
			//发送span时记录日志
			LogSpans: true,
			// 替换为你的 Jaeger Agent 地址
			LocalAgentHostPort: "120.53.94.106:6831",
		},
	}

	//初始化全局的 tracer
	closer, err := cfg.InitGlobalTracer(
		serviceName,
		jaegercfg.Logger(jaeger.StdLogger),
	)
	return closer, err
}

func jaegerTest() {
	closer, err := initJaeger("your-service-name")
	if err != nil {
		panic(fmt.Sprintf("ERROR: cannot init Jaeger: %v\n", err))
	}
	defer closer.Close()

	parentFunction()
}

func parentFunction() {
	span, ctx := opentracing.StartSpanFromContext(context.Background(), "parentFunction")
	defer span.Finish()

	// ... your function logic ...操作数据库插入
	DB.TestMongoDB()

	childFunction(ctx)
}

func childFunction(ctx context.Context) {
	span, _ := opentracing.StartSpanFromContext(ctx, "childFunction")
	defer span.Finish()

	// ... your another function logic ...操作数据库删除
	DB.TestMongoDB()
}

配置从环境变量读取

import (
    "context"
    "fmt"
    "github.com/opentracing/opentracing-go"
    "github.com/uber/jaeger-client-go/config"
    "io"
)

func initJaeger(serviceName string) (opentracing.Tracer, io.Closer) {
    cfg, err := config.FromEnv()
    if err != nil {
        panic(fmt.Sprintf("ERROR: cannot create Jaeger configuration: %v\n", err))
    }

    cfg.ServiceName = serviceName
    cfg.Sampler.Type = "const"
    cfg.Sampler.Param = 1

    tracer, closer, err := cfg.NewTracer()
    if err != nil {
        panic(fmt.Sprintf("ERROR: cannot init Jaeger: %v\n", err))
    }
    return tracer, closer
}

func jaegerTest() {
    tracer, closer := initJaeger("测试jaeger服务")
    defer closer.Close()

    parentFunction()
}

func parentFunction() {
    span, ctx := opentracing.StartSpanFromContext(context.Background(), "parentFunction")
    defer span.Finish()

    // ... your function logic ...

    childFunction(ctx)
}

func childFunction(ctx context.Context) {
    span, _ := opentracing.StartSpanFromContext(ctx, "childFunction")
    defer span.Finish()

    // ... your another function logic ...
}

效果