本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用适用于 Java 的 X-Ray 开发工具包,跟踪
您可以使用 X-Ray 开发工具包,跟踪您应用程序在 Amazon EC2 中的 EC2 实例上提供服务的传入 HTTP 请求。Amazon Elastic Beanstalk,或者亚马逊 ECS。
使用Filter
分析传入 HTTP 请求。在您添加 X-Ray servlet 筛选器到应用程序时,适用于 Java 的 X-Ray 开发工具包为每个采样请求创建分段。此分段包括 HTTP 请求的计时、方法和处置。其他分析会在此分段上创建子分段。
注意
适用于Amazon LambdaLambda 为每个采样请求创建分段。参阅 Amazon Lambda 和 Amazon X-Ray 了解更多信息。
每个区段都有一个名称,用于在服务图中标识您的应用程序。可以静态命名该区段,也可以将 SDK 配置为根据传入请求中的主机标头动态命名它。动态命名允许您根据请求中的域名对跟踪进行分组,如果名称与预期模式不匹配(例如,如果主机标头是伪造的),则应用默认名称。
转发的请求
如果负载均衡器或其他中介机构将请求转发到您的应用程序,X-Ray 会从X-Forwarded-For
请求中的标头,而不是来自 IP 数据包中的源 IP。为转发请求记录的客户端 IP 可以伪造,因此不应信任它。
在转发请求时,开发工具包在分段中设置附加字段来指示此行为。如果区段包含该字段x_forwarded_for
设置为true
,客户端 IP 是从X-Forwarded-For
HTTP 请求中的标头。
信息处理程序使用包含以下信息的 http
数据块为每个传入请求创建一个分段:
-
HTTP method (HTTP 方法)— 获取、发布、放置、删除等。
-
客户端地址— 发送请求的客户端的 IP。
-
响应代码— 已完成请求的 HTTP 响应代码。
-
Timing— 开始时间(收到请求时)和结束时间(发送响应时)。
-
User agent— 该
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,请将 Filter
添加到您的 WebConfig
类。将分段名称作为字符串传递到 AWSXRayServletFilter
构造函数。
例 src/main/java/myapp/WebConfig.java-春季
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
");
}
}
配置分段命名策略
Amazon X-Ray使用服务名称识别您的应用程序并将其与其他应用程序、数据库、外部 API 和区分开来Amazon您的应用程序使用的资源。当 X-Ray SDK 为传入请求生成区段时,它会在细分中记录应用程序的服务名称字段名称.
X-Ray SDK 可以在 HTTP 请求标头中的主机名后面命名区段。但是,可以伪造此标头,这可能会导致服务映射中出现意外的节点。为了防止 SDK 因使用伪造主机标头的请求而错误地命名区段,您必须为传入的请求指定默认名称。
如果您的应用程序为多个域提供请求,则可以将 SDK 配置为使用动态命名策略以在区段名称中反映这一点。动态命名策略允许 SDK 对与预期模式匹配的请求使用主机名,并将默认名称应用于不匹配的请求。
例如,您可能有一个应用程序为三个子域提供请求。www.example.com
、api.example.com
, 和static.example.com
. 你可以对模式使用动态命名策略*.example.com
为每个子域标识具有不同名称的区段,从而在服务图上生成三个服务节点。如果您的应用程序收到的主机名与模式不匹配的请求,您将在服务映射上看到第四个节点,其中包含您指定的备用名称。
要对所有请求分段使用同一名称,可在初始化 servlet 筛选器时指定应用程序名称,如上一部分中所示。这与创建固定的效果相同。细分命名策略调用SegmentNamingStrategy.fixed()
将此值传递给AWSXRayServletFilter
构造函数。
注意
您可以使用 AWS_XRAY_TRACING_NAME
环境变量覆盖您在代码中定义的默认服务名称。
动态命名策略定义一个主机名应匹配的模式和一个在 HTTP 请求中的主机名与该模式不匹配时要使用的默认名称。要在 Tomcat 中动态命名分段,可使用 dynamicNamingRecognizedHosts
和 dynamicNamingFallbackName
相应地定义模式和默认名称。
例 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,创建动态细分命名策略调用SegmentNamingStrategy.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;
import com.amazonaws.xray.strategy.SegmentNamingStrategy;
@Configuration
public class WebConfig {
@Bean
public Filter TracingFilter() {
return new AWSXRayServletFilter(SegmentNamingStrategy.dynamic("MyApp
", "*.example.com
")
);
}
}