关于golang:微服务从代码到k8s部署应有尽有系列十二链路追踪

咱们用一个系列来解说从需要到上线、从代码到k8s部署、从日志到监控等各个方面的微服务残缺实际。

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

实战我的项目地址:https://github.com/Mikaelemmm…

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 反对咱们!

微信交换群

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理