gomicro v2--04 链路追踪jaeger和监控Prometheus

环境准备

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

一、链路追踪jaeger

1.为什么使用链路追踪?

互联网时代,分布式已成主流。一个调用,往往涉及多个微服务,如何对,这些调用进行追踪,就成为了一个,重要问题。

2.链路追踪系统需要满足什么条件?

  1. 低消耗:对系统影响尽量小。
  2. 应用透明:应用程序员,不需要知道有链路追踪这回事。
  3. 延展性:应该能满足为了几年应用发展的需求。

3.opentracing是什么

opentracing 是实现链路追踪的一套标准,一组公共接口,java、php、go都有公共类库实现。具体实现,如jaeger 只需要把自己的功能,注入到接口中,就能无缝使用。

(1)tracer

实现opentracing 的具体记录分布式链路的系统,如jaeger

(2)span

链路追踪的单位,可以理解为一个盒子,一次链路追踪需要开启一个根盒子,其他的调用,创建一个子盒子,平级的盒子,并排在父盒子里,子调用,盒子的内部。形成一个类似树的结构。

4.jaeger是什么

Jaeger 是Uber推出的一款开源分布式追踪系统,兼容OpenTracing API。分布式追踪系统用于记录请求范围内的信息。例如,一次远程方法调用的执行过程和耗时。是我们排查系统问题和系统性能的利器。
分布式追踪系统种类繁多,但是核心步骤有三个:代码埋点,数据存储和查询展示。

5.go micro中引入jaeger

(1)jaeger注入到opentracing中 的方法实现

gomicro v2--04 链路追踪jaeger和监控Prometheus_第1张图片

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

gomicro v2--04 链路追踪jaeger和监控Prometheus_第2张图片

b.初始化服务时,使用中间件开启span

gomicro v2--04 链路追踪jaeger和监控Prometheus_第3张图片 一般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()
	}
}

使用:

gomicro v2--04 链路追踪jaeger和监控Prometheus_第4张图片

 调用接口,然后打开。http://127.0.0.1:16686/search 16686是jaeger的默认端口。

gomicro v2--04 链路追踪jaeger和监控Prometheus_第5张图片

gomicro v2--04 链路追踪jaeger和监控Prometheus_第6张图片

二、监控Prometheus

你可能感兴趣的:(go,micro,v2,分布式)