c# - 用于 ASP.NET WebAPI 的 AWS XRay 传出跟踪
问题描述
环境
- ASP.NET WebAPI 调用外部客户端服务。
通过在 Global.asax 中应用的 XRay 传入跟踪
AWSXRayASPNET.RegisterXRay(this, "CustomerAPI");
HttpClient 实例隐藏为实用程序类中的私有成员,在具有多个 WebAPI 的单独项目中共享
HttpClient 具有 Xray 的委派处理程序启用如下:- (参考:.NET HttpClient 用于传出 XRay)
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 中的中间件启动的 Segment:https ://github.com/aws/aws-xray-sdk-dotnet/blob/master/sdk/src/Handlers/AspNet/AWSXRayASPNET .cs#L141,因此无法存储 HTTP 信息。
你能回答以下问题吗?
- 给定传入请求的流程如何:request->WEBAPI->HTTPClient?HTTPClient 调用是异步的吗?
- 如果您已检测 ASP.NET 中间件并且未启用 HTTPClient X-Ray 检测,您是否仍然遇到上述错误?或者此错误是启用 HTTPClient 检测的结果。缩小范围的原因,因为错误堆栈来自 X-Ray 中间件而不是 HTTP 客户端。
- HttpClientXRayTracingHandler 为您创建一个子段。该工具期望 Segment 已经存在于 TraceContext 中,在这种情况下,它是由 AWSXRayASPNET 创建的。根据您的陈述,“HttpClient 实例隐藏为实用程序类中的私有成员,在具有多个 WebAPI 的单独项目中共享”,您能否在使用 AWSXRayRecorder.Instance.GetEntity() 进行网络调用之前检查 Segment 是否存在于 TraceContext 中. 如果您在此调用之前手动创建,这应该返回由中间件或子段启动的段。
- 您是否有任何与线程池相关的配置导致 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
谢谢,瑜伽士
推荐阅读
- c# - 我如何比较列表
' 项目(内容或名称等),在 ComboBox 中选择项目? - haskell - 理解 foldTree 函数的类型推导
- sass - Dart-Sass 未添加到 PATH
- c# - Blazor - 无法读取表单验证
- scala - 在 scala 中找不到参数的隐含值
- java - Swift字典的Android等价物?
- aws-cdk - AWS CDK - 使用共享角色为不同的堆栈生成名称冲突的内联 IAM 策略
- analysis - 如何找到用于下载 emotnet 恶意软件的 vbs 脚本的真实输出和 shell 脚本,以便获取 c2s?
- android - 对话框显示片刻然后消失;无法输入详细信息
- spring - 使用 JavaFX 进行依赖注入会产生 NullPointerExceptions