分散トレース
1つのリクエストが複数のプロセス、サーバー、コンテナを経由して処理される際の、アプリケーションの処理を追跡する仕組み。各プロセス内で処理状態を収集(TRACE)し、通信の流れを把握し、統計情報(メトリクス)によってボトルネックや問題のプロファイリングを行えます。
同義語: Distributed Tracing
背景
単一サーバー時代から、複数サーバー複数コンテナ時代になって、通信の流れやボトルネックの把握が難しくなった。
通信やボトルネックを追跡するため分散トレースの仕組みが必要となった
分散トレースは、元々あったTRACEという概念をサーバー、コンテナ、スタックを越えて扱えるようにした
NewRelicやSentryのパフォーマンス監視などのAPMは単一サーバープロセス上での収集に特化
仕組み
トレーサー: データ収集(ライブラリ含む)
プロセス内の処理状態を収集
HTTP HeaderにTrace IDを注入し、次のプロセス(サービス)に繋ぐ
モニタリング: TRACEの結果の表示
用語
トレーシング
メトリクス
インストルメント
Exporter
ツール
OpenTelemetry
OpenCensus -> OpenTelemetryへ合流
OpenTracing -> OpenTelemetryへ合流
AWS X-Ray
Stackdriver
Jaeger: 分散トレース収集可視化
Zipkin: 分散トレース収集可視化
Appdash: トレーサー
LightStep: トレーサー
Hawkular
Prometheus: メトリクス収集可視化
参考資料
OpenCensus(OpenTelemetry)とは | フューチャー技術ブログ
分散トレーシング
各処理にどれだけ時間がかかったのかを、ルールに従って出力することにより、複雑に関連しあったタスクでどこに問題があるのかを一目で見れるようにする。たんなるログではなく、親子関係の構造を持つログ。
タスクのスタートと終了時に、特別なAPIを使って記録する(この1区画をスパンと呼ぶ)
スパンを作る時には、親のスパンのIDをAPIに渡すことで、親子関係があることを通知する
バッチ処理から作られるワーカーの場合は、スパンIDどうしをリンクすることで、関連するスパンであることを通知する
ネットワーク越しにタスクを投げる時は、X-B3-TraceId, X-B3-ParentSpanIdといったヘッダー、gRPCのメタデータなどを介して、別プロセスでも親子関係のあるタスクを行なっていることを通知する
スパンに対してログ、タグといったものを出力することもできる
分散トレースの文脈では、スパンの集合=トレース
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシングの歴史
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の論文を元にZipkinやDapperとZipkinをベースにしたappdash、HDFSや HBaseに使われているHTraceなどのOSSが開発される。 また、最近では分散トレースの仕様やAPIを取りまとめたOpenTracingが登場し、 OpenTracingの仕様を実装したライブラリや、上記OSSのOpenTracing対応が進められて いる。