本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用適用於 Java 的 X-Ray 開發套件來追蹤傳入請求
您可以使用 X-Ray 開發套件來追蹤您應用程式在 Amazon EC2 中 EC2 實例上處理的傳入 HTTP 請求,AWS Elastic Beanstalk或亞馬遜彈性雲服務器。
使用 Filter
檢測傳入的 HTTP 請求。當您新增 X-Ray Servlet 篩選條件到應用程式時,適用於 Java 的 X-Ray 開發套件會為每個抽樣請求建立區段。此區段包括時間、方法,以及 HTTP 請求的處置方式。其他檢測會在此區段上建立子區段。
注意
適用於AWS Lambda函數時,Lambda 會為每個抽樣請求建立區段。如需詳細資訊,請參閱 AWS Lambda 而且 AWS X-Ray。
每個區段都有一個用於標識服務映射中的應用程序的名稱。可以靜態命名段,也可以將 SDK 配置為基於傳入請求中的主機標頭動態命名它。動態命名允許您根據請求中的域名對跟蹤進行分組,如果名稱與預期模式不匹配(例如,如果主機標頭是偽造的),則應用默認名稱。
轉發請求
如果負載均衡器或其他中間機構將請求轉發給您的應用程序,X-Ray 會從X-Forwarded-For
標頭,而不是來自 IP 數據包中的源 IP。為轉發請求記錄的客户端 IP 可以偽造,因此不應信任該 IP。
轉發請求時,SDK 會在段中設置一個額外的字段來指示這一點。如果區段包含字段x_forwarded_for
設定為true
,則客户端 IP 是從X-Forwarded-For
標頭。
訊息處理常式會使用 http
區塊為每個傳入的請求建立區段,其中包含以下資訊:
-
HTTP method (HTTP 方法)— 獲取、張貼、放置、刪除等。
-
使用者地址— 發送請求的用户端 IP 地址。
-
回應代碼— 已完成請求的 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,請將 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 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
")
);
}
}