首页 > 解决方案 > 用于 ASP.NET WebAPI 的 AWS XRay 传出跟踪

问题描述

环境

问题 虽然所有 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)

标签: c#amazon-web-servicesasp.net-web-api2aws-xray

解决方案


从错误堆栈看起来异常发生在这里:https ://github.com/aws/aws-xray-sdk-dotnet/blob/master/sdk/src/Handlers/AspNet/AWSXRayASPNET.cs#L209 。在此事件中收到的响应没有由 BeginRequest 中的中间件启动的 Segment: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 中,在这种情况下,它是由 AWSXRayASPNET 创建的。根据您的陈述,“HttpClient 实例隐藏为实用程序类中的私有成员,在具有多个 WebAPI 的单独项目中共享”,您能否在使用 AWSXRayRecorder.Instance.GetEntity() 进行网络调用之前检查 Segment 是否存在于 TraceContext 中. 如果您在此调用之前手动创建,这应该返回由中间件或子段启动的段。
  4. 您是否有任何与线程池相关的配置导致 TraceContext 未在线程之间正确传播?

在上面的代码片段中,您不需要进行“isXrayEnabled()”检查。默认情况下,您可以使用 X-Ray ant 检测 HTTPClient,中间件会为您检查:https ://github.com/aws/aws-xray-sdk-dotnet/blob/master/sdk/src/Handlers/System.Net /Utils/RequestUtil.cs#L59

谢谢,瑜伽士


推荐阅读