AWS X-Ray 概念 - AWS X-Ray

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

AWS X-Ray 概念

AWS X-Ray 以分段形式接收来自服务的数据。然后,X-Ray 将具有共同请求的分段分组为跟踪。X-Ray 处理跟踪以生成服务图,服务图提供您的应用程序的可视化表示形式。

分段

运行您的应用程序逻辑的计算资源发送关于其工作的数据作为分段。分段提供资源的名称、有关请求的详细信息以及有关所完成工作的详细信息。例如,当 HTTP 请求到达您的应用程序时,它可以记录下列相关数据:

  • 主机 - 主机名、别名或 IP 地址

  • 请求 - 方法,客户端地址、路径、用户代理

  • 响应 - 状态、内容

  • 所完成工作 - 开始和结束时间、子分段

  • 发生的错误 - 错误、故障和异常,包括自动捕获的异常堆栈。

X-Ray 跟踪的分段数据

X-Ray SDK 从请求和响应标头、应用程序中的代码以及有关其运行 AWS 资源的元数据中收集信息。您可以通过修改应用程序配置或代码来选择要收集的数据,以检测传入的请求、下游请求和 AWS SDK 客户端。

转发的请求

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

您可以使用 X-Ray 开发工具包来记录其他信息,如注释和元数据。有关分段和子分段中记录的结构和信息的详情,请参阅 AWS X-Ray 分段文档。分段文档的大小最大可以是 64KB。

子分段

分段可以将关于已完成工作的数据细分为子分段。子分段提供有关您的应用程序为满足原始请求而进行的下游调用的更精细的计时信息和详情。子分段可以包含有关调用 AWS 服务、外部 HTTP API 或 SQL 数据库的更多详细信息。您甚至可以定义任意子分段以检测特定函数或应用程序中的代码行。

子分段提供更精细的信息

对于不发送自己的区段的服务,例如 Amazon DynamoDB,X-Ray 使用子分段在跟踪地图上生成推断的区段和下游节点。这样您可以查看所有下游依赖项,即使它们不支持跟踪或者是外部依赖项也是如此。

子分段表示从您应用程序的角度将下游调用视为客户端。如果还会检测下游服务,则它发送的分段会替换从上游客户端的子分段生成的推断分段。服务图上的节点使用来自服务分段的信息 (如果可用),而两个节点之间的边缘节点使用上游服务的子分段。

例如,当您使用经过 AWS 检测的 SDK 客户端调用 DynamoDB 时,X-Ray SDK 会记录该调用的子分段。DynamoDB 不发送分段,因此跟踪中的推断分段、服务图上的 DynamoDB 节点以及您的服务与 DynamoDB 之间的边缘节点全都包含来自子分段的信息。

检测过的应用程序与 DynamoDB 之间的边缘节点。

当您使用检测的应用程序调用另一个检测的服务时,下游服务会发送自己的分段,以从自己的角度记录上游服务在子分段中记录的相同调用。在服务图中,这两个服务的节点都包含来自这些服务的分段的计时和错误信息,而它们之间的边缘节点包含来自上游服务的分段的信息。

一个检测的应用程序,该应用程序调用另一个检测的应用程序。

这两个视角都非常有用,因为下游服务精确地记录该应用程序开始和结束处理请求的时间,而上游服务记录往返延迟,包括在两个服务之间传输时请求所花费的时间。

服务图

X-Ray 使用您的应用程序发送的数据来生成服务图。向 X-Ray 发送数据的每个 AWS 资源都以服务形式出现在图表中。边缘连接协同工作以服务于请求的服务。边缘将客户端连接到您的应用程序,又将您的应用程序连接到它所使用的下游服务和资源。

服务名称

分段的 name 应该与生成该分段的服务的域名或逻辑名称相匹配。但是,并未强制执行此规则。任何拥有 PutTraceSegments 权限的应用程序均可发送任何名称的分段。

服务图是一个 JSON 文档,其中包含有关构成您的应用程序的服务和资源的信息。X-Ray 控制台使用服务图来生成可视化形式或服务地图

追踪地图

对于分布式应用程序,X-Ray 将处理具有相同跟踪 ID 的请求的服务的节点组合成一个服务图。请求命中的第一个服务会添加一个跟踪标头,该跟踪标头在前端及其所调用的服务之间传播。

例如,Scorekeep 运行一个调用微服务( AWS Lambda 函数)的 Web API,通过使用 Node.js 库来生成随机名称。适用于 Java 的 X-Ray 开发工具包生成跟踪 ID 并将其包含在对 Lambda 的调用中。Lambda 发送跟踪数据并将跟踪 ID 传递给函数。适用于 Node.js 的 X-Ray 开发工具包 也使用跟踪 ID 发送数据。因此,API、Lambda 服务和 Lambda 函数的节点在跟踪地图上都显示为独立但相互连接的节点。

服务图数据的保留期为 30 天。

跟踪

跟踪 ID 可跟踪请求通过您的应用程序的路径。跟踪会收集单个请求生成的所有分段。该请求通常是一个 HTTP GET 或 POST 请求,它经过负载均衡器,命中您的应用程序代码,生成对其他 AWS 服务或外部 Web API 的下游调用。HTTP 请求与之交互的第一个受支持服务将向请求中添加一个跟踪 ID 标头,并向下游传播该标头以跟踪延迟、处置和其他请求数据。

跟踪的时间线视图,用于收集单个请求生成的所有分段

