基于 Golang 的侵入式 Opentracing 实现全链路追踪 ---- 实践篇

用户头像
是老郭啊
关注
发布于: 2020 年 08 月 03 日



前提条件:

1.理论部分可以参考上一篇文章基于 opentracing + Jaeger 实现全链路追踪 ---- 理论部分

2.开启 Jager(根据官网给出的 all-in-one docker进行部署):

docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 9411:9411 \
jaegertracing/all-in-one:1.14



Golang:

  1. 初始化 Jaeger 并将 tracer设为全局,方便后续调用

// initJaeger 将jaeger tracer设置为全局tracer
func initJaeger(service string) io.Closer {
cfg := jaegercfg.Configuration{
// 将采样频率设置为1,每一个span都记录,方便查看测试结果
Sampler: &jaegercfg.SamplerConfig{
Type: jaeger.SamplerTypeConst,
Param: 1,
},
Reporter: &jaegercfg.ReporterConfig{
LogSpans: true,
// 将span发往jaeger-collector的服务地址
CollectorEndpoint: "http://localhost:14268/api/traces",
},
}
closer, err := cfg.InitGlobalTracer(service, jaegercfg.Logger(jaeger.StdLogger))
if err != nil {
panic(fmt.Sprintf("ERROR: cannot init Jaeger: %v\n", err))
}
return closer
}

2.在 main函数中获取全局 tracer,创建 root span 并执行我们第一个服务(MyFirstSpan)

func main() {
closer := initJaeger("MyProcess")
defer closer.Close()
// 获取jaeger tracer
t := opentracing.GlobalTracer()
// 创建root span
sp := t.StartSpan("MyServer")
// main执行完结束这个span
defer sp.Finish()
// 将span传递给MyFirstSpan
ctx := opentracing.ContextWithSpan(context.Background(), sp)
MyFirstSpan(ctx)
}
  1. 在 MyFirstSpan 中调用另一个服务(MySecondSpan)

func MyFirstSpan(ctx context.Context) {
// 开始一个span, 设置span的operation_name=MyFirstSpan
span, ctx := opentracing.StartSpanFromContext(ctx, "MyFirstSpan")
defer span.Finish()
// 将context传递给MySecondSpan
MySecondSpan(ctx)
// 假设执行了 http请求
span.SetTag("http_method", "GET")
span.SetTag("http_code", "200")
// 模拟执行耗时
time.Sleep(1 * time.Second)
}
  1. MySecondSpan:

func MySecondSpan(ctx context.Context) {
// 开始一个span,设置span的operation_name=MySecondSpan
span, ctx := opentracing.StartSpanFromContext(ctx, "MySecondSpan")
defer span.Finish()
// 模拟执行耗时
time.Sleep(2 * time.Second)
// 假设MySecondSpan发生了某些错误
err := errors.New("something wrong")
//记录 log
span.LogFields(
log.String("event", "error"),
log.String("message", err.Error()),
log.Int64("error time ", time.Now().Unix()),
)
span.SetTag("error", true)
}

5.执行完后在 127.0.0.1:16686 查看本次 tracer



注:本次实践篇完全在同一个 process中执行,本质上并没有实现分布式的微服务链路追踪,后续会发布进程间的链路追踪...

发布于: 2020 年 08 月 03 日 阅读数: 68
用户头像

是老郭啊

关注

一位头发日渐稀疏的 90后 IT男 2020.04.07 加入

当你焦虑大于努力时,你将沦为焦虑本身。

评论

发布
暂无评论
基于 Golang的侵入式 Opentracing实现全链路追踪 ----实践篇