第 29 期 Go opentracing jaeger 整合及原始碼分析
文章來自於:https://reading.developerlearning.cn/reading/29-2019-01-23-opentracing-jaeger-in-go/
分享者: jukylin
觀看視訊
Go opentracing jaeger 整合及原始碼分析
一、分散式追蹤論文
論文地址:http://bigbully.github.io/Dapper-translation/
為什麼要用分散式追蹤
當代的網際網路的服務,通常都是用複雜的、大規模分散式叢集來實現的。 網際網路應用構建在不同的軟體模組集上,這些軟體模組,有可能是由不同的團隊開發、 可能使用不同的程式語言來實現、有可能布在了幾千臺伺服器,橫跨多個不同的資料中心。 因此,就需要一些可以幫助理解系統行為、用於分析效能問題的工具。
分散式系統呼叫過程
使用分散式追蹤要留意哪些問題
-
低損耗
跟蹤系統對線上服務的影響應該做到足夠小。
-
應用透明
對於應用的程式設計師來說,是不需要知道有跟蹤系統這回事的。
二、Opentracing 簡介
Opentracing 的作用
- OpenTracing 通過提供平臺無關、廠商無關的 API,使得開發人員能夠方便的新增(或更換)追蹤系統的實現。
可以很自由的在不同的分散式追 蹤系統中切換
不負責具體實現
Opentracing 主要組成
-
一個 Trace
一個 trace 代表了一個事務或者流程在(分散式)系統中的執行過程
-
Span
記錄 Trace 在執行過程中的資訊
-
無限極分類
服務與服務之間使用無限極分類的方式,通過 HTTP 頭部或者請求地址傳輸到最低層,從而把整個呼叫鏈串起來。
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、傳送到遠端等,一系列操作這些都會帶來效能上的損耗。
-
如何處理
選擇合適採集策略:
- Constant
- Probabilistic
- Rate Limiting
- Remote
應用透明
- 如何做到讓業務開發人員無感知
- Golang: 約定第一個引數為 ctx,把 parentSpan 放入 ctx github.com/opentracing/opentracing-go/gocontext.go
- PHP: 使用全域性變數
三、Jaeger 服務端原始碼閱讀
服務端元件職責
各元件按照微服務架構風格設計,職責單一
Jaeger-agent 負責上報資料的整理
Jaeger-collector 負責資料儲存
Jaeger-query 負責資料查詢
Jaeger-agent 和 Jaeger-collector 使用基於 TCP 協議實現的 RPC 進行通訊
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 執行時間進行監控調優
更多原創文章乾貨分享,請關注公眾號
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 第 74 期 time.Timer 原始碼分析 (Go 1.14)原始碼Go
- Jaeger tchannel-go原始碼閱讀——PeerGo原始碼
- opentracing-go原始碼閱讀一Go原始碼
- Jaeger tchannel-go —— readme原始碼閱讀Go原始碼
- 第 27 期 go mod 原始碼閱讀 part 2Go原始碼
- [原始碼分析] OpenTracing之跟蹤Redis原始碼Redis
- opentracing-go原始碼閱讀——資訊攜帶Go原始碼
- 以太坊原始碼分析(29)core-vm原始碼分析原始碼
- 每週分享第 29 期
- #21 Go errors 處理及 zap 原始碼分析GoError原始碼
- opentracing-go原始碼閱讀——Log儲存(完結篇)Go原始碼
- 第 23 期 Drone 簡單介紹和部分原始碼分析原始碼
- go ants原始碼分析Go原始碼
- Scala 技術週刊 | 第 29 期
- go rpc 原始碼分析GoRPC原始碼
- go基於grpc構建微服務框架-整合opentracingGoRPC微服務框架
- 第 19 期 如何開發一個簡單高效能的 http router 及 gorouter 原始碼分析HTTPGo原始碼
- 第 57 期 sync/semaphore 原始碼淺析原始碼
- 第 31 期 flag 包原始碼閱讀原始碼
- 第 35 期 context 原始碼閱讀Context原始碼
- React原始碼分析 - 生命週期React原始碼
- Go的WaitGroup原始碼分析GoAI原始碼
- go sync.Map原始碼分析Go原始碼
- k8s client-go原始碼分析 informer原始碼分析(6)-Indexer原始碼分析K8SclientGo原始碼ORMIndex
- k8s client-go原始碼分析 informer原始碼分析(4)-DeltaFIFO原始碼分析K8SclientGo原始碼ORM
- 【MyBatis原始碼分析】select原始碼分析及小結MyBatis原始碼
- 第 67 期 Go database/sql 資料庫連線池分析GoDatabaseSQL資料庫
- Mybatisi和Spring整合原始碼分析MyBatisSpring原始碼
- 「 iOS知識小集 」2018 · 第 29 期iOS
- 以太坊原始碼分析(44)p2p-database.go原始碼分析原始碼DatabaseGo
- 以太坊原始碼分析(45)p2p-dial.go原始碼分析原始碼Go
- 以太坊原始碼分析(46)p2p-peer.go原始碼分析原始碼Go
- 以太坊原始碼分析(48)p2p-server.go原始碼分析原始碼ServerGo
- 以太坊原始碼分析(49)p2p-table.go原始碼分析原始碼Go
- 以太坊原始碼分析(50)p2p-udp.go原始碼分析原始碼UDPGo
- Fabric 1.0原始碼分析(29) Orderer #multichain(多鏈支援包)原始碼AI
- 【Springboot】例項講解Springboot整合OpenTracing分散式鏈路追蹤系統(Jaeger和Zipkin)Spring Boot分散式
- SDWebImage使用及原始碼分析Web原始碼