# Canopy [[Facebook]](現 [[Meta]])の分散トレーシング基盤であり、エンドツーエンドの性能トレース・分析システム。SOSP 2017([[Jonathan Kaldor]]・[[Jonathan Mace]] ほか)で発表された。ブラウザ・モバイルアプリ・バックエンドサービスを横断して因果的に関連付けられた性能データを記録し、2017 年時点で 1 日 13 億件以上のトレースを処理する。 ## 設計の核心(SOSP 2017) ### 三層分離アーキテクチャ 計装(instrumentation) → イベント(event) → トレースモデル(modeled trace) → 特徴量抽出(feature extraction) → データセット(dataset) という完全なパイプラインで構成される。 (Source: [[@2017__SOSP__Canopy - An End-to-End Performance Tracing And Analysis System]]) #### イベントベース実装 × 後付けモデル構築 実装レベルはシングルイベントの汎用 DAG(`traceID`・`type`・`id1/id2`・`timestamp`・`annotations`)で記録するが、バックエンド処理で **実行ユニット(execution unit)**・**ブロック(block)**・**ポイント(point)**・**エッジ(edge)** の四要素モデルに変換する。この分離により計装とモデルが独立して進化できる。 - 先行システム(Dapper・Zipkin)はスパンモデルを計装に固定していたため、キュー・非同期・ストリーミング等の表現が困難だった - Canopy は 5 世代にわたりモデルを改訂(ブロックモデル → 実行ユニット追加 → CQ イベント → エッジ分解)しながら既存計装の後方互換を維持した #### サンプリング機構 二層のサンプリング:(1) 分散トークンバケット(テナントごとデフォルト 5 トレース/秒)と (2) ユーザー定義サンプリングポリシー(エンドポイント・データセンター・地域・Gatekeeper フィーチャーで絞り込み可能)。**日和見的トレーシング(Opportunistic Tracing)** により、クライアントはサーバーの採択決定まで一時的にメモリへキャッシュする。 (Source: [[@2017__SOSP__Canopy - An End-to-End Performance Tracing And Analysis System]] §4.1) #### テイラー(バックエンドパイプライン) TraceID でシャードされたステートレス処理パイプライン。フェッチャーが Scribe からイベントを受取り HBase に永続化する。トリガーでタイムアウトを評価し、ビルダーがモデルを構築、エクストラクタが特徴量抽出を行う。**欠乏ラウンドロビン(deficit round-robin)**で多テナント間の公平 CPU 配分を実現し、過負荷テナントを遅延エクストラクタにオフロードする。 (Source: [[@2017__SOSP__Canopy - An End-to-End Performance Tracing And Analysis System]] §4.2) #### Scuba 統合 特徴量抽出結果は [[Scuba]](Facebook のインメモリ分析データベース)に出力される。2017 年 4 月時点で 129 のデータセットが稼働し、2,852 列が提供されている。最人気列(ページロードレイテンシ)は 6 ヶ月で 23,224 件のクエリに使用された。 (Source: [[@2017__SOSP__Canopy - An End-to-End Performance Tracing And Analysis System]] §3.5, §4.5) ## Meta マイクロサービスとの接続(ATC 2023) Meta の RaaS(Recommendations as a Service)アーキテクチャにおける Canopy の観測限界が ATC 2023 論文で詳述されている。 - **双方向コンテキスト伝播**: リクエスト方向(順方向)とレスポンス方向(逆方向)の両方でコンテキストが伝播し、親子関係(前後関係)をグローバルに確立する - **ストリーミングトレース構築**: セッションウィンドウ方式(固定ギャップで区切る)でストリーム処理フレームワークが非同期にトレースを構築する - **サービスごとのサンプリングプロファイル**: サービス単位でサンプリングポリシーを設定可能。複数プロファイルのユニオンがトレースに反映される - **推定サービスブロック(Inferred blocks)**: 計装欠如やレートリミットで打ち切られたサービスを、親の情報から推定補完する ### 観測性の限界 - レートリミットや計装未実施サービスでコールパスが早期終端する - 深いコールパスほど不均等に多く早期打ち切りが発生する(深さ3以降の RaaS トレースの 80% が打ち切り) (Source: [[@2023__USENIX ATC__Lifting the veil on Meta's microservice architecture]]) ## 関連 - ソース: [[@2017__SOSP__Canopy - An End-to-End Performance Tracing And Analysis System]] / [[@2023__USENIX ATC__Lifting the veil on Meta's microservice architecture]] - 概念: [[分散トレーシング]] / [[トレースサンプリング]] / [[テレメトリ]] / [[マイクロサービスアーキテクチャ]] / [[オブザーバビリティ]] - エンティティ: [[Facebook]] / [[Meta]] / [[Jonathan Kaldor]] / [[Jonathan Mace]] / [[Scuba]] / [[Yuri Shkuro]] / [[OpenTelemetry]]