# Retroactive Sampling
## 定義
レトロアクティブサンプリング(retroactive sampling)は、[[トレースサンプリング|テールサンプリング]]の課題(中央コレクタでの大量メモリ・CPU・ネットワーク消費)を解決する分散トレーシングのサンプリング手法。**サンプリング判断に必要な最小属性のみ**を中央コレクタへ送信し、生スパンはエッジエージェント上の**オンディスク FIFO キュー**にバッファリング。採択決定後に必要なスパンだけを引き出してストレージへ転送する。
起源は NSDI 2023 論文 "The Benefit of Hindsight: Tracing Edge-Cases in Distributed Systems"(Lei Zhang ほか)。[[VictoriaMetrics]] の[[Zhu Jiekun]]が KubeCon EU 2026 でプロトタイプを発表した。
## テールサンプリングとの比較
| 軸 | テールサンプリング | レトロアクティブサンプリング |
|--|--|--|
| 中央コレクタへの転送 | 全スパン(1 KB+/件) | 最小属性のみ(**33 バイト**) |
| バッファ場所 | 中央コレクタのメモリ | エッジエージェントのディスク(FIFO) |
| 採択率 10% 時の不要転送 | 100% を転送→90% を破棄 | 10% のみ転送 |
| ネットワーク圧縮後削減 | 基準 | **70% 削減** |
| CPU 削減 | 基準 | **60–70% 削減** |
| メモリ削減 | 基準 | **60–70% 削減** |
| ディスク使用量 | 0(全量メモリ保持) | 1.7 GB(テールサンプリングの 4 GB メモリと交換) |
## 動作原理
### 最小属性の抽出と送信
サンプリング判断に必要な属性は最小限。エラーや高レイテンシを判断するには `trace_id` + `start_time` + `end_time` + `status_code` の 33 バイトで十分であり、フルスパン(1 KB 以上)の大部分は判断に不要である。
### オンディスク FIFO キューによるバッファリング
1. スパンのバッチをバイナリ形式にマーシャリングし、タイムスタンプ付きブロックとして FIFO キューへ書き込む
2. バックグラウンドワーカーがタイムスタンプヘッダを読みながら逐次消費する
3. 設定した保持期間(例: 1 分)を超えたスパンに対し、インメモリの trace_id ルックアップテーブルで採択フラグを確認する
4. 採択されたスパンはストレージへ転送し、非採択は破棄する
FIFO への逐次アクセスはランダム I/O を避けるため、Pebble(KVストア)ベースのディスク型テールサンプリングが CPU を 649% 増加させるのと対照的に、CPU コストを削減できる。
## 変形: ローカル + レトロアクティブサンプリング
サンプリング判断を集約必須型と非集約型に分類できる。非集約型(例: エンドポイント値による判断)はエージェントがローカルで判断し、採択 trace_id のみ中央へ伝達(1 バイト)する。これにより複雑な条件も追加帯域幅を最小に抑えて処理できる。
## Pebble ベースのディスク型テールサンプリングとの比較
OpenTelemetry コミュニティが提案した代替案。
| 手法 | メモリ変化 | CPU 変化 |
|--|--|--|
| Pebble ベースのディスク型テールサンプリング | 81% 削減 | **649% 増加** |
| レトロアクティブサンプリング(FIFO) | 60–70% 削減 | **60–70% 削減** |
Pebble ベースは KVストアの trace_id ランダムルックアップが CPU を爆発させる。FIFO 設計はランダム I/O を逐次 I/O に変換することでこれを回避する。
## 横断的知見
- **「計装側での削減」の具体実装**: [[Scaling Telemetry Workloads]] の設計指針「文脈豊富な両端で削減する」を、エージェント側でのサンプリング属性絞り込みとして具現化した。中央コレクタへの転送量を 90% 以上削減する。(Source: [[@2026__VictoriaMetrics Blog__KubeCon EU 2026 Retroactive Sampling]])
- **ディスク vs メモリのトレードオフは I/O パターンが支配する**: ランダム I/O(KVストア)は CPU を爆発させるが、逐次 I/O(FIFO)は CPU コストを維持したままメモリをディスクで代替できる。この知見はサンプリング以外のデータバッファリング設計にも一般化できる。(Source: [[@2026__VictoriaMetrics Blog__KubeCon EU 2026 Retroactive Sampling]])
## 未解決の問い
- [[トレースサンプリング]]の概念ページで示された TraStrainer の「ランタイム状態を加味したテールサンプリング」とレトロアクティブサンプリングを組み合わせた場合の効率・品質トレードオフは未検証
- エッジエージェントのディスク容量が制約となるシナリオ(組み込み・エッジコンピューティング)での適用可能性
- 採択率が極めて低い(< 1%)ケースで FIFO 保持期間の最適化がどこまで効くか
## 関連
- ソース: [[@2026__VictoriaMetrics Blog__KubeCon EU 2026 Retroactive Sampling]]
- 概念: [[トレースサンプリング]] / [[分散トレーシング]] / [[Scaling Telemetry Workloads]] / [[テレメトリ]]
- エンティティ: [[VictoriaMetrics]] / [[VictoriaTraces]] / [[Zhu Jiekun]] / [[OpenTelemetry]] / [[OpenTelemetry Demo]]
- 関連 MOC: [[SRE - MOC]]