• 微服务从代码到k8s部署应有尽有系列(十二、链路追踪)


    我们用一个系列来讲解从需求到上线、从代码到k8s部署、从日志到监控等各个方面的微服务完整实践。

    整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中间件,所用到的技术栈基本是go-zero项目组的自研组件,基本是go-zero全家桶了。

    实战项目地址:https://github.com/Mikaelemmmm/go-zero-looklook

    1、概述

    如果按照我前两节错误处理、日志收集配置的话,我们通过日志中的traceId也可以完整看到报错时候的整体链路日志,但是不报错的时候或者想方便的查看单个业务整个链路调用的执行时间是不太方便查看的,所以最好还是加上链路追踪。

    go-zero底层已经帮我们把代码跟链路追踪对接的代码已经写好了

    func startAgent(c Config) error {
      opts := []sdktrace.TracerProviderOption{
        // Set the sampling rate based on the parent span to 100%
        sdktrace.WithSampler(sdktrace.ParentBased(sdktrace.TraceIDRatioBased(c.Sampler))),
        // Record information about this application in an Resource.
        sdktrace.WithResource(resource.NewSchemaless(semconv.ServiceNameKey.String(c.Name))),
      }
    
      if len(c.Endpoint) > 0 {
        exp, err := createExporter(c)
        if err != nil {
          logx.Error(err)
          return err
        }
    
        // Always be sure to batch in production.
        opts = append(opts, sdktrace.WithBatcher(exp))
      }
    
      tp := sdktrace.NewTracerProvider(opts...)
      otel.SetTracerProvider(tp)
      otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(
        propagation.TraceContext{}, propagation.Baggage{}))
      otel.SetErrorHandler(otel.ErrorHandlerFunc(func(err error) {
        logx.Errorf("[otel] error: %v", err)
      }))
    
      return nil
    }
    

    默认支持jaeger、zinpink

    package trace
    
    // TraceName represents the tracing name.
    const TraceName = "go-zero"
    
    // A Config is a opentelemetry config.
    type Config struct {
      Name     string  `json:",optional"`
      Endpoint string  `json:",optional"`
      Sampler  float64 `json:",default=1.0"`
      Batcher  string  `json:",default=jaeger,options=jaeger|zipkin"`
    }
    
    

    我们只需要在我们的业务代码配置中,也就是你的业务配置的yaml中配置参数即可。

    2、实现

    go-zero-looklook是以jaeger来实现的

    2.1 jaeger

    项目的docker-compose-env.yaml中配置了jaeger

    services:
      #jaeger链路追踪
      jaeger:
        image: jaegertracing/all-in-one:latest
        container_name: jaeger
        ports:
          - "5775:5775/udp"
          - "6831:6831/udp"
          - "6832:6832/udp"
          - "5778:5778"
          - "16686:16686"
          - "14268:14268"
          - "9411:9411"
        environment:
          - SPAN_STORAGE_TYPE=elasticsearch
          - ES_SERVER_URLS=http://elasticsearch:9200
          - LOG_LEVEL=debug
        networks:
          - looklook_net
          
       ........
    

    其中jager_collector 依赖elasticsearch做存储,所以要把elasticsearch安装上,前一节收集日志时候我们已经演示了。

    2.2 业务配置

    我们以用户服务为例

    1)api配置

    app/usercenter/cmd/api/etc/usercenter.yaml

    Name: usercenter-api
    Host: 0.0.0.0
    Port: 8002
    Mode: dev
    ......
    
    #链路追踪
    Telemetry:
      Name: usercenter-api
      Endpoint: http://jaeger:14268/api/traces
      Sampler: 1.0
      Batcher: jaeger
    

    2)rpc配置

    Name: usercenter-rpc
    ListenOn: 0.0.0.0:9002
    Mode: dev
    
    .....
    
    #链路追踪
    Telemetry:
      Name: usercenter-rpc
      Endpoint: http://jaeger:14268/api/traces
      Sampler: 1.0
      Batcher: jaeger
    

    2.3 查看链路

    请求用户服务注册、登陆、获取登陆用户信息

    浏览器输入 http://127.0.0.1:16686/search即可查看

    3、小结

    日志、链路追踪我们都整理完了,好的系统一定能及时监控异常,接下来要看服务监控了。

    项目地址

    https://github.com/zeromicro/go-zero

    欢迎使用 go-zerostar 支持我们!

    微信交流群

    关注『微服务实践』公众号并点击 交流群 获取社区群二维码。

  • 相关阅读:
    ADT上跑java application
    GIT 用RSA加密方式来记住密码
    android中listView下有Button按钮始终在最底部
    Android学习:导入工程时报错The import android cannot be resolved
    Preference的使用
    MySQL查询时,查询结果如何按照where in数组排序
    MySQL创建民族表的SQL语句
    PHP 使用GD库合成带二维码和圆形头像的海报步骤以及源码实现
    使用file_get_contents()和curl()抓取网络资源的效率对比
    常用正则表达式整理(持续更新中)
  • 原文地址:https://www.cnblogs.com/kevinwan/p/15987900.html
Copyright © 2020-2023  润新知