brpc分散型トレーシングの可視化ガイド:Jaeger UIを活用したRPC呼び出しチェーンの詳細分析
brpcはC++言語を使用した産業級RPCフレームワークで、検索、ストレージ、機械学習、広告、レコメンデーションなど、高性能システムで広く利用されています。"brpc"は"better RPC"を意味します。プロジェクトアドレス: https://gitcode.com/gh_mirrors/brpc3/brpc
本稿では、brpcの分散型トレーシングシステムの設定方法を詳しく解説し、可視化ツールを活用してRPC呼び出しチェーンを詳細に分析する方法を紹介します。これにより、パフォーマンスボトルネックやシステム問題を迅速に特定する助けとなります。
brpc分散型トレーシングシステム概要
brpcには完全な分散型トレーシングシステムが内蔵されており、/rpczインターフェースを通じてリアルタイムのリクエスト追跡機能を提供します。このシステムはspanとtraceの概念に基づいており、分散システム全体でのリクエストの流れを記録できます。従来のログシステムとは異なり、brpcのトレーシングシステムは全体システムの遅延分布をグローバルな視点で表示し、開発者が複雑なマイクロサービス間の呼び出し関係を理解するのを助けます。
brpc分散型トレーシングの有効化
デフォルトでは、brpcのトレーシング機能は無効になっています。以下の方法で有効化できます:
- 起動時に有効化:起動コマンドに
-enable_rpczオプションを追加 - 動的有効化:
SERVER_URL/rpcz/enableにアクセスして動的に有効化 - 設定ファイルでの設定:設定ファイルで関連パラメータを設定
主な設定パラメータは以下の通りです:
rpcz_database_dir:トレーシングデータの保存ディレクトリ(デフォルト:./rpc_data/rpcz)rpcz_keep_span_seconds:spanの保持時間(デフォルト:3600秒=1時間)rpcz_save_span_min_latency_us:保存する最小遅延のマイクロ秒閾値(この値より低いspanは保存されません)
トレーシングデータの可視化分析
第一層:リクエスト概要
/rpczにアクセスすると、最新リクエストの概要を確認できます:
- リクエストのタイムスタンプと遅延時間
- リクエストとレスポンスのバイト数
- Trace IDとSpan ID
- サービスメソッド名
第二層:詳細なトレーシング情報
任意のtraceまたはspanリンクをクリックすると、詳細情報を確認できます:
- タイムラインビュー:リクエストの各段階での滞在時間を表示
- 呼び出し関係図:サービス間の呼び出し階層を表示
- パフォーマンス指標:QPS、遅延分布、エラーレートなどを含む
TRACEPRINTFを使用したカスタムコメントの追加
brpcはTRACEPRINTFマクロを提供しており、コードにカスタムコメントをトレーシングデータに挿入できます:
TRACEPRINTF("ユーザーリクエスト処理開始、ユーザーID:%d", user_id);
// 業務ロジックの実行
TRACEPRINTF("データベースクエリ開始、所要時間:%dms", db_latency);
// より多くの業務ロジック
TRACEPRINTF("リクエスト処理完了、総所要時間:%dms", total_time);
これらのコメントは発生時間順に対応するリクエストのrpczに挿入され、リクエストレベルの詳細ログを形成します。これにより、リクエストの各段階での処理状況を理解するのに役立ちます。
スレッド間でのトレーシングコンテキストの伝播
サーバーリクエストを処理する際に、子bthreadを作成してRPC呼び出しを行う場合、デフォルトではトレーシングコンテキストが切断されます。トレーシングの連続性を維持するために、BTHREAD_INHERIT_SPANフラグを使用できます:
bthread_attr_t attr = { BTHREAD_STACKTYPE_NORMAL, BTHREAD_INHERIT_SPAN, NULL };
bthread_start_urgent(&tid, &attr, thread_proc, arg);
これにより、子bthread内のRPC呼び出しは元のリクエストに関連付けられ、完全なトレーシングチェーンを維持します。
パフォーマンス監視とアラート
brpcのトレーシングシステムはデバッグだけでなく、パフォーマンス監視にも使用できます:
主要監視指標
- QPS(毎秒クエリ数):サービスのスループットを監視
- 遅延分布:P50、P90、P99などのパーセンタイル遅延を把握
- エラーレート:サービスの異常を迅速に検知
- 接続状態:ネットワーク接続の健全性を監視
ベストプラクティスと最適化の提案
1. 適切なサンプリングレートの設定
高QPSシステムでは、適切なサンプリングレートの設定を推奨します:
- 低トラフィックシステム:すべてのリクエストを記録
- 高トラフィックシステム:ストレージの負荷を避けるために適切なサンプリングレートを設定
2. ストレージ設定の最適化
ビジネス要件に応じてストレージパラメータを調整します:
rpcz_keep_span_secondsを調整してデータ保持期間を制御rpcz_database_dirを高性能ストレージデバイスに設定- 定期的に古いデータをクリーンアップ
3. その他の監視ツールとの連携
brpcのトレーシングデータを以下のツールと組み合わせます:
- Prometheus:指標収集とアラート用
- Grafana:データ可視化用
- ELK Stack:ログ分析と検索用
トラブルシューティングの実践ケーススタディ
ケース1:高遅延リクエストの分析
トレーシングシステムにより、特定インターフェースのP99遅延が異常に上昇していることが判明した場合:
- そのインターフェースのspan詳細を確認
- 呼び出しチェーン上の各要素の所要時間を分析
- データベースクエリがボトルネックであることを特定
- クエリ文の最適化またはキャッシュの追加
ケース2:サービス間呼び出しの失敗
サービスAがサービスBを頻繁に呼び出す際に失敗が発生する場合:
- 失敗したリクエストのtrace情報を確認
- ネットワーク接続状態を分析
- サービスBの健全性をチェック
- 負荷分散戦略を調整