微服務從代碼到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 支持我們!

微信交流羣

關注『微服務實踐』公衆號並點擊 交流羣 獲取社區羣二維碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章