第 29 期 Go opentracing jaeger 整合及原始碼分析

mai_yang發表於2020-02-13

文章來自於:https://reading.developerlearning.cn/reading/29-2019-01-23-opentracing-jaeger-in-go/

分享者: jukylin

觀看視訊

Go opentracing jaeger 整合及原始碼分析

一、分散式追蹤論文

論文地址:http://bigbully.github.io/Dapper-translation/

為什麼要用分散式追蹤

當代的網際網路的服務,通常都是用複雜的、大規模分散式叢集來實現的。 網際網路應用構建在不同的軟體模組集上,這些軟體模組,有可能是由不同的團隊開發、 可能使用不同的程式語言來實現、有可能布在了幾千臺伺服器,橫跨多個不同的資料中心。 因此,就需要一些可以幫助理解系統行為、用於分析效能問題的工具。

分散式系統呼叫過程

image

使用分散式追蹤要留意哪些問題

  • 低損耗

    跟蹤系統對線上服務的影響應該做到足夠小。

  • 應用透明

    對於應用的程式設計師來說,是不需要知道有跟蹤系統這回事的。

二、Opentracing 簡介

Opentracing 的作用

  • OpenTracing 通過提供平臺無關、廠商無關的 API,使得開發人員能夠方便的新增(或更換)追蹤系統的實現。  
  • 可以很自由的在不同的分散式追 蹤系統中切換

  • 不負責具體實現

image

Opentracing 主要組成

  • 一個 Trace

    一個 trace 代表了一個事務或者流程在(分散式)系統中的執行過程

  • Span

    記錄 Trace 在執行過程中的資訊

  • 無限極分類

    服務與服務之間使用無限極分類的方式,通過 HTTP 頭部或者請求地址傳輸到最低層,從而把整個呼叫鏈串起來。

image

Jaeger-client 的實現

Jaeger-client 原始碼

提取
  • 為什麼要提取

    主要作用是為了找到父親

  • 從哪裡提取

    程式內,不同程式之間各自約定 粟子:github.com/opentracing-contrib/go-stdlib/nethttp/server.go P86

  • 提取什麼

    traceid:spanid:parentid:是否採集 uber-trace-id=157b74261b51d917:157b74261b51d917:0:1 github.com/jaegertracing/jaeger-client-go/propagation.go P124

注入
  • 為什麼要注入

    主要為了讓孩子能找到爸爸

  • 注入到哪裡

    和提取相對 github.com/jaegertracing/jaeger-client-go/propagation_test.go

  • 注入了什麼

    github.com/jaegertracing/jaeger-client-go/propagation.go P103

非同步 report
  • Span.finish

    github.com/jaegertracing/jaeger-client-go/span.go P177

  • 把 Span 放入佇列

    github.com/jaegertracing/jaeger-client-go/reporter.go P219

  • 從佇列取出,生成 thrift,放入 spanBuffer

    github.com/jaegertracing/jaeger-client-go/reporter.go P253

  • Flush 到遠端

    github.com/jaegertracing/jaeger-client-go/transport_udp.go P113

低消耗

  • 消耗在哪裡

    Jaeger-client 作用於應用層,提取、注入、生成 span、序列化成 Thrift、傳送到遠端等,一系列操作這些都會帶來效能上的損耗。

  • 如何處理

    選擇合適採集策略:

    1. Constant
    2. Probabilistic
    3. Rate Limiting
    4. Remote

應用透明

  • 如何做到讓業務開發人員無感知
    1. Golang: 約定第一個引數為 ctx,把 parentSpan 放入 ctx github.com/opentracing/opentracing-go/gocontext.go
    2. PHP: 使用全域性變數

三、Jaeger 服務端原始碼閱讀

服務端元件職責

各元件按照微服務架構風格設計,職責單一

image

  • Jaeger-agent 負責上報資料的整理

  • Jaeger-collector 負責資料儲存

  • Jaeger-query 負責資料查詢

  • Jaeger-agent 和 Jaeger-collector 使用基於 TCP 協議實現的 RPC 進行通訊

image

Jaeger-agent 原始碼閱讀

  • 監聽 3 個 UDP 埠

    github.com/jaegertracing/jaeger/cmd/agent/app/flags.go P35 github.com/jaegertracing/jaeger/cmd/agent/app/servers/thriftudp/transport.go P73

  • 接收 Jaeger-client 的資料,放入佇列 dataChan

    github.com/jaegertracing/jaeger/cmd/agent/app/servers/tbuffered_server.go #80

  • 從佇列 dataChan 獲取資料,進行校驗

    github.com/jaegertracing/jaeger/cmd/agent/app/processors/thrift_processor.go P108

  • 提交資料

    github.com/jaegertracing/jaeger/thrift-gen/jaeger/tchan-jaeger.go #39

Jaeger-collector 原始碼閱讀

  • 協程池

    github.com/jaegertracing/jaeger/pkg/queue/bounded_queue.go

  • 接收 jaeger-agent 資料

    github.com/jaegertracing/jaeger/cmd/collector/app/span_handler.go P69

  • 放入佇列

    github.com/jaegertracing/jaeger/cmd/collector/app/span_processor.go P112

  • 從佇列拿出來,寫入資料庫

    github.com/jaegertracing/jaeger/cmd/collector/app/span_processor.go p54
    github.com/jaegertracing/jaeger/plugin/storage/cassandra/spanstore/writer.go P136

四、Jaeger 使用經驗

監聽指標

  • Jaeger-client 監聽 reporter_spans

  • Jaeger-agent 監聽 thrift.udp.server.packets.dropped

  • Jaeger-collector 監聽 spans.dropped

http://localhost:16686/metrics

測試環境 debug

測試環境記錄執行 mysql 語句,redis 命令,RPC 引數、結果 可以很方便定位問題

效能調優

觀察 Jaeger-ui,對線上介面,mysql 執行時間進行監控調優

更多原創文章乾貨分享,請關注公眾號

更多原創文章乾貨分享,請關注公眾號
  • 第 29 期 Go opentracing jaeger 整合及原始碼分析
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章