👣

AWS X-Ray を 1 から実践で使えるようになるまで

2023/10/25に公開

AWS X-Ray とは

マイクロサービスの課題

障害発生時の原因究明

  • 多くの場合、マイクロサービスごとにチームが異なったり使用されている技術が違うため、ログが分散したり、それぞれ独自のフォーマットで出力されていたりする
  • 多数の多様なサービスが依存し合うためエラーがどこで発生しているのか分かりづらい

パフォーマンス分析が難しい

  • 日々変化するサービス間の依存関係により、ボトルネックのサービスはどこなのか分かりづらい

AWS X-Ray の概要

アプリケーションやその基盤となるサービスの実行状況を把握し、パフォーマンスの問題やトラブルシューティングのヒントに役立つ。

リクエスト実行状況の確認

アプリケーションを構成する個々のサービスやリソースの実行結果ステータスを集計し、アプリケーションの実行状況を End-to-End で確認可能。
マイクロサービス間の依存関係を可視化可能。

アプリケーションの問題の検出

アプリケーションの実行状況についての関連する情報を収集し、問題の根本原因を調査可能。

アプリケーションのパフォーマンス向上

サービスやリソースの関係をリアルタイムで表示し、レイテンシ増加やパフォーマンス低下などのボトルネックを特定可能。

AWS X-Ray の概念

セグメント

動作に関するデータ。アプリケーションロジックを実行しているコンピューティングリソースはセグメントを送信する。セグメントには、リソース名、リクエストの詳細、行なった作業の詳細が含まれる。

  • ホスト: ホスト名、エイリアス、または IP アドレス
  • リクエスト: メソッド、クライアントアドレス、パス、ユーザーエージェント
  • レスポンス: ステータス、コンテンツ
  • 行った作業: 開始および終了時刻、サブセグメント

サブセグメント

完了した作業、呼び出しに関する追加のデータ。サブセグメントには、詳細なタイミング情報や、アプリケーションが実行したダウンストリーム呼び出しに関する詳細。具体的には外部 HTTP API、SQL データベースに対する呼び出しに関する詳細。

トレース

1 つのリクエストで生成されたセグメントを収集したもの。

どのようにトレースが含むセグメントを管理しているか?

トレース ID によりトレースは複数セグメントを管理している。セグメントは 1 つのトレース ID を保持している。トレース ID はリクエストを追跡するための ID で、リクエストごとに一意である。基本的に最初にセグメントを生成するタイミングで生成する。

セグメントのつながり・順序はどう管理している?

セグメント ID によりセグメント同士の順序を管理している。セグメント ID はトレース内のセグメントに対して一意に決まる。親セグメント ID によってセグメントのつながり・順序が決まる。

トレース ID やセグメント ID どう伝搬している?

トレースヘッダーにより各セグメントにトレース ID、セグメント ID を伝搬している。トレースヘッダーとは、トレース ID(Root)、親セグメント ID(Parent)、サンプリングディシジョン(Sampled)が定義された HTTP ヘッダー。

注釈

検索しやすくするためにセグメントに情報を追加可能。フィルタ式で使用するためインデックス化されたキーと値のペア。

"aws:api_stage": "prod"

メタデータ

デバッグや分析のためにセグメントに情報を追加可能。任意のタイプの値を保つことができるキーと値のペア。
※ フィルタ式で使用するためのインデックスは作成されない。

"game": {
  "id": "abcde",
  "session": "xxxyyyyzzz",
  ...
}

サンプリング

AWS X-Ray ではサンプリングルールに従い記録されるリクエストが決まる。

  • デフォルトのサンプリングルール
    • 1秒ごとに最初のリクエストは必ずトレースされる
    • それ以降のリクエストについては全体の5%がトレースされる
  • なぜサンプリングが必要なのか?
    • 課金額のコントロール(トレース数によって課金されるため)
    • アプリケーションパフォーマンスへの影響

サンプリングルール

  • リザーバサイズ: 1秒間で必ず記録するトレース数(デフォルトは1)
  • 固定レート: リザーバサイズを超えたリクエスト数のうち何%を記録するか(デフォルトは5%)

例) リザーバサイズ=50 & 固定レート=10%を設定し、1秒あたり100件のリクエストがルールに一致する場合

50(リザーバーサイズ) + 50 × 0.1(固定レート) = 55リクエスト

AWS X-Ray のデータ収集の仕組み

  1. アプリケーションに組み込まれた AWS X-Ray SDK が作成したセグメントデータを X-Ray デーモンに送信
  2. X-Ray デーモンはセグメントデータをバッファリングし、X-Ray API に定期的に転送
  3. X-Ray API では収集されたセグメントデータからトレースを作成
  4. トレースを AWS X-Ray コンソールで可視化、分析・デバッグを行う

(X-Ray SDK を使わずに AWS CLI などを使用して直接 X-Ray API とデータのやり取りをすることも可能)

アプリケーション分析

自分が AWS X-Ray を利用してトラブルシューティングやパフォーマンス分析する方法についてご紹介します。

CloudWatch ServiceLens

CloudWatch ServiceLens は、Amazon CloudWatch と AWS X-Ray を統合することで、トレース、メトリクス、ログ、アラーム、およびリソース情報を 1 か所に集約して、サービスとアプリケーションの監視性を強化します。また、アプリケーションのエンドツーエンドのビューを提供し、パフォーマンスのボトルネックをより効率的に特定して、影響を受けるユーザーを特定するのに役立ちます。

CloudWatch ServiceLens を AWS Console で開くとサービスマップが表示されるため、問題が生じているサービスや分析したいアプリケーションを検索する。そこでサービスを選択するとログを確認出来たり、一つ一つの詳細なトレースを追いたい場合は「トレースリスト」、トレース分析したい場合は「アナリティクス」を活用し、トレブルシューティングやパフォーマンス分析を行うと良いです。

サービスマップ

収集したトレースを元にサービス間で行われるリクエストが可視化されます。エラーが発生しているサービス、高レイテンシーの接続、失敗したリクエストのトレースを識別可能です。


トレースリスト

セグメント、サブセグメントを含むトレースのより詳細な情報を確認出来ます。1 つのリクエスト(トレース)での URL、レスポンスコード、レイテンシなどの詳細なデータを可視化してくれます。

アナリティクス

トレースの分析に有用なインタラクティブなツールを提供している。応答時間グラフと時系列グラフを使用して、トレースを調査、分析、および視覚化できます。

ユースケース例1: リリースが応答時間に影響を与えていないか確認したい


ユースケース例2: 応答時間と時間帯に相関があるか調べたい



参考文献

Discussion