使用 X-Ray SDK 檢測傳入 HTTP 請求 - AWS X-Ray

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 X-Ray SDK 檢測傳入 HTTP 請求

您可以使用 X-Ray SDK 來追蹤您應用程式在 Amazon EC2 中 EC2 執行個體上處理的傳入 HTTP 請求,AWS Elastic Beanstalk或亞馬遜彈性雲服務器。

使用訊息處理常式檢測傳入的 HTTP 請求。當您新增 X-Ray 訊息處理常式新增至應用程式時,.NET X-Ray SDK 會為每個抽樣請求建立區段。此區段包括時間、方法,以及 HTTP 請求的處置方式。其他檢測會在此區段上建立子區段。

注意

適用於AWS Lambda函數時,Lambda 會為每個抽樣請求建立區段。如需詳細資訊,請參閱 AWS Lambda 而且 AWS X-Ray

每個區段都有一個用於標識服務映射中的應用程序的名稱。可以靜態命名段,也可以將 SDK 配置為基於傳入請求中的主機標頭動態命名它。動態命名允許您根據請求中的域名對跟蹤進行分組,如果名稱與預期模式不匹配(例如,如果主機標頭是偽造的),則應用默認名稱。

轉發請求

如果負載均衡器或其他中間機構將請求轉發給您的應用程序,X-Ray 會從X-Forwarded-For標頭,而不是來自 IP 數據包中的源 IP。為轉發請求記錄的客户端 IP 可以偽造,因此不應信任該 IP。

訊息處理常式會使用 http 區塊為每個傳入的請求建立區段,其中包含以下資訊:

  • HTTP method (HTTP 方法)— 獲取、張貼、刪除等。

  • 用户端地址— 傳送請求的用户端 IP 地址。

  • 回應代碼— 已完成請求的 HTTP 回應代碼。

  • Timing (時間點)— 開始時間 (收到請求) 和結束時間 (傳送回應)。

  • 用户代理程式user-agent從請求。

  • 內容長度content-length從回應。

檢測傳入的請求 (.NET)

若要檢測您應用程式處理的請求,請在您 global.asax 檔案的 Init 方法中呼叫 RegisterXRay

範例 global.asax - 訊息處理常式
using System.Web.Http; using Amazon.XRay.Recorder.Handlers.AspNet; namespace SampleEBWebApplication { public class MvcApplication : System.Web.HttpApplication { public override void Init() { base.Init(); AWSXRayASPNET.RegisterXRay(this, "MyApp"); } } }

檢測傳入的請求 (.NET Core)

若要檢測您應用程式處理的請求,請致電UseXRay方法之前的任何其他中間件Configure方法作為理想情況下 X-Ray 中間件應該是處理請求的第一箇中間件,最後一箇中間件應該是處理管道中響應的最後一箇中間件。

注意

對於 .NET Core 2.0,如果您有UseExceptionHandler方法,請確保調用UseXRay之後UseExceptionHandler方法來確保記錄異常。

範例 Startup.cs
.NET Core 2.1 and above
using Microsoft.AspNetCore.Builder; public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseXRay("MyApp"); // additional middleware ... }
.NET Core 2.0
using Microsoft.AspNetCore.Builder; public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseExceptionHandler("/Error"); app.UseXRay("MyApp"); // additional middleware ... }

UseXRay 方法也可以接收組態物件做為第二個引數。

app.UseXRay("MyApp", configuration);

設定區段命名策略

AWS X-Ray使用服務名稱來識別您的應用程序,並將其與其他應用程序、數據庫、外部 API 和AWS您應用程式使用的資源。當 X-Ray SDK 為傳入請求生成段時,它會將應用程序的服務名稱記錄在區段的名稱欄位

X-Ray SDK 可以在 HTTP 請求標頭中的主機名後面命名段。但是,此標頭可能是偽造的,這可能會導致服務映射中出現意外的節點。要防止 SDK 由於使用偽造主機標頭的請求而錯誤地命名段,您必須為傳入請求指定默認名稱。

如果您的應用程序為多個域的請求提供服務,則可以將 SDK 配置為使用動態命名策略在段名稱中反映這一點。動態命名策略允許 SDK 對與預期模式匹配的請求使用主機名,並將默認名稱應用於不匹配的請求。

例如,您可能有單個應用程式處理三個子域名的請求 —www.example.comapi.example.com,和static.example.com。您可以將動態命名策略與模式一起使用*.example.com來標識具有不同名稱的每個子域的段,從而在服務映射上生成三個服務節點。如果您的應用程序收到的主機名與模式不匹配的請求,則您將在服務映射上看到第四個節點,其中包含您指定的回退名稱。

若要為所有請求區段使用相同的名稱,請如上一節所述,在初始化訊息處理常式時指定您應用程式的名稱。這與建立 FixedSegmentNamingStrategy 並將其傳遞給 RegisterXRay 方法有相同的效果。

AWSXRayASPNET.RegisterXRay(this, new FixedSegmentNamingStrategy("MyApp"));
注意

您可以使用 AWS_XRAY_TRACING_NAME 環境變數來覆寫您在程式碼中定義的預設服務名稱。

動態命名策略可定義主機名稱應相符的模式,以及如果 HTTP 請求中的主機名稱不符合模式時要使用的預設名稱。若要動態命名區段,請建立 DynamicSegmentNamingStrategy 並將其傳遞至 RegisterXRay 方法。

AWSXRayASPNET.RegisterXRay(this, new DynamicSegmentNamingStrategy("MyApp", "*.example.com"));