链路追踪学习四:gin集成jaeger

简介: 链路追踪学习四:gin集成jaeger

jaeger工具类:

package utils
import (
   "context"
   "fmt"
   "github.com/opentracing/opentracing-go"
   "github.com/opentracing/opentracing-go/ext"
   "github.com/uber/jaeger-client-go"
   "github.com/uber/jaeger-client-go/config"
   "io"
   "net/http"
)
func GetDefaultConfig() *config.Configuration {
   cfg := &config.Configuration{
      Sampler: &config.SamplerConfig{
         Type:  "const",
         Param: 1,
      },
      Reporter: &config.ReporterConfig{
         LogSpans:           true,
         LocalAgentHostPort: "127.0.0.1:6831",
      },
   }
   return cfg
}
func init() {
   jaegerConfig := GetDefaultConfig()
   InitJaeger("go-framework-demo", jaegerConfig)
}
/**
初始化
*/
func InitJaeger(service string, cfg *config.Configuration) (opentracing.Tracer, io.Closer) {
   cfg.ServiceName = service
   tracer, closer, err := cfg.NewTracer(config.Logger(jaeger.StdLogger))
   if err != nil {
      panic(fmt.Sprintf("Error: connot init Jaeger: %v\\n", err))
   }
   opentracing.SetGlobalTracer(tracer)
   return tracer, closer
}
func StartSpan(tracer opentracing.Tracer, name string) opentracing.Span {
   //设置顶级span
   span := tracer.StartSpan(name)
   return span
}
func WithSpan(ctx context.Context, name string) (opentracing.Span, context.Context) {
   span, ctx := opentracing.StartSpanFromContext(ctx, name)
   return span, ctx
}
func GetCarrier(span opentracing.Span) (opentracing.HTTPHeadersCarrier, error) {
   carrier := opentracing.HTTPHeadersCarrier{}
   err := span.Tracer().Inject(span.Context(), opentracing.HTTPHeaders, carrier)
   if err != nil {
      return nil, err
   }
   return carrier, nil
}
func GetParentSpan(spanName string, traceId string, header http.Header) (opentracing.Span, error) {
   carrier := opentracing.HTTPHeadersCarrier{}
   carrier.Set("uber-trace-id", traceId)
   tracer := opentracing.GlobalTracer()
   wireContext, err := tracer.Extract(
      opentracing.HTTPHeaders,
      opentracing.HTTPHeadersCarrier(header),
   )
   parentSpan := opentracing.StartSpan(
      spanName,
      ext.RPCServerOption(wireContext))
   if err != nil {
      return nil, err
   }
   return parentSpan, err
}

gin 中间件:

package middleware
import (
   "github.com/gin-gonic/gin"
   "github.com/opentracing/opentracing-go"
   "go\_framework\_demo/utils"
)
var (
   SpanCTX = "span-ctx"
)
func Jaeger() gin.HandlerFunc {
   return func(c *gin.Context) {
      traceId := c.GetHeader("uber-trace-id")
      var span opentracing.Span
      if traceId != "" {
         var err error
         span, err = utils.GetParentSpan(c.FullPath(), traceId, c.Request.Header)
         if err != nil {
            return
         }
      } else {
         span = utils.StartSpan(opentracing.GlobalTracer(), c.FullPath())
      }
      defer span.Finish()
      c.Set(SpanCTX, opentracing.ContextWithSpan(c, span))
      c.Next()
   }
}

控制器方法:

package controller
import (
   "bytes"
   "context"
   "github.com/gin-gonic/gin"
   "go\_framework\_demo/middleware"
   "go\_framework\_demo/utils"
   "net/http"
)
func JaegerTest(c *gin.Context) {
   spanCtxInterface, _ := c.Get(middleware.SpanCTX)
   var spanCtx context.Context
   spanCtx = spanCtxInterface.(context.Context)
   //创建子span
   span, _ := utils.WithSpan(spanCtx, "JaegerTest")
   defer span.Finish() //结束后调用完成
}
func JaegerRequestTest(c *gin.Context) {
   spanCtxInterface, _ := c.Get(middleware.SpanCTX)
   var spanCtx context.Context
   spanCtx = spanCtxInterface.(context.Context)
   //创建子span
   span, _ := utils.WithSpan(spanCtx, "JaegerRequestTest")
   defer span.Finish() //结束后调用完成
   carrier, _ := utils.GetCarrier(span)
   client := &http.Client{}
   req, _ := http.NewRequest("GET", "http://127.0.0.1:8080/jaegerTest", bytes.NewReader(\[\]byte{}))
   req.Header.Add("User-Agent", "myClient")
   _ = carrier.ForeachKey(func(key, val string) (err error) {
      req.Header.Add(key, val)
      return
   })
   resp, _ := client.Do(req)
   defer resp.Body.Close()
}

===

相关实践学习
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
目录
相关文章
|
1月前
|
机器学习/深度学习 Python
CatBoost高级教程:深度集成与迁移学习
CatBoost高级教程:深度集成与迁移学习【2月更文挑战第17天】
28 1
|
1月前
|
机器学习/深度学习 算法 Python
CatBoost中级教程:集成学习与模型融合
CatBoost中级教程:集成学习与模型融合【2月更文挑战第13天】
42 3
|
2月前
|
机器学习/深度学习 算法 Python
LightGBM高级教程:深度集成与迁移学习
LightGBM高级教程:深度集成与迁移学习【2月更文挑战第6天】
107 4
|
7天前
|
机器学习/深度学习 缓存 算法
【视频】Boosting集成学习原理与R语言提升回归树BRT预测短鳍鳗分布生态学实例-2
【视频】Boosting集成学习原理与R语言提升回归树BRT预测短鳍鳗分布生态学实例
25 5
|
1月前
|
机器学习/深度学习 算法
大模型开发:描述集成学习以及它如何工作。
集成学习通过结合多个模型预测提升性能,减少偏差和方差。分为Bagging和Boosting:Bagging使用数据子集并行训练模型,如随机森林;Boosting则顺序训练,聚焦前一轮错误,如AdaBoost。Stacking利用模型输出训练新模型。多样性是关键,广泛应用于分类、回归等任务,能有效提高泛化能力和防止过拟合。
19 0
|
13天前
|
机器学习/深度学习 算法 前端开发
Scikit-learn进阶:探索集成学习算法
【4月更文挑战第17天】本文介绍了Scikit-learn中的集成学习算法,包括Bagging(如RandomForest)、Boosting(AdaBoost、GradientBoosting)和Stacking。通过结合多个学习器,集成学习能提高模型性能,减少偏差和方差。文中展示了如何使用Scikit-learn实现这些算法,并提供示例代码,帮助读者理解和应用集成学习提升模型预测准确性。
|
13天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
20 0
|
29天前
|
存储 异构计算
System Generator学习——使用 AXI 接口和 IP 集成器(三)
System Generator学习——使用 AXI 接口和 IP 集成器
16 3
|
2月前
|
机器学习/深度学习 Python
探索XGBoost:深度集成与迁移学习
探索XGBoost:深度集成与迁移学习
80 2
|
2月前
|
算法 Python
深入理解XGBoost:集成学习与堆叠模型
深入理解XGBoost:集成学习与堆叠模型
98 1

热门文章

最新文章