本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用X-Ray SDK for .NET分析传入 HTTP 请求
您可以使用 X-Ray 开发工具包,跟踪您的应用程序在 Amazon EC2、AWS Elastic Beanstalk 或 Amazon ECS 中的 EC2 实例上提供服务的传入 HTTP 请求。
使用消息处理程序分析传入 HTTP 请求。当您将 X-Ray 消息处理程序添加到应用程序时,X-Ray SDK for .NET将为每个采样请求创建分段。此分段包括 HTTP 请求的计时、方法和处置。其他分析会在此分段上创建子分段。
对于 AWS Lambda 函数,Lambda 为每个采样的请求创建一个分段。请参阅 AWS Lambda 和 AWS X-Ray 以了解更多信息。
每个段都有在服务地图中标识您的应用程序的名称。可以静态命名段,也可将 SDK 配置为基于传入请求中的主机标头动态命名段。通过动态命名,您可根据请求中的域名对跟踪进行分组,并在名称与预期模式 (例如,如果主机标头是伪造的) 不匹配时应用默认名称。
如果负载均衡器或者其他中介向您的应用程序转发了请求,则 X-Ray 会从请求的 X-Forwarded-For
标头中提取客户端 IP,而不是从 IP 数据包中的源 IP 提取。为转发的请求记录的客户端 IP 可以伪造,所以不应该信任。
信息处理程序使用包含以下信息的 http
数据块为每个传入请求创建一个分段:
-
HTTP 方法 – GET、POST、PUT、DELETE 等。
-
客户端地址 – 发送请求的客户端的 IP 地址。
-
响应代码 – 已完成请求的 HTTP 响应代码。
-
时间 – 开始时间(收到请求时)和结束时间(发送响应时)。
-
用户代理 — 请求中的
user-agent
。 -
内容长度 — 响应中的
content-length
。
分析传入请求 (.NET)
要分析由您的应用程序所服务的请求,请在 RegisterXRay
文件的 Init
方法中调用 global.asax
。
例 global.asax - 消息处理程序
using System.Web.Http;
使用 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)
要分析由您的应用程序所服务的请求,请在 UseExceptionHandler
类的 UseXRay
方法中调用 UseStaticFiles
、Configure
和 Startup
方法。
例 Startup.cs
using Microsoft.AspNetCore.Builder;
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseExceptionHandler("/Error");
app.UseXRay("MyApp
");
app.UseStaticFiles();
app.UseMVC();
}
始终在 UseExceptionHandler
之后调用 UseXRay
来记录异常。如果您使用其他中间件,请在调用 UseXRay
之后启用。
UseXRay
方法还会获取配置对象作为第二个参数。
app.UseXRay("MyApp", configuration);
配置分段命名策略
AWS X-Ray 使用服务名称 标识您的应用程序和将其与您的应用程序使用的其他应用程序、数据库、外部 API 和 AWS 资源区分开。当 X-Ray 开发工具包为传入请求生成分段时,它将在分段的名称字段中记录您的应用程序的服务名称。
X-Ray 开发工具包可以 HTTP 请求标头中的主机名为分段命名。但是,此标头可伪造,这可能导致您的服务地图中出现意外节点。为防止对伪造的主机标头的请求导致 SDK 不正确地命名分段,您必须为传入请求指定默认名称。
如果您的应用程序处理对多个域的请求,您可以将开发工具包配置为使用动态命名策略以在分段名称中反映此行为。通过动态命名策略,开发工具包可将主机名用于与预期模式匹配的请求,并将默认名称应用于与预期模式不匹配的请求。
例如,您可能有一个处理对三个子域(www.example.com
、api.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
"));