簡體   English   中英

ASP.NET WebAPI的AWS XRay傳出跟蹤

[英]AWS XRay outgoing tracing for ASP.NET WebAPI

環境

  • ASP.NET WebAPI調用外部客戶端服務。
  • XRay傳入跟蹤通過Global.asax應用

     AWSXRayASPNET.RegisterXRay(this, "CustomerAPI"); 
  • HttpClient實例隱藏為實用程序類中的私有成員,在具有多個WebAPI的單獨項目中共享

  • 具有Xray的委托處理程序的HttpClient啟用如下: - (參考: 用於傳出XRay的.NET HttpClient

     bool isXrayEnabled = false; bool.TryParse(Config["XRayEnable"], out isXrayEnabled); if (isXrayEnabled) { Logger.Info("Enabling XRay tracing with Http calls"); httpClient = new HttpClient(new HttpClientXRayTracingHandler(new HttpClientHandler())); } else { httpClient = new HttpClient(); Logger.Info("Disabling XRay tracing with Http calls"); } 

問題雖然所有API都顯示傳入的XRay跟蹤,但根本不顯示傳出跟蹤。 傳入的痕跡

相反,XRay日志中會顯示以下錯誤

   Exception type: EntityNotAvailableException

    Exception message: Entity doesn't exist in HTTPContext
   at Amazon.XRay.Recorder.Core.Internal.Context.HybridContextContainer.InjectEntityInTraceContext()
   at Amazon.XRay.Recorder.Core.AWSXRayRecorderImpl.AddHttpInformation(String key, Object value)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Amazon.XRay.Recorder.Core.AWSXRayRecorderImpl.AddHttpInformation(String key, Object value)
   at Amazon.XRay.Recorder.Handlers.AspNet.AWSXRayASPNET.ProcessHTTPResponse(Object sender, EventArgs e)
   at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

從錯誤堆棧看起來像這里發生異常: https//github.com/aws/aws-xray-sdk-dotnet/blob/master/sdk/src/Handlers/AspNet/AWSXRayASPNET.cs#L209 在此事件中收到的響應沒有由BeginRequest中的中間件啟動的段: https//github.com/aws/aws-xray-sdk-dotnet/blob/master/sdk/src/Handlers/AspNet/AWSXRayASPNET .cs#L141因此無法存儲HTTP信息。

你能回答以下問題:

  1. 給定傳入請求的流程如何:request-> WEBAPI-> HTTPClient? HTTPClient調用是否異步?
  2. 如果您使用ASP.NET中間件進行檢測並且未啟用HTTPClient X-Ray檢測,那么您是否還會遇到上述錯誤? 或者此錯誤是啟用HTTPClient檢測的結果。 由於錯誤堆棧來自X-Ray中間件而非HTTP客戶端,因此縮小的原因。
  3. HttpClientXRayTracingHandler為您創建一個子分段。 此工具或者期望Segment已經存在於TraceContext中,在這種情況下,TraceContext由AWSXRayASPNET創建。 根據您的聲明,“隱藏為實用程序類中私有成員的HttpClient實例,在具有多個WebAPI的單獨項目中共享”,您可以在使用AWSXRayRecorder.Instance.GetEntity()進行網絡調用之前檢查TraceContext中是否存在Segment 。 如果您在此調用之前手動創建,則應返回由中間件或子段啟動的段。
  4. 您是否有任何與線程池相關的配置導致TraceContext未在線程之間正確傳播?

在上面的代碼片段中,您不需要執行“isXrayEnabled()”檢查。 默認情況下,您可以使用X-Ray來檢測HTTPClient,中間件會為您檢查: https//github.com/aws/aws-xray-sdk-dotnet/blob/master/sdk/src/Handlers/System.Net /Utils/RequestUtil.cs#L59

謝謝,瑜珈

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM