Dapper
Motivation
在分散式環境下,Google的業務每個request可能會需要數十、數百甚至上千個其他服務來一同完成,需要有方式來知道一個request被完成的過程中,紀錄每個service花了多少時間、甚至留下application log來知道執行細節。
Goals
- 不影響service performance (latency、throughput)
- 對service 來說是transparent。
Data structure
trace tree
每個request 會產生一個trace tree,每個tree有一個trace id,每個node是一個span,span可以有child span。
span
span 裡面會紀錄service 收到request到處理完成的時間。每個span 有自己的span id,如果有需要,也可以產生child span,例如進行另外的rpc 呼叫,就會把trace id
、自己的span id
等資訊帶到下一個service。
Architecture
log file
被改寫過的SDK
或dependency binaries
會把資料寫到log file。
Dapper daemon & collectors
Dapper daemon
或 collectors
會pull 這些log來處理。
Bigtable
這些資料最後會被存到Dapper
的資料庫,也就是Bigtable。
Implementation
Instrumentation points
因為Google的service太多了,不想要每個service都要增加dependency ,所以Dapper
被實作在常用的libraries,例如thread local context
、RPC SDK
等等,trace
和span
邏輯對service owner 來說是tranparent。
Annotations
其實就是log。有時候光從Dapper
自動蒐集到的metric無法得到足夠的資訊,service owner還是可以選擇include Dapper API
,把 application log
也送到後台。
Sampling
Google的service實在太多,如果每個request都搜集的話會把Dapper
後端打爆,而且這些request I/O也會對service performance產生影響,所以Dapper daemon
會做sampling,以Google的scale,即使取樣1/1024也不影響monitoring和debugging。
Visualization
有一個web app
會把trace tree
做visualzation,將蒐集到的資料視覺化,可以幫助developer更快的定位問題。