请参阅 AWS X-Ray 定价,了解 X-Ray 跟踪的计费方式。跟踪数据保留 30 天。

采样

为确保高效跟踪并为应用程序所服务的请求提供代表性样本,X-Ray 开发工具包应用采样算法来确定跟踪哪些请求。默认情况下,X-Ray 开发工具包每秒记录第一个请求,以及任何其他请求的百分之五。

为避免在您入门时产生服务费用,保守做法是使用默认采样率。您可以配置 X-Ray 以修改默认采样规则并配置基于服务或请求的属性应用采样的其他规则。

例如,您可能希望禁用采样,并跟踪对修改状态或处理用户或交易的调用的所有请求。对于量非常大的只读调用,例如后台轮询、运行状况检查或连接维护,您采用较低的采样率仍可获取足够的数据来了解出现的任何问题。

有关更多信息,请参阅配置采样规则

跟踪标头

所有请求都被跟踪,直到一个可配置的最低限度。在达到这一最低限度后,只有一部分请求被跟踪,以避免不必要的开销。采样决策和跟踪 ID 添加到名为 跟踪标头X-Amzn-Trace-Id的 HTTP 请求中。请求命中的第一个 X-Ray 集成服务会添加一个跟踪标头,该跟踪标头由 X-Ray 开发工具包读取并包含在响应中。

例 具有根跟踪 ID 和采样决策的跟踪标头
X-Amzn-Trace-Id: Root=1-5759e988-bd862e3fe1be46a994272793;Sampled=1
跟踪标头安全性

跟踪标头可以源自 X-Ray SDK AWS 服务、或客户端请求。应用程序可以从传入请求中删除 X-Amzn-Trace-Id,避免由于用户向其请求中添加跟踪 ID 或采样决策而导致出现问题。

如果请求来自检测的应用程序,跟踪标头还可以包含父分段 ID。例如,如果应用程序使用检测的 HTTP 客户端调用下游 HTTP Web API,则 X-Ray 开发工具包将原始请求的分段 ID 添加到下游请求的跟踪标头中。为下游请求提供服务的检测应用程序,可以记录父分段 ID 以连接两个请求。

例 跟踪标头带有根跟踪 ID、父分段 ID 和采样决策
X-Amzn-Trace-Id: Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1

LineageLambda AWS 服务 和其他人可以将其附加到跟踪标头中,作为其处理机制的一部分,因此不应直接使用。

例 跟踪带有世系的标头
X-Amzn-Trace-Id: Root=1-5759e988-bd862e3fe1be46a994272793;Sampled=1;Lineage=a87bd80c:1|68fd508a:5|c512fbe3:2

筛选条件表达式

即使使用采样,复杂应用程序也会生成大量数据。 AWS X-Ray 控制台提供服务图的 easy-to-navigate 视图。它显示运行状况和性能信息,帮助您识别问题和机会,用于优化应用程序。对于高级跟踪,您可以细化以跟踪单个请求,或者使用筛选表达式来查找与特定路径或用户相关的跟踪。

深入查看各个请求的跟踪

通过扩展筛选条件表达式,X-Ray 也支持组功能。通过使用筛选条件表达式,您可以定义接受跟踪进入组的标准。

您可以按名称或按亚马逊资源名称 (ARN) 调用该组,以生成其自己的服务图表、跟踪摘要和亚马逊 CloudWatch 指标。创建组后,将根据组的筛选条件表达式检查传入跟踪,因为它们存储在 X-Ray 服务中。与每个条件匹配的跟踪数量的指标将发布到 CloudWatch 每分钟。

更新组的筛选条件表达式不会更改已记录的数据。更新仅应用于后续跟踪。这可能会生成新旧表达式的合并图。为避免发生这种情况,请删除当前群组并创建一个新的群组。

注意

群组按检索到的符合筛选条件表达式的追踪数量计费。有关更多信息,请参阅AWS X-Ray 定价

有关组的更多信息,请参阅 配置组

注释和元数据

在检测应用程序时,X-Ray SDK 会记录有关传入和传出的请求、使用的 AWS 资源以及应用程序本身的信息。您可以向分段文档中添加其他信息作为注释和元数据。注释和元数据在跟踪级别汇总,可以添加到任何分段或子分段。

注释 是简单的键-值对,经编制索引后用于筛选条件表达式。使用注释记录要用于对控制台中的跟踪进行分组的数据或在调用 GetTraceSummaries API 时使用的数据。

X-Ray 最多为每个跟踪的 50 条注释编制索引。

元数据是具有任何类型值的键-值对,包括对象和列表,但没有编制索引。使用元数据记录要存储在跟踪中但不需要用于搜索跟踪的数据。

您可以在 CloudWatch 控制台的跟踪详细信息页面的区段或子区段详细信息窗口中查看注释和元数据。

注释和元数据可在控制台的区段或子区段详细信息中查看 CloudWatch

错误、故障和异常

X-Ray 跟踪在您的应用程序代码中发生的错误以及下游服务返回的错误。错误分类如下。

  • Error - 客户端错误(400 系列错误)

  • Fault - 服务器故障(500 系列错误)

  • Throttle - 限制错误(429 请求过多)

如果在您的应用程序为某个检测的请求提供服务时发生异常,X-Ray 开发工具包会记录有关异常的详细信息,包括堆栈跟踪(如果可用)。您可以在 X-Ray 控制台的分段详细信息下方查看异常。