エンジニア選書 OpenTelemetryではじめるテレメトリーサンプリング ――シグナルデータ膨張に対応しながらオブザーバビリティを確保する
- 山口能迪 著
- 定価
- 4,400円(本体4,000円+税10%)
- 発売日
- 2026.8.31
- 判型
- B5変形
- 頁数
- 448ページ
- ISBN
- 978-4-297-15813-2
サポート情報
概要
オブザーバビリティの重要性が高まる一方で、導入後に直面するテレメトリーデータの爆発的増加というジレンマを抱えたチーム、組織は多いのではないでしょうか。分散トレーシング、メトリクス、ログなどの計装が充実するほどデータ量は膨張し、ストレージコストの増大、分析基盤の複雑化、重要なシグナルの埋没といった問題が顕在化します。本書は、著者が約10年にわたり現場で見てきた問題意識を背景に、サンプリングを中心とした実践的なテレメトリーデータ管理の知見をまとめた1冊です。確率的サンプリングからテイルサンプリング、動的サンプリングまで、規模に応じた戦略を整理し、さらにトレース・ログ・メトリクス・プロファイルを含む全シグナル横断のアプローチも紹介します。OpenTelemetryを用いた実装、ガバナンスやFinOpsの観点も含め、テレメトリーサンプリングを包括的に理解できる内容となっています。
目次
[第1部]サンプリングの基礎
第1章 なぜサンプリングが必要なのか
- 1.1 オブザーバビリティとは
- 1.1.1 オブザーバビリティの定義
- 1.1.2 テレメトリーシグナルの4種類
- 1.1.3 現代のシステム運用におけるオブザーバビリティの重要性
- 1.2 オブザーバビリティのジレンマ
- 1.2.1 オブザーバビリティのジレンマがもたらす課題
- 1.2.2 テレメトリーシグナル別のコスト構成比
- 1.2.3 ジレンマの解決策としてのサンプリング
- 1.2.4 サンプリングの定義
- 1.3 テレメトリーデータ量の増加パターン
- 1.3.1 トラフィック量とテレメトリーデータ量の関係
- 1.3.2 スタートアップの成長に伴うデータ量推移
- 1.3.3 マイクロサービス数とデータ量の相関
- 1.4 サンプリングの基準
- 1.5 サンプリングの限界とリスク
- 1.5.1 希少イベントの消失問題
- 1.5.2 因果関係の断絶
- 1.5.3 統計的バイアスの蓄積
- 1.5.4 運用複雑性の増大
- 1.5.5 「サンプリングしない」という選択肢
- 1.6 サンプリング意思決定フレームワーク
- 1.6.1 ステップ1:サンプリングが必要か
- 1.6.2 ステップ2:どのシグナルを対象にするか
- 1.6.3 ステップ3:どの手法を適用するか
- 1.6.4 ステップ4:サンプリング率をいくつにするか
- 1.6.5 サンプリング未導入のリスク事例
- 1.7 まとめ
第2章 サンプリングの基本用語と2つの主要アプローチ
- 2.1 用語の整理
- 2.2 分散トレースの仕組みとサンプリング戦略の関係
- 2.2.1 トレースはスパンの集合であり、それ自体に実体はない
- 2.2.2 トレースIDの決定とコンテキストの伝搬
- 2.2.3 スパンは独立にエクスポートされる
- 2.3 ヘッドサンプリング
- 2.3.1 確率的サンプリングの統計学的基礎
- 2.4 テイルサンプリング
- 2.4.1 テイルサンプリングの判定条件
- 2.5 サンプリング率の計算と決定基準
- 2.5.1 基本計算式
- 2.5.2 トラフィック量に基づく推奨サンプリング率
- 2.5.3 エラー率に基づくサンプリング率調整
- 2.5.4 コスト制約からの逆算
- 2.5.5 統計的精度とサンプリング率のトレードオフ
- 2.5.6 最小サンプル数の導出方法
- 2.6 サンプリング手法の比較
- 2.6.1 推奨適用シーン
- 2.7 まとめ
[第2部]実装とアーキテクチャ
第3章 OpenTelemetryでの実装とアーキテクチャ
- 3.1 本章で使用するバージョン
- 3.2 SDKとコレクターの役割
- 3.3 SDKによるサンプリング実装例
- 3.3.1 Python
- 3.3.2 Go
- 3.3.3 Java
- 3.3.4 言語別サンプリング環境変数対応状況
- 3.3.5 主要フレームワークの計装対応状況
- 3.4 テイルサンプリングの実践的設計
- 3.4.1 ゲートウェイ層(トラフィックの集約)
- 3.4.2 仕分け層(load_balancingエクスポーター)
- 3.4.3 判定層(tail_samplingプロセッサー)
- 3.5 OpenTelemetry Collectorとは
- 3.5.1 Collectorの内部構造
- 3.6 サンプリング関連のCollectorコンポーネント
- 3.6.1 tail_samplingプロセッサー
- 3.6.2 probabilistic_samplerプロセッサー
- 3.6.3 load_balancingエクスポーター
- 3.6.4 span_metricsコネクター
- 3.6.5 signal_to_metricsコネクター
- 3.6.6 filterプロセッサー
- 3.6.7 countコネクター
- 3.7 サンプリング導入のアーキテクチャパターン
- 3.7.1 パターン1:SDKのみのヘッドサンプリング
- 3.7.2 パターン2:3層構造によるテイルサンプリング
- 3.7.3 パターンの選択指針
- 3.8 アーキテクチャパターン別のサンプリング課題
- 3.8.1 イベント駆動アーキテクチャ
- 3.8.2 サーバーレスアーキテクチャ
- 3.8.3 バッチ処理・CronJob
- 3.8.4 GraphQL API
- 3.8.5 gRPCストリーミング
- 3.9 デバッグ用サンプリングバイパス
- 3.9.1 カスタムサンプラーによるバイパス実装
- 3.9.2 Collector側でのバイパス設定
- 3.10 サンプリング処理のパフォーマンスチューニング
- 3.10.1 decision_waitとnum_tracesの設定
- 3.10.2 メモリ見積もり方法
- 3.10.3 スケーリング戦略
- 3.11 まとめ
第4章 高度な戦略:動的サンプリングとアグリゲーション
- 4.1 動的サンプリング(Adaptive Sampling)
- 4.1.1 動的サンプリングアルゴリズムの詳細
- 4.2 動的サンプリングのデメリット
- 4.2.1 設定の複雑性
- 4.2.2 統計量復元の困難さ
- 4.2.3 コールドスタート問題
- 4.2.4 運用コストの増大
- 4.3 コンテキストベースサンプリング
- 4.3.1 リクエストコンテキストベースサンプリング
- 4.3.2 ユーザーコンテキストベースサンプリング
- 4.3.3 ビジネスコンテキストベースサンプリング
- 4.3.4 Baggage APIによるコンテキスト属性の伝搬
- 4.3.5 ユースケースと実装ガイド
- 4.4 複数段階サンプリング
- 4.4.1 アーキテクチャと利点
- 4.4.2 段階的フィルタリング戦略
- 4.4.3 実装例
- 4.4.4 パフォーマンス特性とトレードオフ
- 4.5 統合サンプリング戦略
- 4.5.1 手法の組み合わせ方
- 4.5.2 戦略選択のガイドライン
- 4.5.3 統合実装例
- 4.5.4 段階的導入ガイド
- 4.5.5 トラブルシューティング
- 4.6 アグリゲーション(集約)
- 4.6.1 生トレースを捨てる代わりにメトリクス化する
- 4.6.2 span_metricsコネクターの設定例
- 4.7 統計量復元の数式と計算例
- 4.7.1 基本原理:重み付けによる復元
- 4.7.2 具体的な計算例
- 4.7.3 動的サンプリング環境での復元
- 4.7.4 adjusted_countによる統計量復元の自動化
- 4.7.5 サンプリング前後の統計量比較
- 4.8 サンプリング環境下での4大シグナル(Four Golden Signals)の監視
- 4.8.1 レイテンシー(Latency)
- 4.8.2 トラフィック(Traffic)
- 4.8.3 エラー(Errors)
- 4.8.4 サチュレーション(Saturation)
- 4.8.5 エグゼンプラーによるメトリクスからトレースへのナビゲーション
- 4.8.6 サンプリングのSLOへの影響計算
- 4.8.7 サンプリング導入前後のダッシュボード設定の違い
- 4.9 オブザーバビリティSaaSベンダーのサンプリング機能
- 4.9.1 AWS X-Ray Sampling Rules
- 4.9.2 Grafana Cloud Adaptive Traces / Adaptive Metrics
- 4.9.3 Honeycomb Refinery
- 4.9.4 Datadogのサンプリング機能
- 4.9.5 Dynatrace Adaptive Traffic Management
- 4.9.6 New Relic Infinite Tracing
- 4.9.7 Elastic APM Server Tail-based Sampling
- 4.9.8 自前実装vs. ベンダーソリューションの判断基準
- 4.10 テレメトリーパイプラインツールとの比較
- 4.11 サンプリング実装の検証方法
- 4.11.1 telemetrygenによるサンプリング検証
- 4.12 まとめ
[第3部]シグナル別サンプリング戦略
第5章 メトリクスのダウンサンプリング
- 5.1 メトリクスのデータ量増大の要因
- 5.1.1 カーディナリティの爆発
- 5.1.2 スクレイプ間隔と解像度
- 5.1.3 リテンション期間の長期化
- 5.2 ダウンサンプリングの定義と原理
- 5.2.1 ダウンサンプリングとは
- 5.2.2 トレースサンプリングとの違い
- 5.2.3 集約関数とメトリクスタイプ
- 5.3 ダウンサンプリングの実装パターン
- 5.3.1 パターン1:ストレージ層でのダウンサンプリング
- 5.3.2 パターン2:Collector パイプラインでのダウンサンプリング
- 5.3.3 パターン3:クエリ時のダウンサンプリング
- 5.4 カーディナリティ削減
- 5.4.1 不要なラベルの除去
- 5.4.2 メトリクスのフィルタリング
- 5.4.3 PrometheusのRecording Rulesによる事前集約
- 5.5 ダウンサンプリングの限界
- 5.5.1 短時間スパイクの消失
- 5.5.2 パーセンタイルの精度低下
- 5.5.3 ストレージ容量の一時的増加
- 5.5.4 クエリの複雑化
- 5.6 ダウンサンプリング戦略の設計
- 5.6.1 段階的リテンションモデル
- 5.6.2 コスト試算
- 5.6.3 ダウンサンプリングとアラートの関係
- 5.7 OpenTelemetryエコシステムにおけるメトリクスダウンサンプリング
- 5.7.1 Aggregation Temporalityとダウンサンプリング
- 5.7.2 span_metricsコネクターとの関係
- 5.8 トレースサンプリングとメトリクスダウンサンプリングの統合
- 5.8.1 統合戦略の全体像
- 5.8.2 シグナル間の整合性
- 5.9 まとめ
第6章 ログとプロファイルのサンプリング
- 6.1 ログサンプリングの必要性
- 6.1.1 トレースサンプリングとの根本的な違い
- 6.1.2 ログデータ量の増大パターン
- 6.2 ログサンプリングの限界とリスク
- 6.2.1 トレースとの相関の喪失
- 6.2.2 監査ログの誤サンプリング
- 6.2.3 ログの順序性の問題
- 6.2.4 動的ログレベル変更の副作用
- 6.3 アプリケーション側でのログレベル制御
- 6.3.1 静的ログレベル設定と環境別戦略
- 6.3.2 動的ログレベル変更
- 6.3.3 トレース連動ログサンプリング
- 6.4 パイプライン側でのログサンプリング
- 6.4.1 Severityベースの重み付けサンプリング
- 6.4.2 ログからメトリクスへの変換
- 6.4.3 ログの構造化とサンプリング精度の関係
- 6.5 AI/LLMワークロードのテレメトリーサンプリング
- 6.5.1 LLMテレメトリーの特徴
- 6.5.2 LLMテレメトリーのサンプリング戦略
- 6.5.3 プロンプト/レスポンスのPII問題
- 6.6 プロファイルのサンプリング
- 6.6.1 継続的プロファイリングとサンプリングの関係
- 6.6.2 サンプリング頻度とオーバーヘッドの定量的関係
- 6.7 まとめ
[第4部]サンプリングの運用と実践
第7章 テレメトリーパイプラインの運用と実践
- 7.1 テレメトリーパイプラインの活用
- 7.2 PII除去の実装方法
- 7.2.1 属性の削除
- 7.2.2 正規表現を使用したマスキング
- 7.2.3 PII検出パターン
- 7.2.4 パイプラインへの組み込み
- 7.2.5 PII除去のためのフレームワークとツール
- 7.3 サンプリングパイプラインのテスト戦略
- 7.3.1 設定ファイルの静的検証
- 7.3.2 サンプリングポリシーの単体テスト
- 7.3.3 カナリアデプロイによる段階的検証
- 7.3.4 サンプリング設定のGitOps管理
- 7.4 サンプリングパイプラインの運用
- 7.4.1 運用上の注意点
- 7.4.2 モニタリング項目一覧
- 7.4.3 メトリクスの取得方法
- 7.4.4 アラート設定の推奨ルール
- 7.5 まとめ
第8章 サンプリングのためのテレメトリーデータ運用管理
- 8.1 テレメトリーデータのライフサイクルとサンプリングの位置づけ
- 8.1.1 データライフサイクルの各フェーズ
- 8.1.2 保存フェーズにおけるサンプリングの影響
- 8.1.3 分析フェーズにおけるサンプリングの影響
- 8.1.4 廃棄フェーズにおけるサンプリングの影響
- 8.2 オブザーバビリティデータ基盤の構成要素
- 8.2.1 データ基盤の全体像
- 8.2.2 インジェスト層
- 8.2.3 ストレージエンジン
- 8.2.4 クエリエンジン
- 8.2.5 コンパクション/ダウンサンプリング層
- 8.2.6 段階的ストレージ管理
- 8.2.7 シグナル別バックエンドアーキテクチャの比較
- 8.3 オブザーバビリティバックエンドとサンプリング
- 8.3.1 バックエンドに求められる機能特性
- 8.3.2 機能特性に基づくバックエンド比較
- 8.3.3 バックエンド側サンプリング機能の実装パターン
- 8.3.4 バックエンド選定の判断基準
- 8.4 ストレージアーキテクチャとサンプリングの影響
- 8.4.1 ストレージアーキテクチャの設計指針
- 8.4.2 シグナル別ストレージ特性とサンプリングの関係
- 8.4.3 サンプリング率とリテンション期間のトレードオフ
- 8.5 サンプリング済みデータのクエリと分析
- 8.5.1 サンプリング済みデータのクエリで発生し得る問題
- 8.5.2 adjusted_countを用いた統計量復元のクエリ例
- 8.5.3 エグゼンプラーを活用したメトリクス→トレースのドリルダウン
- 8.6 サンプリングとオブザーバビリティの品質指標
- 8.6.1 品質評価の3つの観点
- 8.6.2 実運用での品質モニタリング指標
- 8.6.3 品質モニタリングのPromQLクエリ例
- 8.6.4 ダッシュボード設計の指針
- 8.6.5 品質低下時の対処フロー
- 8.7 重要度ベースのデータ分類とサンプリング率の差別化
- 8.7.1 重要度分類の枠組み
- 8.7.2 重要度分類の判断基準
- 8.7.3 データルーティングの設計パターン
- 8.7.4 重要度分類の実装における注意点
- 8.8 まとめ
第9章 サンプリングのガバナンスとコンプライアンス
- 9.1 データの機密性とサンプリングの順序設計
- 9.1.1 PII除去とサンプリングの前後関係
- 9.1.2 コンプライアンス要件別のパイプライン設計
- 9.1.3 サンプリング除外リスト(ホワイトリスト)の設計
- 9.2 マルチテナント環境でのサンプリング公平性
- 9.2.1 ノイジーネイバー問題とテレメトリーデータ
- 9.2.2 テナントごとのサンプリング率制御
- 9.2.3 クォータ管理とレートリミッティング
- 9.3 サンプリングの組織的課題
- 9.3.1 チーム間のサンプリング率の不整合
- 9.3.2 サンプリングポリシーのオーナーシップ
- 9.3.3 データレジデンシーとサンプリング
- 9.4 まとめ
第10章 テレメトリーFinOpsとサンプリングポリシーのライフサイクル
- 10.1 テレメトリーコストの可視化と帰属
- 10.1.1 コスト帰属(Cost Attribution)の仕組み
- 10.1.2 コスト可視化ダッシュボードの構築
- 10.1.3 経営層向けROI説明の構成
- 10.2 サンプリングポリシーの継続的見直し
- 10.2.1 見直しトリガーの定義
- 10.2.2 定期レビューサイクルの確立
- 10.2.3 OpAMPによるサンプリング設定のリモート管理
- 10.3 「データが消える」不安への対処
- 10.3.1 開発者の懸念に対する論理的回答
- 10.3.2 デバッグ用サンプリングバイパスの3レベル設計
- 10.3.3 サンプリング導入の社内コミュニケーション
- 10.4 サンプリング成熟度モデル
- 10.4.1 各レベルの詳細
- 10.5 まとめ
第11章 サンプリングの事例
- 11.1 Uber:適応型サンプリングによる大規模トレース管理(2019年)
- 11.1.1 背景と課題
- 11.1.2 採用したサンプリング戦略
- 11.1.3 導入効果
- 11.1.4 導入時の課題と解決方法
- 11.2 Slack:因果グラフモデルによるトレーシングとサンプリング(2020年)
- 11.2.1 背景と課題
- 11.2.2 採用したサンプリング戦略
- 11.2.3 導入効果
- 11.2.4 導入時の課題と解決方法
- 11.3 Canva:OpenTelemetryによるエンドツーエンドトレーシングの構築(2021年)
- 11.3.1 背景と課題
- 11.3.2 採用したサンプリング戦略
- 11.3.3 導入効果
- 11.3.4 導入時の課題と解決方法
- 11.4 DoorDash: OpenTelemetry のスパンプロセッサー最適化(2021年)
- 11.4.1 背景と課題
- 11.4.2 採用した最適化戦略
- 11.4.3 導入効果
- 11.4.4 導入時の課題と解決方法
- 11.5 Intercom: Honeycomb Refinery による動的サンプリングの導入(2022年)
- 11.5.1 背景と課題
- 11.5.2 採用したサンプリング戦略
- 11.5.3 導入効果
- 11.5.4 導入時の課題と解決方法
- 11.6 Skyscanner:OpenTelemetryによるテレメトリーコスト90%削減(2025年)
- 11.6.1 背景と課題
- 11.6.2 採用したサンプリング戦略
- 11.6.3 導入効果
- 11.6.4 導入時の課題と解決方法
- 11.7 AuditBoard:マネージドテイルサンプリングによるトレースコスト最適化(2025年)
- 11.7.1 背景と課題
- 11.7.2 採用したサンプリング戦略
- 11.7.3 導入効果
- 11.7.4 導入時の課題と解決方法
- 11.8 Cloudflare:大規模Prometheusにおけるカーディナリティ管理(2023年)
- 11.8.1 背景と課題
- 11.8.2 採用したカーディナリティ管理戦略
- 11.8.3 導入効果
- 11.8.4 導入時の課題と解決方法
- 11.9 Stripe: Amazon Managed Service for Prometheusへの大規模メトリクス移行(2024年)
- 11.9.1 背景と課題
- 11.9.2 採用した移行・最適化戦略
- 11.9.3 導入効果
- 11.9.4 導入時の課題と解決方法
- 11.10 ログサンプリングとコスト最適化の事例
- 11.10.1 Expanso:ログパイプライン最適化によるSplunkコスト削減
- 11.10.2 業界動向:オブザーバビリティコストの構造的課題
- 11.11 プロファイルのサンプリングの事例
- 11.11.1 Grafana Labs:プロファイリングのオーバーヘッド実測(2026年)
- 11.11.2 Pixie:eBPFプロファイラーの最適化(2021年)
- 11.12 サンプリング導入の失敗パターン
- 11.12.1 失敗パターン1:ConfigMap 更新時の設定ミスによるデータ消失
- 11.12.2 失敗パターン2:テイルサンプリングのOOMによるデータロスト
- 11.12.3 失敗パターン3:span_metrics配置ミスによるメトリクス不整合
- 11.13 サンプリングのアンチパターン集
- 11.14 事例の横断的分析
- 11.14.1 事例から得られる教訓
- 11.15 まとめ
付録A サンプリング導入のチェックリスト
- A.1 サンプリング導入の判断フロー
- A.2 推奨されるリテンションとストレージ設計
- A.3 サンプリング率の推奨値
- A.3.1 システム規模別の推奨サンプリング率
- A.3.2 トラフィック量に基づく推奨サンプリング率
- A.3.3 エンドポイント種別ごとの推奨サンプリング率
- A.3.4 環境別の推奨サンプリング率
- A.3.5 最小サンプル数の早見表
- A.4 移行計画テンプレート
- A.4.1 フェーズ1:準備(推奨期間:1〜2週間)
- A.4.2 フェーズ2:テスト(推奨期間:1〜2週間)
- A.4.3 フェーズ3:段階的展開(推奨期間:2〜4週間)
- A.4.4 フェーズ4:完全移行(推奨期間:1〜2週間)
付録B トラブルシューティングガイド
- B.1 問題1:Collectorのメモリ枯渇(OOMKill)
- B.2 問題2:スパンがバックエンドに届かない
- B.3 問題3:サンプリング率が意図した値と異なる
- B.4 問題4:分散トレースが不完全(スパンの欠落)
- B.5 問題5:テイルサンプリングのレイテンシーが大きい
- B.6 問題6:エラートレースがサンプリングで除外される
- B.7 問題7:load_balancing エクスポーターでトレースが分散してしまう
- B.8 問題8:span_metricsコネクターのメトリクスが不正確
- B.9 問題9:サンプリング設定の変更が反映されない
- B.10 問題10:SDKのサンプリング設定が環境変数で上書きされる
- B.11 問題11:probabilistic_sampler・tail_samplingプロセッサーの競合
- B.12 問題12:ログのSeverityフィルタリングが意図どおりに動作しない
- B.13 問題13:トレース連動ログサンプリングでログが全量破棄される
付録C サンプリングの将来展望
- C.1 Consistent Probability Samplingの標準化
- C.1.1 背景:TraceIdRatioBasedサンプラーの課題
- C.1.2 W3C Trace Context Level 2との連携
- C.1.3 仕組みの詳細
- C.1.4 一貫性の保証
- C.1.5 標準化の現状
- C.2 signal_to_metrics コネクターによるシグナル横断的なメトリクス生成
- C.2.1 span_metrics コネクターの限界とsignal_to_metricsの登場
- C.3 エッジコンピューティング・IoTでのサンプリング
- C.3.1 エッジ環境固有の制約
- C.3.2 エッジ向けサンプリング戦略
- C.3.3 軽量Collectorの動向
- C.4 AIを活用したインテリジェントサンプリング
- C.4.1 ルールベースサンプリングの限界
- C.4.2 Grafana Adaptive Tracesの先行事例
- C.4.3 フィードバックループ問題
- C.4.4 今後の展望
付録D 統合設定例
- D.1 コンテキストベースサンプリング統合設定
- D.2 統合サンプリング戦略の設定
- D.2.1 SDK側の設定(第1段階)
- D.2.2 Collector側の設定(第2段階)
プロフィール
山口能迪
Grafana Labs所属のスタッフデベロッパーアドボケイト。 OpenTelemetryやGoのコミュニティの支援も活発に行っている。 『入門OpenTelemetry』『SREをはじめよう』『効率的なGo』『SLOサービスレベル目標』『オブザーバビリティ・エンジニアリング』(オライリー・ジャパン)、『実践プロパティベーステスト』(ラムダノート)翻訳、『SREの探求』(オライリー・ジャパン)監訳をはじめ、技術書の翻訳に多数関わる。
