使用适用于 .NET 的 X-Ray 开发工具包检测传入 HTTP 请求 - Amazon X-Ray
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用适用于 .NET 的 X-Ray 开发工具包检测传入 HTTP 请求

您可以使用 X-Ray 开发工具包,跟踪您的应用程序在 Amazon EC2、Amazon Elastic Beanstalk 或 Amazon ECS 实例上提供服务的传入 HTTP 请求。

使用消息处理程序检测传入 HTTP 请求。当您将 X-Ray 消息处理程序添加到应用程序时,适用于 .NET 的 X-Ray 开发工具包将为每个采样请求创建分段。此分段包括 HTTP 请求的计时、方法和处置。其他检测会在此分段上创建子分段。

注意

如果使用的是 Amazon Lambda 函数,Lambda 会为每个采样的请求创建一个分段。参阅 Amazon Lambda 和 Amazon X-Ray 了解更多信息。

每个分段都有一个名称,用于在服务映射中标识您的应用程序。可以静态命名分段,也可以将开发工具包配置为根据传入请求中的主机标头对其进行动态命名。动态命名允许根据请求中的域名对跟踪进行分组,并且在名称不匹配预期模式时(例如,如果主机标头是伪造的)应用默认名称。

转发的请求

如果负载均衡器或其他中间将请求转发到您的应用程序,X-Ray 会提取请求 X-Forwarded-For 标头中的客户端 IP 而非 IP 数据包中的源 IP。由于转发的请求记录的客户端 IP 可以伪造,因此不应信任。

信息处理程序使用包含以下信息的 http 数据块为每个传入请求创建一个分段:

  • HTTP 方法 - GET、POST、PUT、DELETE 等。

  • 客户端地址 - 发送请求的客户端的 IP 地址。

  • 响应代码 - 已完成请求的 HTTP 响应代码。

  • 时间 - 开始时间(收到请求时)和结束时间(发送响应时)。

  • 用户代理 - 请求中的 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)

若要检测您的应用程序处理的请求,请在启动类的 Configure 方法中的任何其他中间件之前调用 UseXRay 方法。因为理想情况下,X-Ray 应该是第一个处理请求的中间件,以及最后一个处理管道中响应的中间件。

注意

对于.NET Core 2.0,如果应用程序中有 UseExceptionHandler 方法,请确保在 UseExceptionHandler 方法之后调用 UseXRay 以确保记录下异常。

例 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);

配置分段命名策略

Amazon X-Ray 使用服务名称来识别应用程序并将其与其他应用程序数据库、外部 API 和应用程序使用的 Amazon 资源区别开。当 X-Ray 开发工具包为传入请求生成分段时,会将应用程序的服务名称记录在分段的名称字段中。

X-Ray 开发工具包可以用在 HTTP 请求标头中的 hostname 来命名分段。不过,此标头可以伪造,会导致服务地图中出现意料之外的节点。为防止开发工具包由于包含伪造的主机标头的请求而错误地命名分段,必须为传入请求指定一个默认名称。

如果应用程序为多个域的请求提供服务,则可以将开发工具包配置为使用动态命名策略以在分段名称中反映出这一点。动态命名策略允许开发工具包将主机名用于符合预期模式的请求,并将默认名称应用于不符合预期模式的请求。

例如,可能有一款应用程序为发送到三个子域的请求提供服务,分别为 www.example.comapi.example.comstatic.example.com。可以使用格式 *.example.com 的动态命名策略以识别包含不同名称的子域的分段,服务地图上因此会显示三个服务节点。如果应用程序收到包含与该格式不匹配的 hostname 的请求,您将会在服务地图上看到第四个节点,以及您指定的回退名称。

要对所有请求分段使用同一名称,可在初始化消息处理程序时指定应用程序名称,如上一部分中所示。这与创建 FixedSegmentNamingStrategy 并将它传递给 RegisterXRay 方法的效果相同。

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

您可以使用 AWS_XRAY_TRACING_NAME 环境变量覆盖您在代码中定义的默认服务名称。

动态命名策略定义一个主机名应匹配的模式和一个在 HTTP 请求中的主机名与该模式不匹配时要使用的默认名称。要动态命名分段,请创建 DynamicSegmentNamingStrategy 并将它传递给 RegisterXRay 方法。

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