AWS X-Ray を 1 から実践で使えるようになるまで
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 のデータ収集の仕組み
- アプリケーションに組み込まれた AWS X-Ray SDK が作成したセグメントデータを X-Ray デーモンに送信
- X-Ray デーモンはセグメントデータをバッファリングし、X-Ray API に定期的に転送
- X-Ray API では収集されたセグメントデータからトレースを作成
- トレースを 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