1、安装 Jaeger UI
Jaeger 官方提供一个 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 14250:14250 \
-p 9411:9411 \
jaegertracing/all-in-one:1.18
然后,您可以导航到http://localhost:16686以访问Jaeger UI。
2、jaeger 在项目中的使用
2.1 安装 jaeger的 Go SDK
go get -u github.com/uber/jaeger-client-go
2.2 封装 jaeger tracer 的初始化函数
// NewTracer 创建一个jaeger Tracer
func NewTracer(serviceName, addr string) (opentracing.Tracer, io.Closer, error) {
cfg := jaegercfg.Configuration{
ServiceName: serviceName,
Sampler: &jaegercfg.SamplerConfig{
Type: jaeger.SamplerTypeConst,
Param: 1,
},
Reporter: &jaegercfg.ReporterConfig{
LogSpans: true,
BufferFlushInterval: 1 * time.Second,
},
}
sender, err := jaeger.NewUDPTransport(addr, 0)
if err != nil {
return nil, nil, err
}
reporter := jaeger.NewRemoteReporter(sender)
// Initialize tracer with a logger and a metrics factory
tracer, closer, err := cfg.NewTracer(
jaegercfg.Logger(jaeger.StdLogger),
jaegercfg.Reporter(reporter),
)
return tracer, closer, err
}
2.3 在 main.go 中进行调用并设置为全局 tracer
func main() {
tracer, io, err := utils.NewTracer(common.SRV_NAME_APIGATEWAY, common.JAEGER_ADDR)
if err != nil {
log.L().Bg().Fatal("unable to create tracer", zap.Error(err))
}
defer io.Close()
opentracing.SetGlobalTracer(tracer)
......
}
2.4 在API网关(gin)中使用中间件为每次请求添加SpanContexts
// TracerWrapper tracer 中间件
func TracerWrapper(c *gin.Context) {
md := make(map[string]string)
spanCtx, _ := opentracing.GlobalTracer().Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(c.Request.Header))
sp := opentracing.GlobalTracer().StartSpan(c.Request.URL.Path, opentracing.ChildOf(spanCtx))
defer sp.Finish()
if err := opentracing.GlobalTracer().Inject(sp.Context(),
opentracing.TextMap,
opentracing.TextMapCarrier