docker安装jaeger
docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp -p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest
互联网时代,分布式已成主流。一个调用,往往涉及多个微服务,如何对,这些调用进行追踪,就成为了一个,重要问题。
opentracing 是实现链路追踪的一套标准,一组公共接口,java、php、go都有公共类库实现。具体实现,如jaeger 只需要把自己的功能,注入到接口中,就能无缝使用。
(1)tracer
实现opentracing 的具体记录分布式链路的系统,如jaeger
(2)span
链路追踪的单位,可以理解为一个盒子,一次链路追踪需要开启一个根盒子,其他的调用,创建一个子盒子,平级的盒子,并排在父盒子里,子调用,盒子的内部。形成一个类似树的结构。
Jaeger 是Uber推出的一款开源分布式追踪系统,兼容OpenTracing API。分布式追踪系统用于记录请求范围内的信息。例如,一次远程方法调用的执行过程和耗时。是我们排查系统问题和系统性能的利器。
分布式追踪系统种类繁多,但是核心步骤有三个:代码埋点,数据存储和查询展示。
(1)jaeger注入到opentracing中 的方法实现
jaeger/jaegerInit.go
package jeager
import (
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
jaegercfg "github.com/uber/jaeger-client-go/config"
"io"
"time"
)
//NewJaegerTracer 初始化jaeger ,把jeager初始化到opentrace 中
func NewJaegerTracer(serviceName string, 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)
tracer, closer, err := cfg.NewTracer(
jaegercfg.Reporter(reporter),
)
opentracing.SetGlobalTracer(tracer)
return tracer, closer, err
}
指明jeager 的地址,和当前实例的服务名
jeager的链路是跨系统,再那个系统里,如gateway或者customer 就是用,这这些系统下初始化给jeager 的服务名区分的。
(2) 服务端配置
a.启动时调用注入jaeger
b.初始化服务时,使用中间件开启span
一般wraphandler 和wrapclient 中开启任意一个就可以,两个都开启和开启一个效果是一样的。
c.gomicro跨服务传送的特殊处理
openTracing 可以从context 中读取span 把链路连接在一起,但是,context再go micro的微服务之间是无法直接传递的。但是matedate可以,这方面 go micro的插件库已经帮我们处理好了
github.com/micro/go-plugins/wrapper/trace/opentracing/v2
import microOpentracing "github.com/micro/go-plugins/wrapper/trace/opentracing/v2"
ctx, startSpan, err := microOpentracing.StartSpanFromContext(context.Background(), opentracing.GlobalTracer(), "customer_test.start")
defer startSpan.Finish()
这一部分应该,写成 gin的 middleware,已保证每次请求来的时候,都能开启一个span。
具体代码如下:
package jeager
import (
"github.com/gin-gonic/gin"
microOpentracing "github.com/micro/go-plugins/wrapper/trace/opentracing/v2"
"github.com/opentracing/opentracing-go"
)
func JeagerGinMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
ctx := c.Request.Context()
ctx, startSpan, _ := microOpentracing.StartSpanFromContext(ctx, opentracing.GlobalTracer(), "customer_test.start")
c.Request = c.Request.WithContext(ctx)
defer startSpan.Finish()
c.Next()
}
}
使用:
调用接口,然后打开。http://127.0.0.1:16686/search 16686是jaeger的默认端口。