分散トレーシング
導入前の課題
- マイクロサービスアーキテクチャが拡大した際にサービス同士の依存関係を把握するのに時間がかかる
- 分散サービスが肥大化するごとに障害が発生した際の特定やデバッグが困難になる
分散トレーシングとは
- サービス間通信を追跡して情報収集を行うこと
- サービス間に跨った障害解析
- 複雑なサービスの呼び出し関係の把握
- パフォーマンスのボトルネックの特定
OpenTracing
分散トレーシングの標準仕様規格
- トレース情報のデータフォーマット
- データ収集用バックエンドのためのAPI仕様
OpenCensus
- メトリック収集および分散トレーシングを行うためのライブラリ集
- Google社が社内で利用しているメトリック収集およびトレーシングのライブラリ集であるCensusのオープンソース実装
- データを収集するところまでの役割を持っていて、グラフ化したり分析したりするのは他のトレーシング/モニタリングサービスの役割
OpenTelemetry
-
CNCF Incubating Project
-
上記の OpenTracing と OpenCensus マージプロジェクトであり、各々の正式な後継版
トレース情報の概念モデル
- トレース
- スパン
- スパンコンテキスト
トレース
- 連鎖的に実行される一連のサービスの呼び出しを追跡して記録したトレース情報
- 階層構造を持ったスパンの集合体
スパン
- 個々のサービスがリクエストを受け、それに応答するまでの単位
スパンコンテキスト
- 複数のスパンを連鎖的なサービス呼び出しとして関連づけるための識別子となる情報
- サービスからサービスを呼び出す際にスパンコンテキストを伝播させることによって複数のスパンを関連づけられる
Jaeger
- OpenTelemetry 互換の分散トレーシングシステム
- CNCF Graduated (最も成熟したレベル)
- Jaeger | Cloud Native Computing Foundation
開発元
- Uber
影響を受けたサービス
- Google Dapper
- Zipkin
仕様
- スパンの生成は各アプリケーション内で行う
- Istioを使っている場合はistio-proxy(Envoy)がJaeger-collectorにスパンの送信を行う
Architecture
istio が導入されている場合
- istio-proxy が jaeger collector にスパン情報を送付する
- アプリケーションの改変を最小限に抑えることができる
- アプリケーションの改変をゼロにすることはできない
- スパンコンテキストを伝播するための情報を他のサービス呼び出しの際にリクエストヘッダに付与する作業
- カスタムヘッダ
x-request-id
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
x-ot-span-context
- Ingress-Gateway を通して流入したリクエストには Header 情報が付与されている