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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

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

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

注記

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

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

転送されたリクエスト

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

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

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

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

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

  • Response Code (レスポンスコード)— 完了したリクエストの HTTP レスポンスコード。

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

  • ユーザーエージェント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 が受信リクエストのセグメントを生成すると、アプリケーションのサービス名がセグメントの名前フィールド

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

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

たとえば、3 つのサブドメインにリクエストを処理するアプリケーションがあるとします。www.example.com,api.example.com, およびstatic.example.com。動的ネーミングストラテジーは、パターンで使用できます。*.example.comを選択して、異なる名前のサブドメインのセグメントを識別し、サービスマップ上に 3 つのサービスノードを作成します。アプリケーションがパターンと一致しないホスト名のリクエストを受信すると、指定したフォールバック名を持つ 4 番目のノードがサービスマップに表示されます。

すべてのリクエストセグメントに対して同じ名前を使用するには、前のセクションで示すとおり、サーブレットフィルタを初期化するときに、アプリケーションの名前を指定します。これは、固定を作成するのと同じ効果があります。セグメントネーミングストラテジーを呼び出します。SegmentNamingStrategy.fixed()と、それをに渡します。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 の場合は、動的を作成します。セグメントネーミングストラテジーを呼び出します。SegmentNamingStrategy.dynamic()となり、それをに渡します。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.SegmentNamingStrategy; @Configuration public class WebConfig { @Bean public Filter TracingFilter() { return new AWSXRayServletFilter(SegmentNamingStrategy.dynamic("MyApp", "*.example.com")); } }