• 微服务:分布式链路追踪系统-jaeger


    简介

    jaeger是一个比较有名的分布式链路追踪系统,底层用golang实现,兼容opentracing标准。

    部署

    我们用docker部署,集成整套环境,docker地址:https://hub.docker.com/r/jaegertracing/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 9411:9411 
      jaegertracing/all-in-one:latest
    

    执行完成后,用
    命令:docker ps
    看看运行起来没,这里看结果已经运行了:

    访问jaeger的web界面:
    localhost:16686
    如果你是远程,这里的localhost可以换成你的服务器ip,或者你配置的域名。

    简单demo

    先编写一个初始化jaeger tracer的initJaeger方法:
    此时我们要在reporter中配置jaeger Agent的ip与端口,以便将tracer的信息发布到agent中。配置LocalAgentHostPort参数为127.0.0.1:6381,6381接口是接受压缩格式的thrift协议数据。如果是远程这里的 127.0.0.1 可以设置为你远程ip地址。
    采样率暂且设置为1

    func initJaeger(service string) (opentracing.Tracer, io.Closer) {
        cfg := &config.Configuration{
            Sampler:&config.SamplerConfig{
                Type:     "const",
                Param:1,
            },
            Reporter: &config.ReporterConfig{
                LogSpans:            true,
                LocalAgentHostPort:  "127.0.0.1:6831",
            },
        }
        tracer, closer, err := cfg.New(service, config.Logger(jaeger.StdLogger))
        if err != nil {
            panic(fmt.Sprintf("Error: connot init Jaeger: %v
    ", err))
        }
        return tracer, closer
    }
    

    然后我们在main函数中创建调用InitJaeger,并创建一个root span,调用两个函数,分别表示调用两个分布式服务。

    我们用ContextWithSpan来创建一个新的ctx,将span的信息与context关联,传到TestDemo中时,需要创建一个子span,父span是ctx中的span。

    我们在TestDemo中调用StartSpanFromContext时,忽略了第二个参数,这是利用子span创建的新的context,当我们在TestDemo中再调用别的比如TestDemo2时,我们应该使用新的context,而不是传入的ctx。

    注意StartSpanFromContext会用到opentracing.SetGlobalTracer()来启动新的span,所以在main函数中需要调用。

    func TestDemo(req string, ctx context.Context) (reply string) {
        // 1. 创建span
        span, _ := opentracing.StartSpanFromContext(ctx, "span_testdemo")
        defer func() {
            // 4. 接口调用完,在tag中设置request和reply
            span.SetTag("request", req)
            span.SetTag("reply", reply)
            span.Finish()
        }()
    
        println(req)
        //2. 模拟耗时
        time.Sleep(time.Second/2)
        //3. 返回reply
        reply = "TestDemoReply"
        return
    }
    
    // TestDemo2, 和上面TestDemo 逻辑代码一样
    func TestDemo2(req string, ctx context.Context) (reply string) {
        span, _ := opentracing.StartSpanFromContext(ctx, "span_testdemo2")
        defer func() {
            span.SetTag("request", req)
            span.SetTag("reply", reply)
            span.Finish()
        }()
    
        println(req)
        time.Sleep(time.Second/2)
        reply = "TestDemo2Reply"
        return
    }
    
    func main() {
        tracer, closer := initJaeger("jager-test-demo")
        defer closer.Close()
        opentracing.SetGlobalTracer(tracer)
    
        span := tracer.StartSpan("span_root")
        ctx := opentracing.ContextWithSpan(context.Background(), span)
        r1 := TestDemo("Hello TestDemo", ctx)
        r2 := TestDemo2("Hello TestDemo2", ctx)
        fmt.Println(r1, r2)
        span.Finish()
    }
    

    运行demo:
    go run simple/main.go
    运行提交的span信息会打印出来:

    21:57:30 debug logging disabled
    21:57:30 Initializing logging reporter
    21:57:30 debug logging disabled
    Hello TestDemo
    21:57:30 Reporting span 2163520004cced2a:4155a263b5147904:2163520004cced2a:1
    Hello TestDemo2
    21:57:31 Reporting span 2163520004cced2a:01928bf482621c17:2163520004cced2a:1
    TestDemoReply TestDemo2Reply
    21:57:31 Reporting span 2163520004cced2a:2163520004cced2a:0000000000000000:1

    然后在去jaeger UI上刷新查看,会出现记录:
    可以发现有分层,时间耗时也明显,接口先后调用也很清晰。

    点击上面的 jager-test-demo 进去,可以看到下面的这种调用情况:

    参考

  • 相关阅读:
    [转]MYSQL5.7版本sql_mode=only_full_group_by问题
    [坑]Linux MySQL环境表名默认区分大小写
    [转]CentOS 7.3 安装MySQL
    [转]Oracle截取字符串相关函数
    服务相关
    CSRF攻击
    sqlalchemy——多表操作
    sqlalchemy——基本操作
    高可用——网站运行监控
    高可用——软件质量保证
  • 原文地址:https://www.cnblogs.com/jiujuan/p/13235748.html
Copyright © 2020-2023  润新知