# Canopy
[[Meta]] の分散トレーシング基盤であり、エンドツーエンドの性能トレース・分析システム。SOSP 2017(Kaldor et al.)で発表された。
## アーキテクチャ上の特徴
Dapper や OpenTelemetry などの標準的な分散トレーシング基盤と類似した構造を持つが、独自の設計点を持つ。
- **イベントベース実装 × スパンベース利用**: 実装はシングルイベントのトレースポイントで行われるが、開発者はサービス実行区間(ブロック)を単位として計装する
- **双方向コンテキスト伝播**: リクエスト方向(順方向)とレスポンス方向(逆方向)の両方でコンテキストが伝播し、親子関係(前後関係)をグローバルに確立する
- **ストリーミングトレース構築**: セッションウィンドウ方式(固定ギャップで区切る)でストリーム処理フレームワークが非同期にトレースを構築する
- **サービスごとのサンプリングプロファイル**: サービス単位でサンプリングポリシー(ランダムヘッドベースor適応的)を設定可能。複数プロファイルのユニオンがトレースに反映される
- **推定サービスブロック(Inferred blocks)**: レートリミットや計装欠如で早期打ち切りされたサービスを、親の情報から推定補完する
## Thrift RPC との統合
Metaの主要なサービス間通信プロトコル Thrift RPC のサービス ID とエンドポイント名をサービスブロックに自動記録する。HTTP(REST/GraphQL)エンドポイントは正規名称がないため分析対象外。
## 観測性の限界
- サンプリングプロファイルの設定によってはリクエストの途中からしかトレースが開始されない
- レートリミットや計装未実施サービスでコールパスが早期終端する
- 深いコールパスほど不均等に多く早期打ち切りが発生する(深さ3以降のRaaSトレースの80%が打ち切り)
- 早期打ち切りの大部分は既知データベースコール以外は復元不可能
(Source: [[@2023__USENIX ATC__Lifting the veil on Meta's microservice architecture]])
## 関連
- ソース: [[@2023__USENIX ATC__Lifting the veil on Meta's microservice architecture]]
- 概念: [[分散トレーシング]] / [[トレースサンプリング]] / [[テレメトリ]] / [[マイクロサービスアーキテクチャ]]
- エンティティ: [[Meta]] / [[Yuri Shkuro]] / [[OpenTelemetry]]