# Tracezip: Efficient Distributed Tracing via Trace Compression
ISSTA 2025(Proc. ACM Softw. Eng., Vol. 2, No. ISSTA, Article ISSTA019, July 2025)。[[Zhuangbin Chen]]([[Sun Yat-sen University]])、Junsong Pu(BUPT)、[[Zibin Zheng]]([[Sun Yat-sen University]])。DOI: 10.1145/3728888。
## 概要
分散トレーシングにおけるトレースデータの伝送・保持オーバーヘッドを、サンプリングではなく**圧縮**で削減する初のオンラインシステム。スパン間に存在する大域的な冗長性(反復するキー・バリューペア群)を **Span Retrieval Tree (SRT)** というプレフィックスツリー型のデータ構造でサービス側において連続的に抽出し、スパンを「パス識別子+ローカルフィールド」の軽量表現に変換する。バックエンド側では SRT を参照して完全なスパンを復元する。SRT のリストラクチャリング、辞書ベースのマッピング圧縮、差分同期メカニズムを含む。[[OpenTelemetry]] Collector 内に約 3,000 行の Go コードで実装済みである。
## 動機と冗長性分析
分散トレーシングのデータ量は膨大で、Google は日量約 1,000TB の生トレースを生成し、Netflix は日量 20 億リクエスト以上を処理する。既存の対処は以下の 2 系統に限られていた。
- **ヘッドベースサンプリング**: リクエスト到着時に無差別に一部(例 1%)を選択。エッジケースを見逃す。
- **テールベースサンプリング**: 全リクエストをトレースした後に異常トレースのみを保持。収集・取り込みのオーバーヘッドが消えない。
著者らは [[Train-Ticket]](41 マイクロサービス)および gRPC・Apache Kafka・Servlet・MySQL・Redis・MongoDB の 6 アプリケーションコンポーネントで 40GB 超のトレースを収集し、冗長性を定量化した。主な知見は以下のとおり。
1. **高い冗長性**: Train-Ticket の各サービスで約 70% のキー・バリューペアが高頻度で反復する(出現 1,000 回超)。Kafka のみメッセージキュー内容の混入でランダム性が高い。
2. **属性間の構造的冗長性**: OpenTelemetry のセマンティック規約(`network.local.address`、`network.peer.address` 等)によりキー名が名前空間を共有し、バリューも類似パターンを示す。
## 手法: Span Retrieval Tree (SRT)
### 基本構造
SRT はプレフィックスツリー型の多分岐木で、各非葉ノードがキー・バリューペアを保持する。スパン名ごとに 1 つの葉ノードが存在し、その葉にはスパン固有(非圧縮)のキー群(**ローカルフィールド**: span\_id、parent\_id、タイムスタンプ等)を格納する。あるスパンは SRT の根から葉への 1 パスとして「綴り出せる」。パスに含まれる非葉ノードのキー・バリューペア群が複数スパンで共有される**ユニバーサルフィールド**である。
圧縮時、スパンは「パス識別子(短いハッシュ)+ローカルフィールドの値」のみに変換される。
### アルゴリズム(Algorithm 1)
1. 未知のスパン名 → 全キー・バリューペアをチェインして SRT の根に新パスを追加。
2. 既知のスパン名 → SRT を根から葉へ走査し、不一致のキー・バリューペアが現れた時点で残りをチェインして新分岐を追加。
3. 各深さのユニークノード数がしきい値 ψ を超えるキーは葉へ移動(ローカルフィールド化)。
4. キーをユニーク値数の昇順に並べ替え、SRT を最適構造にリストラクチャリング。
### 最適化
- **SRT リストラクチャリング**: ユニーク値数の少ないキーを上位に配置し、同一深度の同値ノードを統合。ノード数を削減。
- **辞書ベースのマッピング圧縮**: SRT 内で反復するキー/バリューを `[0-9a-zA-Z]` の短い識別子に置換。キーのトークン分割(`.` / `_` でセパレート)で属性の構造的冗長性も除去。
- **差分同期メカニズム**: SRT/辞書の変更分のみをバックエンドに送信。バックエンド側は `{識別子: パス}` の逆引きマップを保持し、パスの追加/削除のみ反映。OpenTelemetry のバッチプロセッサと連携し、バッチ送出前に SRT 同期を完了させる。
### 実装
OpenTelemetry Collector のエクスポータ(サービス側圧縮)とレシーバ(バックエンド側復元)に実装。ハッシュによるパス探索を O(1) で実現。Go の map 型を利用。
## 実験結果
### オープンソースシステム
| システム | 生データ(MB) | Tracezip 単体 CR | gzip CR | Tracezip+gzip CR | 改善率 |
|---|---|---|---|---|---|
| Train Ticket | 21.0 | 4.05 | 10.90 | 16.26 | 33.0% |
| gRPC | 3.08 | 5.31 | 18.91 | 22.81 | 17.0% |
| Servlet | 9.36 | 6.46 | 18.50 | 23.64 | 21.7% |
| Redis | 2.01 | 6.09 | 23.93 | 30.45 | 21.4% |
| Kafka | 2.47 | 3.94 | 17.27 | 18.57 | 7.0% |
Kafka はメッセージキューデータの混入で圧縮率が最も低い。Train Ticket はマイクロサービス間の呼び出しグラフが複雑でビジネスロジック情報が多く、汎用圧縮の短い窓長(gzip: 32KB)では捉えきれない大域的冗長性を SRT が補完し、改善幅が最大(30〜35%)になる。
### Alibaba 本番トレース
26.15GB の本番トレースデータ(20,000 超のマイクロサービス)で評価。lzma 単体の圧縮率 8.52 に対し、Tracezip+lzma で 13.69(1.91GB)を達成。改善率は gzip 併用で 35.1%、bzip2 併用で 43.6%、lzma 併用で 37.8%。大規模で多様なトレースほど SRT の大域圧縮が効く。
### オーバーヘッド
- **空間**: ψ=1,000 で SRT+辞書の合計 2.56MB。性能改善は 33.8%。値分布が二極化するため ψ=10,000 でも大差なし。
- **スループット**: Train Ticket で約 8 倍向上(13.78→109.68 MB/s)。JSON シリアライズがボトルネックの環境で、Tracezip がシリアライズ前にデータ量を削減するため大幅に高速化する。gzip はシリアライズ後に適用されるため、圧縮不能フィールド(ID 等)の処理で CPU を浪費しスループット改善は限定的。
- **CPU**: Tracezip の CPU 利用率は非圧縮/gzip 設定の 20〜40%。
## 位置づけ
Tracezip はトレースサンプリングと**直交**する手法であり、サンプリングとの組み合わせが可能である。ヘッドベースサンプリングのカバレッジ低下や、テールベースサンプリングの収集オーバーヘッドを回避しつつ、より多くのリクエストをトレースできる。ログ圧縮(LogShrink、Logzip 等)のオフライン手法とも補完的で、バックエンドへの効率的な伝送後に適用できる。
## 関連
- 概念: [[分散トレーシング]] / [[テレメトリ]]
- エンティティ: [[OpenTelemetry]] / [[Train-Ticket]] / [[Zhuangbin Chen]] / [[Sun Yat-sen University]]
- 関連 MOC: [[SRE - MOC]]
## 出典
- [[@2025__ISSTA__Tracezip - Efficient Distributed Tracing via Trace Compression|本ページ]]
- 原本: [[.raw/papers/arxiv-2502.06318.pdf]]
- リポジトリ: https://github.com/OpsPAI/TraceZip