跳到主要内容

Dapper

Motivation

在分散式環境下,Google的業務每個request可能會需要數十、數百甚至上千個其他服務來一同完成,需要有方式來知道一個request被完成的過程中,紀錄每個service花了多少時間、甚至留下application log來知道執行細節。

Goals

  1. 不影響service performance (latency、throughput)
  2. 對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

image info

log file

被改寫過的SDKdependency binaries會把資料寫到log file

Dapper daemon & collectors

Dapper daemoncollectors會pull 這些log來處理。

Bigtable

這些資料最後會被存到Dapper的資料庫,也就是Bigtable

Implementation

Instrumentation points

因為Google的service太多了,不想要每個service都要增加dependency,所以Dapper被實作在常用的libraries,例如thread local contextRPC SDK等等,tracespan邏輯對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更快的定位問題。

References