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

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

使用适用于 Node.js 的 X-Ray 开发工具包跟踪传入请求

您可以在 Amazon EC2 中的 EC2 实例上使用适用于 Node.js 的 X-Ray 开发工具包跟踪您的 Express 和 Rtify 应用程序所服务的传入 HTTP 请求,Amazon Elastic Beanstalk或亚马逊云服务器。

适用于 Node.js 的 X-Ray 开发工具包为使用 Express 和 Rtify 框架的应用程序提供中间件。在您将 X-Ray 中间件添加到应用程序时,适用于 Node.js 的 X-Ray 开发工具包会为每个采样请求创建一个分段。此分段包括 HTTP 请求的计时、方法和处置。其他分析会在此分段上创建子分段。

注意

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

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

转发的请求

如果负载均衡器或其他中介机构将请求转发到您的应用程序,则 X-Ray 会从X-Forwarded-For标头,而不是来自 IP 数据包中的源 IP。为转发请求记录的客户端 IP 可能是伪造的,因此不应该被信任。

在转发请求时,SDK 会在分段中设置附加字段来指示此行为。如果区段包含字段x_forwarded_for设置为true,则客户端 IP 从X-Forwarded-For标头。

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

  • HTTP method (HTTP 方法)— GET、POST、PUT、DELETE 等。

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

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

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

  • User agentuser-agent从请求复制。

  • 内容长度content-length从响应复制。

使用 Express 跟踪传入请求

要使用 Express 中间件,请在定义路由前,先初始化开发工具包客户端并使用 express.openSegment 函数返回的中间件。

例 app.js - Express

var app = express(); var AWSXRay = require('aws-xray-sdk'); app.use(AWSXRay.express.openSegment('MyApp')); app.get('/', function (req, res) { res.render('index'); }); app.use(AWSXRay.express.closeSegment());

定义路由后,在定义路由后使用express.closeSegment,以便处理适用于 Node.js 的 X-Ray 开发工具包返回的任何错误。

使用 Rtify 跟踪传入请求

要使用 Restify 中间件,请初始化开发工具包客户端并运行 enable。将您的 Restify 服务器和分段名传递给它。

例 app.js-Rest

var AWSXRay = require('aws-xray-sdk'); var AWSXRayRestify = require('aws-xray-sdk-restify'); var restify = require('restify'); var server = restify.createServer(); AWSXRayRestify.enable(server, 'MyApp')); server.get('/', function (req, res) { res.render('index'); });

配置分段命名策略

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

X-Ray 软件开发工具包可以在 HTTP 请求标头中命名主机名后面的段。但是,可以伪造此标头,这可能会导致服务图中出现意外节点。若要防止 SDK 因使用伪造主机标头的请求而不正确地命名段,您必须为传入请求指定默认名称。

如果应用程序为多个域提供请求,则可以将 SDK 配置为使用动态命名策略在段名称中反映这一点。动态命名策略允许 SDK 对与预期模式匹配的请求使用主机名,并将默认名称应用于不匹配的请求。

例如,您可能有一个应用程序为三个子域提供服务 —www.example.comapi.example.com, 和static.example.com。您可以将动态命名策略与模式*.example.com为每个子域标识具有不同名称的区段,从而在服务图上生成三个服务节点。如果您的应用程序收到的主机名与模式不匹配的请求,您将在服务映射上看到第四个节点,其中包含您指定的备用名称。

要对所有请求分段使用相同名称,请在初始化中间件时指定应用程序的名称,如前几节所示。

注意

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

动态命名策略定义一个主机名应匹配的模式和一个在 HTTP 请求中的主机名与该模式不匹配时要使用的默认名称。要动态命名分段,请使用 AWSXRay.middleware.enableDynamicNaming

例 app.js-动态分段名称

如果请求中的主机名与模式 *.example.com 匹配,请使用主机名。否则,请使用 MyApp

var app = express(); var AWSXRay = require('aws-xray-sdk'); app.use(AWSXRay.express.openSegment('MyApp')); AWSXRay.middleware.enableDynamicNaming('*.example.com'); app.get('/', function (req, res) { res.render('index'); }); app.use(AWSXRay.express.closeSegment());