generated at
分散トレース
1つのリクエストが複数のプロセス、サーバー、コンテナを経由して処理される際の、アプリケーションの処理を追跡する仕組み。各プロセス内で処理状態を収集(TRACE)し、通信の流れを把握し、統計情報(メトリクス)によってボトルネックや問題のプロファイリングを行えます。

背景
単一サーバー時代から、複数サーバー複数コンテナ時代になって、通信の流れやボトルネックの把握が難しくなった。
通信やボトルネックを追跡するため分散トレースの仕組みが必要となった
分散トレースは、元々あったTRACEという概念をサーバー、コンテナ、スタックを越えて扱えるようにした
NewRelicSentryのパフォーマンス監視などのAPMは単一サーバープロセス上での収集に特化

仕組み
トレーサー: データ収集(ライブラリ含む)
プロセス内の処理状態を収集
HTTP HeaderにTrace IDを注入し、次のプロセス(サービス)に繋ぐ
モニタリング: TRACEの結果の表示

用語

ツール
Jaeger: 分散トレース収集可視化
Zipkin: 分散トレース収集可視化
Appdash: トレーサー
LightStep: トレーサー
Prometheus: メトリクス収集可視化

参考資料
> 分散トレーシング
> 各処理にどれだけ時間がかかったのかを、ルールに従って出力することにより、複雑に関連しあったタスクでどこに問題があるのかを一目で見れるようにする。たんなるログではなく、親子関係の構造を持つログ。
> タスクのスタートと終了時に、特別なAPIを使って記録する(この1区画をスパンと呼ぶ)
> スパンを作る時には、親のスパンのIDをAPIに渡すことで、親子関係があることを通知する
> バッチ処理から作られるワーカーの場合は、スパンIDどうしをリンクすることで、関連するスパンであることを通知する
> ネットワーク越しにタスクを投げる時は、X-B3-TraceId, X-B3-ParentSpanIdといったヘッダー、gRPCのメタデータなどを介して、別プロセスでも親子関係のあるタスクを行なっていることを通知する
> スパンに対してログ、タグといったものを出力することもできる
> 分散トレースの文脈では、スパンの集合=トレース

> 分散トレーシングの歴史
> 2003年「Magpie: Online Modelling and Performance-aware Systems」
> 2007年「X-Trace: A Pervasive Network Tracing Framework」
> 2010年「Dapper, a Large-Scale Distributed Systems Tracing Infrastructure」
> 以降、Dapperの論文を元にZipkinDapperZipkinをベースにしたappdashHDFSHBaseに使われているHTraceなどのOSSが開発される。 また、最近では分散トレースの仕様やAPIを取りまとめたOpenTracingが登場し、 OpenTracingの仕様を実装したライブラリや、上記OSSのOpenTracing対応が進められて いる。