論文メモ Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

January 23, 2021

分散トレーシングシステムDapperをGoogle社内で開発、デプロイ、2年間の運用を経た知見をまとめている。 Dapperをもとにして、TwitterはZipkinを、UberはJaegerを開発した。 Dapper以前に開発されたMagpie X-Traceとの違いは、サンプリングされたリクエストのみをトレースし負荷を低減する機能がある点や、少数の共通ライブラリだけを測定対象にするところにある。

リクエストのトレーシングを実現する手段は、アプリケーションにアノテーションをつけるかどうかで分類できる。 アノテーションをつけない場合、リクエストの相関関係を回帰分析で推定しトレースを見つける。 期待するトレースの精度が高いほど、多くのリクエストが必要になる。 アノテーションをつかう場合、アプリケーションを修正しなければならないが、トレースの精度は開発者によって保証される。

Dapperは前者の手法をとり、アノテーションによるトレーシングの機能はオプションの位置づけであり、アプリケーションがDapperを意識する必要はない。 トレーシング対象の分散システムでは、サブシステム間で共通のスレッドモデル、制御フロー、RPCライブラリが採用されている。 Dapperは、このサブシステム間の共通性を仮定し、測定箇所をこれらのライブラリに限定している。 これにより、アノテーションが不要になり、また、測定のオーバーヘッドの低減につながっている。

スレッドがトレース対象のリクエストを処理するとき、Dapperは、スレッドのローカルストレージに、トレースやサブシステムでの経過時間に対するIDなどトレーシングの情報を保存する。 この情報をtrace contextという。 スレッドがリクエストを非同期処理するときは、Dapperがリクエストを受けたスレッドからコールバックのスレッドにtrace contextを伝達する。 trace contextは、RPCを介してサブシステム間で伝達される。 なお、W3CはHTTPによる分散トレーシングのためのtrace contextの規格のドラフトを発表している。

論文をこちらからダウンロードできます。