トレース検索・分析ワークフロー - 問題特定とパフォーマンス分析
トレーシングツールで最も価値があるのは、収集したデータから問題を素早く特定し、原因分析を行える能力です。このセクションでは、Jaegerを例に、実務的なトレース検索・分析のワークフローを解説します。
Jaegerのトレース検索機能
Jaegerでは複数の方法でトレースを検索できます。効率的な検索戦略により、問題の根本原因を迅速に特定できます。
1. サービス・オペレーション名による検索
最も基本的で頻繁に使用される検索方法です。
検索フロー:
- Jaeger UIにアクセス(ローカル検証時は Jaeger のオールインワン構成で既定のポート 16686 を利用)
- 左側パネルの「Service」ドロップダウンからサービスを選択
- 「Operation」でサービス内の特定操作を指定
- 「Find Traces」で該当トレースを取得
活用例:
service: payment-service、operation: process_payment→ 決済処理全体のトレース取得service: order-service、operation: create_order→ 注文作成処理の流れを確認
2. タグ・アノテーションによる検索
より細かい条件指定が可能です。
検索フロー:
- 「Service」と「Operation」を指定
- 「Tags」セクションでキーバリューペアを入力
- 例:
http.status_code=500→ ステータスコード500のエラーのみ抽出
活用例:
error=true→ エラーが発生したトレースのみ抽出http.status_code=500→ サーバーエラーの特定user_id=12345→ 特定ユーザーのリクエストフロー追跡request_id=abc123def456→ 特定のリクエストID対応
3. タイムレンジと期間による検索
パフォーマンス低下の時間帯を特定するときに有効です。
検索フロー:
- 上部の「Lookback」で検索対象期間を指定(Last hour、Last day等)
- より精密な検索には「Start Time」「End Time」を手動設定
- 該当期間のトレースのみ抽出
活用例:
- システム障害が報告された時間帯のトレースを絞り込み
- 定期的なバッチ処理実行中のパフォーマンス変化を確認
- デプロイメント前後での性能差分を比較
エラートレースの効率的な抽出
本番環境では迅速なエラー対応が重要です。効率的にエラーを特定し、原因を分析するフローを解説します。
エラーフィルタリング
Step 1: サービス選択
↓
Step 2: 「Tags」で「error=true」を指定
↓
Step 3: 「Find Traces」でエラートレースのみ表示
↓
Step 4: 各トレースの詳細を確認(レイテンシ、エラーメッセージ等)詳細確認で見るべき情報:
- エラーメッセージ: 例外のメッセージテキスト
- スタックトレース: エラー発生箇所の特定
- 関連スパン: エラー前後の処理フロー
エラー率の時系列分析
Jaegerの集計ビューを活用して、エラーパターンを分析します。
分析フロー:
- サービス・操作を選択後、Jaegerが自動的にREDメトリクスを表示
- エラー率グラフをクリック → エラーが多く発生した時間帯の特定
- その時間帯のトレースをドリルダウン
見つかるパターン例:
- 定期的なエラーピーク → スケジュール処理の問題
- 急激なエラー増加 → 障害または不正なリリース
- 特定サービスのみエラー → そのサービスの障害
パフォーマンス分析のワークフロー
システムが遅い場合、どこがボトルネックなのかを特定することが重要です。
レイテンシ分析フロー
Step 1: サービス・操作を選択
↓
Step 2: タイムレンジで「Last hour」など指定
↓
Step 3: Jaegerが表示するメトリクスから「Duration」を確認
↓
Step 4: 高レイテンシトレースをソート・抽出
↓
Step 5: 遅いトレースの詳細を確認 → ボトルネックスパン特定スパン分析による原因特定
各トレースをクリックすると、サービス間の呼び出しフローが表示されます。
見方のポイント:
- スパン時間の長さ: 横軸の長さで相対的な処理時間を表示
- スパン名: サービス・オペレーション名から処理内容を判別
- スパン属性: カスタム属性で詳細な処理情報を確認
ボトルネック特定の例:
トレース詳細画面でこんなパターンが見えたら:
[1] API Gateway → payment-service 150ms
[1.1] Validate request 5ms
[1.2] Database query 120ms ← ここが遅い!
[1.3] Payment API call 20ms
[1.4] Response formatting 5ms
[2] Response return 5ms→ 1.2の「Database query」がボトルネックと特定。 → データベースクエリの最適化、インデックス追加等の対応を検討
階層分析
複数サービスにまたがるトレースでは、サービス別の処理時間を分析します。
見方:
request-id: abc123
Service A (Frontend) [==== 100ms ====]
└─ Service B (API) [ == 80ms == ]
└─ Service C (DB) [ = 60ms = ]
└─ Service D (Cache) [ = 15ms = ] ← 追加の外部呼び出し分析ポイント:
- Service A: 20ms(Service B開始まで待機)→ フロントエンド処理に余裕あり
- Service B: 5ms(Service Cへ送信まで)→ 処理コンパクト
- Service C: 60ms(最長)→ ボトルネック候補
- Service D: 15ms(並列呼び出し)→ Service Cと競争
実務的なトラブルシューティングシナリオ
シナリオ1:本番でのレイテンシ急増
状況: 一般ユーザーからの「画面が遅い」報告
対応フロー:
1. 時間帯の特定: 報告があった時刻の前後30分で検索
2. サービス選択: フロントエンド・APIサービスを中心に確認
3. 遅いトレース抽出: Duration > 1000ms で絞り込み
4. スパン分析: 各スパンの時間を確認
5. 外部依存確認: DB、外部API等の応答確認
6. 推定原因: キャッシュヒット率低下? DB接続プール枯渇?
7. 対応: スケーリング、キャッシュクリア等を実施シナリオ2:特定エンドポイントのエラー多発
状況: 特定のAPI操作でエラーが多い
対応フロー:
1. エラーフィルタ: service=api、operation=endpoint_X、error=true
2. エラー集約: 複数トレースのエラーメッセージを確認
3. パターン認識:
- 同じエラーメッセージが繰り返す → コード異常の可能性
- 異なるエラー → 外部サービスとの連携問題
4. リクエストパラメータ分析: 特定パラメータが共通?
5. 順序の確認: エラーは常に同じスパンで発生?
6. 推定原因: 入力バリデーション不足? 外部API制限?
7. 対応: コード修正、リトライロジック追加、等シナリオ3:メモリ使用量増加に伴うパフォーマンス低下
状況: 時間経過とともにレイテンシが増加
対応フロー:
1. 時系列分析: 複数時間のトレースを比較
- 1時間前: 平均Duration = 100ms
- 現在: 平均Duration = 500ms
2. メモリリーク推測: GCによる一時的なストール?
3. サービス別確認: 全サービスで低下? 特定サービス?
4. ガベージコレクション: ログを確認
5. メモリプロファイル: サービスのメモリ使用量を監視
6. 推定原因: メモリリーク、キャッシュ無制限増加
7. 対応: メモリプロファイリング、リスタート等トレース分析で見落としがちなポイント
1. エラートレースだけでなく、正常系も確認
エラーが発生している場合、正常系トレースと比較することで、差異を素早く特定できます。
2. 外部ネットワーク遅延を見落とさない
データベース、キャッシュ、外部API等への呼び出しは、アプリケーション内部処理より遥かに遅い傾向です。ネットワークレイテンシの最適化が効果的なことが多いです。
3. サンプリングの影響を考慮
高トラフィック環境ではサンプリング率が低い可能性があります。レアなエラーは検出漏れする可能性を意識してください。
4. タイムゾーン表示の確認
グラフの時間軸とトレースのタイムスタンプがずれていないか確認。特にマルチクラウド環境で注意が必要です。
トレース分析をより効率的にするコツ
タグ・アノテーションの活用
コード内でカスタムアノテーションを付与することで、検索精度が大幅に向上します。
実装側の工夫(言語例:Python):
with tracer.start_as_current_span("process_payment") as span:
span.set_attribute("user_id", user_id)
span.set_attribute("amount", amount)
span.set_attribute("currency", currency)
# 後でこれらアノテーション(タグ)で検索可能ダッシュボード化
Jaegerは見つけたトレースURLを保存できます。頻繁に確認するクエリはブックマークすると効率的です。
まとめ:トレース検索・分析スキルの習得
トレース分析スキルは経験で磨かれます。
初期段階:
- サービス名・操作名での基本検索
- エラーフィルタリング
- 処理時間の確認
中級段階:
- タグ検索による細かい条件指定
- スパン時間の詳細分析
- サービス間のレイテンシパターン認識
上級段階:
- 複雑なマイクロサービス環境での全体フロー把握
- パフォーマンスチューニングのボトルネック特定
- 本番環境での迅速な障害対応
定期的にトレースを眺めて、パターン認識能力を高めることが上達の近道です。
次の記事: アラート・通知設定 では、トレーシングデータを活用したプロアクティブな監視体制の構築を解説します。