使用 X-Ray SDK for Java跟踪传入请求 - AWS X-Ray
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 X-Ray SDK for Java跟踪传入请求

您可以使用 X-Ray 开发工具包,跟踪您的应用程序在 Amazon EC2、AWS Elastic Beanstalk 或 Amazon ECS 中的 EC2 实例上提供服务的传入 HTTP 请求。

使用Filter分析传入 HTTP 请求。当您将 X-Ray servlet 筛选器添加到应用程序时,X-Ray SDK for Java将为每个采样请求创建分段。此分段包括 HTTP 请求的计时、方法和处置。其他分析会在此分段上创建子分段。

注意

对于 AWS Lambda 函数,Lambda 为每个采样的请求创建一个分段。请参阅 AWS Lambda 和 AWS X-Ray 以了解更多信息。

每个段都有在服务地图中标识您的应用程序的名称。可以静态命名段,也可将 SDK 配置为基于传入请求中的主机标头动态命名段。通过动态命名,您可根据请求中的域名对跟踪进行分组,并在名称与预期模式 (例如,如果主机标头是伪造的) 不匹配时应用默认名称。

转发的请求

如果负载均衡器或者其他中介向您的应用程序转发了请求,则 X-Ray 会从请求的 X-Forwarded-For 标头中提取客户端 IP,而不是从 IP 数据包中的源 IP 提取。为转发的请求记录的客户端 IP 可以伪造,所以不应该信任。

在转发请求时,SDK 在分段中设置附加字段来指示此行为。如果分段包含设置为 x_forwarded_for 的字段 true,则从 HTTP 请求的 X-Forwarded-For 标头获取客户端 IP。

信息处理程序使用包含以下信息的 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,请将 Filter 添加到您的 WebConfig 类。将分段名称作为字符串传递到 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 开发工具包为传入请求生成分段时,它将在分段的名称字段中记录您的应用程序的服务名称。

X-Ray 开发工具包可以 HTTP 请求标头中的主机名为分段命名。但是,此标头可伪造,这可能导致您的服务地图中出现意外节点。为防止对伪造的主机标头的请求导致 SDK 不正确地命名分段,您必须为传入请求指定默认名称。

如果您的应用程序处理对多个域的请求,您可以将开发工具包配置为使用动态命名策略以在分段名称中反映此行为。通过动态命名策略,开发工具包可将主机名用于与预期模式匹配的请求,并将默认名称应用于与预期模式不匹配的请求。

例如,您可能有一个处理对三个子域(www.example.comapi.example.comstatic.example.com)的请求的应用程序。您可以将动态命名策略用于模式 *.example.com 以使用不同的名称标识每个子域的分段,从而在服务地图上生成三个服务节点。如果您的应用程序收到具有与该模式不匹配的主机名的请求,您将在服务地图上看到具有您指定的回退名称的第四个节点。

要对所有请求分段使用同一名称,可在初始化 servlet 筛选器时指定应用程序名称,如上一部分中所示。这与通过调用 并将其传递给 SegmentNamingStrategySegmentNamingStrategy.fixed() 构造函数来创建固定 AWSXRayServletFilter 的效果相同。

注意

您可以使用 AWS_XRAY_TRACING_NAME 环境变量覆盖您在代码中定义的默认服务名称。

动态命名策略定义一个主机名应匹配的模式和一个在 HTTP 请求中的主机名与该模式不匹配时要使用的默认名称。要在 Tomcat 中动态命名分段,可使用 dynamicNamingRecognizedHostsdynamicNamingFallbackName 相应地定义模式和默认名称。

例 WEB-INF/web.xml - 带动态命名的 Servlet 筛选条件

<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,通过调用 创建一个动态 SegmentNamingStrategySegmentNamingStrategy.dynamic()AWSXRayServletFilter,并将其传递给 构造函数。

例 src/main/java/myapp/WebConfig.java - 带动态命名的 servlet 筛选器

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; 导入 com.amazonaws.xray.strategy.SegmentNamingStrategy; @Configuration public class WebConfig { @Bean public Filter TracingFilter() { return new AWSXRayServletFilter(SegmentNamingStrategy().dynamic("MyApp", "*.example.com")); } }