X-Ray SDK for Java を使用して受信リクエストをトレースする - AWS X-Ray

X-Ray SDK for Java を使用して受信リクエストをトレースする

X-Ray SDK を使用して、アプリケーションが Amazon EC2、AWS Elastic Beanstalk、または Amazon ECS の EC2 インスタンスで処理する受信 HTTP リクエストをトレースできます。

Filter を使用して受信 HTTP リクエストを計測します。X-Ray サーブレットフィルタをアプリケーションに追加すると、X-Ray SDK for Java によってサンプリングされた各リクエストのセグメントが作成されます。このセグメントには、時間、メソッド、HTTP リクエストの処理などが含まれます。追加の計測により、このセグメントでサブセグメントが作成されます。

注記

AWS Lambda 関数の場合、Lambda はサンプリングされたリクエストごとにセグメントを作成します。詳細については、「AWS Lambda および AWS X-Ray」を参照してください。

各セグメントには、サービスマップでアプリケーションを識別する名前があります。セグメントは静的に名前を付けるか、受信リクエストのホストヘッダーに基づいて動的に名前を付けるよう SDK を設定できます。動的な命名により、リクエストのドメイン名に基づいてトレースをグループ化し、予期されるパターンに名前が一致しない場合 (ホストヘッダーが偽造されているなど) は、デフォルト名を適用できます。

転送されたリクエスト

ロードバランサーなどを仲介してリクエストがアプリケーションに転送される場合、X-Ray では、IP パケットのソース IP からではなくリクエストの X-Forwarded-For ヘッダーからクライアント IP を取得します。転送されたリクエストに記録されているクライアント IP は偽造されている可能性があるため、信頼すべきではありません。

リクエストが転送されると、それを示す追加フィールドが SDK によってセグメントに設定されます。セグメントのフィールド x_forwarded_fortrue に設定されている場合、クライアント IP は HTTP リクエストの X-Forwarded-For ヘッダーから取得されています。

メッセージハンドラーは、次の情報が含まれる http ブロックを使用して、各受信リクエスト用にセグメントを作成します。

  • HTTP メソッド – GET、POST、PUT、DELETE、その他。

  • クライアントアドレス – リクエストを送信するクライアントの IP アドレス。

  • レスポンスコード – 完了したリクエストの HTTP レスポンスコード。

  • タイミング – 開始時間 (リクエストが受信された時間) および終了時間 (レスポンスが送信された時間)。

  • ユーザーエージェント — リクエストから user-agent を取得します。

  • コンテンツの長さ — レスポンスからの content-length

トレースフィルタをアプリケーション (Tomcat) に追加する

Tomcat の場合は、プロジェクトの <filter> ファイルに web.xml を追加します。fixedName パラメーターを使用して、サービス名を指定し、着信リクエスト用に作成されたセグメントに適用します。

例 WEB-INF/web.xml - Tomcat

<filter> <filter-name>AWSXRayServletFilter</filter-name> <filter-class>com.amazonaws.xray.javax.servlet.AWSXRayServletFilter</filter-class> <init-param> <param-name>fixedName</param-name> <param-value>MyApp</param-value> </init-param> </filter> <filter-mapping> <filter-name>AWSXRayServletFilter</filter-name> <url-pattern>*</url-pattern> </filter-mapping>

トレースフィルタをアプリケーション (Spring) に追加する

Spring の場合は、WebConfig クラスに Filter を追加します。セグメント名を文字列として AWSXRayServletFilter コンストラクタに渡します。

例 src/main/java/myapp/WebConfig.java - Spring

package myapp; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Bean; import javax.servlet.Filter; import com.amazonaws.xray.javax.servlet.AWSXRayServletFilter; @Configuration public class WebConfig { @Bean public Filter TracingFilter() { return new AWSXRayServletFilter("Scorekeep"); } }

セグメント命名ルールの設定

AWS X-Ray はサービス名を使用してアプリケーションを識別し、アプリケーションが使用する他のアプリケーション、データベース、外部 API、および AWS リソースからそのアプリケーションを区別します。X-Ray SDK が受信リクエストのセグメントを生成するときに、アプリケーションのサービス名をセグメントの name フィールドに記録します。

X-Ray SDK は HTTP リクエストヘッダーのホスト名に合わせてセグメントを命名できます。ただし、このヘッダーは偽造されている可能性があり、その場合はサービスマップで予期しないノードが発生することがあります。SDK が、偽造されたホストヘッダーを持つリクエストによりセグメントに正しくない名前を付けないようにするには、受信リクエストのデフォルト名を指定する必要があります。

アプリケーションが複数のドメインのリクエストに対応する場合、動的な命名ルールを使用してセグメント名にこれを反映するよう SDK を設定できます。動的な命名ルールにより、SDK は予期されるパターンに一致するリクエストにホスト名を使用し、一致しないリクエストにはデフォルト名を適用できます。

たとえば、3 つのサブドメイン(www.example.comapi.example.comstatic.example.com)へのリクエストに対応する 1 つのアプリケーションがあるとします。動的命名ルールとパターン *.example.com を使用して、異なる名前を持つ各サブドメインのセグメントを識別し、それによりサービスマップで 3 つのサービスノードが作成されます。アプリケーションが、パターンに一致しないホスト名のリクエストを受け取った場合は、指定したフォールバック名を持つ 4 番目のノードがサービスマップに表示されます。

すべてのリクエストセグメントに対して同じ名前を使用するには、前のセクションで示すとおり、サーブレットフィルタを初期化するときに、アプリケーションの名前を指定します。これは、FixedSegmentNamingStrategy を作成して、AWSXRayServletFilter コンストラクタに渡すのと同じ効果があります。

注記

コードで定義したデフォルトのサービス名は、AWS_XRAY_TRACING_NAME 環境変数で上書きできます。

動的な命名戦略は、ホスト名と一致するようパターンを定義し、HTTP リクエストのホスト名がパターンと一致しない場合はデフォルトの名前を使用します。Tomcat で動的にセグメントに命名するには、dynamicNamingRecognizedHosts および dynamicNamingFallbackName を使用して、パターンとデフォルト名をそれぞれ定義します。

例 WEB-INF/web.xml - 動的名前付けのサーブレットフィルタ

<filter> <filter-name>AWSXRayServletFilter</filter-name> <filter-class>com.amazonaws.xray.javax.servlet.AWSXRayServletFilter</filter-class> <init-param> <param-name>dynamicNamingRecognizedHosts</param-name> <param-value>*.example.com</param-value> </init-param> <init-param> <param-name>dynamicNamingFallbackName</param-name> <param-value>MyApp</param-value> </init-param> </filter> <filter-mapping> <filter-name>AWSXRayServletFilter</filter-name> <url-pattern>*</url-pattern> </filter-mapping>

Spring の場合は、DynamicSegmentNamingStrategy を作成して、AWSXRayServletFilter コンストラクタに渡します。

例 src/main/java/myapp/WebConfig.java - servlet filter with dynamic naming

package myapp; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Bean; import javax.servlet.Filter; import com.amazonaws.xray.javax.servlet.AWSXRayServletFilter; import com.amazonaws.xray.strategy.DynamicSegmentNamingStrategy; @Configuration public class WebConfig { @Bean public Filter TracingFilter() { return new AWSXRayServletFilter(new DynamicSegmentNamingStrategy("MyApp", "*.example.com")); } }