skywalking-go 原理剖析
版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 本文代码示例基于 skywalking-go v0.3.0 1. 引言 apache/skywalking-go 的内部实现比较复杂,本文针对几个核心的点进行展开,以便于大家更好的阅读和理解。 2.TracingID生成 详细参考代码 id.go skywalking-go中的TraceID形如: “ab95670cae9d11ee87ca5626e1cdcfe2.14.39165238789840005” 一共由4部分组成: 1)uuid 使用uuid version1 2)goroutine ID,golang协程ID 3)timestamp 自1900年以来的毫秒值 4)sequence, 从0 ~ 10000 3. 跨协程传递Tracing信息 在没有skywalking-go的情况下,如果想在多个协程中传递Tracing信息, 开发者必须要用到context。使用skywalking-go之后,很多细节,开发者无需关心。 下面是一个在gin中使用多协程的示例,完整代码见参考资料2 r.GET("/ping", func(c *gin.Context) { g, _ := errgroup.WithContext(context.Background()) g.Go(func() error { val, err := rdb.Incr(context.Background(), "helloCounter2").Result() zlog.Info("ping", zap.Int64("val", val), zap.Error(err)) return nil }) g.Go(func() error { hsetRes, err := rdb.HSet(context.Background(), "xyz", "def", 0).Result() zlog.Info("ping", zap.Int64("setRes", hsetRes), zap.Error(err)) return nil }) c.JSON(http.StatusOK, gin.H{ "message": "pong", }) }) ...