全部產品
Search
文件中心

Application Real-Time Monitoring Service:通過Jaeger上報Go應用資料

更新時間:Aug 07, 2024

通過Jaeger為應用埋點並上報鏈路資料至Managed Service for OpenTelemetry後,Managed Service for OpenTelemetry即可開始監控應用,您可以查看應用拓撲、調用鏈路、異常事務、慢事務和SQL分析等一系列監控資料。本文介紹如何使用Jaeger SDK和Jaeger Agent埋點並上報Go應用資料。

重要
  • 為獲得更豐富的功能、更先進的鏈路追蹤能力,以及最佳使用體驗,建議您使用OpenTelemetry協議將應用接入Managed Service for OpenTelemetry。我們為您提供了詳細的OpenTelemetry接入指南和最佳實務,協助您快速上手Managed Service for OpenTelemetry。更多資訊,請參見接入應用

  • ARMS應用監控針對Golang語言提供了商業化版本的自研探針,提供了無侵入的埋點能力,擁有更加豐富的功能和更高的穩定性。詳細資料,請參見開始監控Golang應用

前提條件

擷取存取點資訊

  1. 登入ARMS控制台,在左側導覽列單擊接入中心

  2. 服務端應用地區單擊Jaeger卡片。

  3. 在彈出的Jaeger面板中選擇資料需要上報的地區。

    說明

    初次接入的地區將會自動進行資源初始化。

  4. 選擇串連方式上報方式,然後複製存取點資訊。

    • 串連方式:若您的服務部署在阿里雲上,且所屬地區與選擇的接入地區一致,推薦使用阿里雲內網方式,否則選擇公網方式。

    • 上報方式:根據用戶端支援的協議類型選擇HTTP或gRPC協議上報資料。

    image.png

背景資訊

資料是如何上報的?

  • 不通過Jaeger Agent而直接上報資料的原理如下圖所示。

  • 通過Jaeger Agent上報資料的原理如下圖所示。

方式一:通過Jaeger SDK上報資料

此處以依賴管理工具Go Modules為例,您可以通過Jaeger SDK埋點直接將資料上報到Managed Service for OpenTelemetry服務端。若使用其他依賴管理工具,請按實際情況操作。

  1. 引入jaeger-client-go

    go get github.com/uber/jaeger-client-go
  2. 建立Tracer對象。

    說明

    請將<endpoint>替換成Managed Service for OpenTelemetry控制台存取點資訊頁面上相應用戶端和相應地區的存取點。關於擷取存取點資訊的方法,請參見本文前提條件。

    func NewJaegerTracer(service string) (opentracing.Tracer, io.Closer) {
    
        sender := transport.NewHTTPTransport(
           // 設定網關,網關因地區而異。
            "<endpoint>",
        )
       tracer, closer:= jaeger.NewTracer(service,
               jaeger.NewConstSampler(true),
               jaeger.NewRemoteReporter(sender))
       return tracer, closer
    }
  3. 建立span執行個體對象和資料透傳。

    • 如果沒有parentSpan:

      // 建立Span。
      span := tracer.StartSpan("myspan")
      // 設定Tag。
      clientSpan.SetTag("mytag", "123")
      // 透傳traceId。
      tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))
      ...
      defer  span.Finish()
    • 如果有parentSpan:

      // 從HTTP/RPC對象解析出spanCtx。
      spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))
      span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx))
      ...
      defer  span.Finish()

    更多詳細使用方法,請參見Go Doc

方式二:通過Jaeger Agent上報資料

  1. 啟動Jaeger Agent。具體操作,請參見安裝Jaeger Agent

  2. 引入jaeger-client-go

    go get github.com/uber/jaeger-client-go
  3. 建立Tracer對象。

    func NewJaegerTracer(serviceName string) (opentracing.Tracer, io.Closer) {
       sender, _ := jaeger.NewUDPTransport("",0)
       tracer, closer:= jaeger.NewTracer(serviceName,
            jaeger.NewConstSampler(true),
            jaeger.NewRemoteReporter(sender))
        return tracer, closer
    }
  4. 建立span執行個體對象和資料透傳。

    • 如果沒有parentSpan:

      // 建立Span。
      span := tracer.StartSpan("myspan")
      // 設定Tag。
      clientSpan.SetTag("mytag", "123")
      // 透傳traceId。
      tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))
      ...
      defer  span.Finish()
    • 如果有parentSpan:

      // 從HTTP/RPC對象解析出spanCtx。
      spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))
      span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx))
      ...
      defer  span.Finish()

    更多詳細使用方法,請參見Go Doc

使用樣本

通過Jaeger SDK直接上報

  1. 擷取存取點資訊。具體操作方法,請參見本文前提條件。

  2. 運行以下命令,下載樣本檔案

    wget https://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/demo/tracing-demo.zip && unzip tracing-demo.zip
  3. 開啟樣本檔案夾中的examples/settings.go檔案,配置TracingAnalysisEndpoint,將圖示①替換為步驟1中擷取的存取點資訊。

    jaeger_demo

  4. 使用go mod tidy命令整理依賴。

  5. 使用go run tracingdemo命令運行樣本。

通過Jaeger Agent上報

  1. 擷取存取點資訊。具體操作方法,請參見本文前提條件。

  2. 運行以下命令,下載樣本檔案

    wget https://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/demo/tracing-demo.zip && unzip tracing-demo.zip
  3. 啟動Jaeger Agent。具體操作,請參見安裝Jaeger Agent

  4. 開啟樣本檔案夾中的examples/settings.go檔案,將AgentSwitch修改為true

    jaeger_demo

  5. 使用go mod tidy命令整理依賴。

  6. 使用go run tracingdemo命令運行樣本。

常見問題

Q:在運行過程中,為什麼會出現以下報錯?

2021/06/28 21:11:54 ERROR: error when flushing the buffer: error from collector: 403

A:出現上述報錯,說明輸入的存取點資訊不正確。請更正並重試。