使用 AWS X-Ray 可视化 Lambda 函数调用 - AWS Lambda

使用 AWS X-Ray 可视化 Lambda 函数调用

您可以使用 AWS X-Ray 来可视化应用程序的组件、确定性能瓶颈以及对导致错误的请求进行故障排除。您的 Lambda 函数会将跟踪数据发送到 X-Ray,X-Ray 将处理这些数据以生成服务映射和可搜索的跟踪摘要。

如果您在调用函数的服务中启用了 X-Ray 跟踪,则 Lambda 会自动将跟踪发送到 X-Ray。上游服务(例如 Amazon API Gateway)或通过 X-Ray 开发工具包检测的托管于 Amazon EC2 上的应用程序将对传入请求进行采样,并添加跟踪头来指示 Lambda 是否发送跟踪。上游消息创建者(例如 Amazon SQS)的跟踪会自动链接到下游 Lambda 函数的跟踪,从而创建整个应用程序的端到端视图。有关更多信息,请参阅《AWS X-Ray 开发人员指南》中的 Tracing event-driven applications(跟踪事件驱动型应用程序)。

注意

目前,使用 Amazon Managed Streaming for Apache Kafka(Amazon MSK)、自行管理的 Apache Kafka、具有 ActiveMQ 及 RabbitMQ 或 Amazon DocumentDB 事件源映射的 Amazon MQ 的 Lambda 函数,不支持 X-Ray 跟踪。

要使用控制台切换 Lambda 函数的活动跟踪,请按照以下步骤操作:

打开活跃跟踪
  1. 打开 Lamba 控制台的 Functions(函数)页面。

  2. 选择函数。

  3. 选择 Configuration(配置),然后选择 Monitoring and operations tools(监控和操作工具)。

  4. 选择编辑

  5. X-Ray 下方,开启 Active tracing(活动跟踪)。

  6. 选择保存

您的函数需要权限才能将跟踪数据上载到 X-Ray。在 Lambda 控制台中激活跟踪后,Lambda 会将所需权限添加到函数的执行角色。如果没有,请将 AWSXRayDaemonWriteAccess 策略添加到执行角色。

X-Ray 无法跟踪对应用程序的所有请求。X-Ray 将应用采样算法确保跟踪有效,同时仍会提供所有请求的一个代表性样本。采样率是每秒 1 个请求和 5% 的其他请求。您无法为函数配置此 X-Ray 采样率。

了解 X-Ray 跟踪

在 X-Ray 中,跟踪记录有关由一个或多个服务处理的请求的信息。Lambda 会每个跟踪记录 2 个分段,这些分段将在服务图上创建两个节点。下图突出显示了这两个节点:

具有单个函数的 X-Ray 服务地图。

位于左侧的第一个节点表示接收调用请求的 Lambda 服务。第二个节点表示特定的 Lambda 函数。

针对 Lambda 服务记录的分段 AWS::Lambda 涵盖了准备 Lambda 执行环境所需的所有步骤。这包括调度 MicroVM、使用已配置的资源创建或解冻执行环境、下载函数代码和所有层。

AWS::Lambda::Function 分段表示函数完成的工作。

注意

AWS 目前正在实施对 Lambda 服务的更改。由于这些更改,您可能会看到 AWS 账户 中不同 Lambda 函数发出的系统日志消息和跟踪分段的结构和内容之间存在细微差异。

此更改会影响函数段的子分段。以下段落介绍了这些子分段的新旧格式。

这些更改将在未来几周内实施,除中国和 GovCloud 区域外,所有 AWS 区域 的函数都将过渡到使用新格式的日志消息和跟踪分段。

旧式 AWS X-Ray Lambda 分段结构

AWS::Lambda 分段的旧式 X-Ray 结构如下所示:

该示意图显示了包含调用分段的旧式 X-Ray 跟踪结构

在此格式中,函数分段包含 InitializationInvocationOverhead 的子分段。(仅限 Lambda SnapStart)还有一个 Restore 子分段(此示意图中未显示)。

Initialization 子分段表示 Lambda 执行环境生命周期的初始化阶段。在此阶段,Lambda 将初始化扩展、初始化运行时并运行函数的初始化代码。

Invocation 子段表示 Lambda 调用函数处理程序的调用阶段。这从运行时和扩展注册开始,在运行时准备好发送响应时结束。

(仅限 Lambda SnapStart)Restore 子分段会显示 Lambda 还原快照、加载运行时(JVM)和运行任何 afterRestore 运行时钩子所用的时间。恢复快照的过程可能包含在 MicroVM 之外的活动上花费的时间。该时间在 Restore 子分段中报告。您无需为在 microVM 之外还原快照所花费的时间付费。

Overhead 子段表示在运行时发送响应和下次调用信号之间出现的阶段。在此期间,运行时会完成与调用相关的所有任务,并准备冻结沙盒。

重要

您可以使用 X-Ray SDK 扩展 Invocation 子分段以及进行下游调用、注释和元数据的额外子分段。您无法直接访问函数分段,也无法记录在处理程序调用范围之外完成的工作。

有关 Lambda 执行环境阶段的更多信息,请参阅 了解 Lambda 执行环境生命周期

该示意图显示了使用旧式 X-Ray 结构的示例跟踪。

该示意图显示了包含调用分段的旧式 X-Ray 跟踪示例

注意示例中的两个分段。两者都命名为 my-function,但其中一个函数具有 AWS::Lambda 源,另一个则具有 AWS::Lambda::Function 源。如果 AWS::Lambda 分段显示错误,则表示 Lambda 服务存在问题。如果 AWS::Lambda::Function 分段显示错误,则说明函数存在问题。

注意

有时,您可能会注意到 X-Ray 跟踪中的函数初始化阶段与调用阶段之间存在较大间隔。对于使用预置并发的函数,这是因为 Lambda 会在调用之前尽早初始化函数实例。对于使用非预留(按需)并发的函数,即使没有调用,Lambda 也可能会主动初始化函数实例。直观上看,这两种情况都表现为初始化阶段与调用阶段之间的时间间隔。

新式 AWS X-Ray Lambda 分段结构

AWS::Lambda 分段的新式 X-Ray 结构如下所示:

该示意图显示了不含调用分段的新式 X-Ray 跟踪结构

在此新格式中,Init 子分段像以前一样表示 Lambda 执行环境生命周期的初始化阶段。

新格式中没有调用分段。而是将客户子分段直接附加到 AWS::Lambda::Function 分段 此分段包含以下指标作为注释:

  • aws.responseLatency:函数运行所用的时间

  • aws.responseDuration:将响应传递给客户所用的时间

  • aws.runtimeOverhead:运行时完成所需的额外时间

  • aws.extensionOverhead:扩展完成所需的额外时间

该示意图显示了使用新式 X-Ray 结构的示例跟踪。

该示意图显示了不含调用分段的新式 X-Ray 跟踪示例

注意示例中的两个分段。两者都命名为 my-function,但其中一个函数具有 AWS::Lambda 源,另一个则具有 AWS::Lambda::Function 源。如果 AWS::Lambda 分段显示错误,则表示 Lambda 服务存在问题。如果 AWS::Lambda::Function 分段显示错误,则说明函数存在问题。

有关 Lambda 中特定于语言的跟踪简介,请参阅以下主题:

有关支持活动检测的服务的完整列表,请参阅 AWS X-Ray 开发人员指南中的受支持的AWS服务

执行角色权限

Lambda 需要以下权限才能将跟踪数据发送到 X-Ray。将这些权限添加到您的函数的执行角色中。

这些权限包含在 AWSXRayDaemonWriteAccess 托管策略中。

AWS X-Ray 进程守护程序

X-Ray 开发工具包使用进程守护程序,而不是直接向 X-Ray API 发送跟踪数据。AWS X-Ray 进程守护程序是在 Lambda 环境中运行,并侦听包含分段和子分段的 UDP 流量的应用程序。它缓冲传入的数据并将其分批写入 X-Ray,从而减少跟踪调用所需的处理和内存开销。

Lambda 运行时允许进程守护程序最多占用函数配置内存的 3% 或 16 MB(以较大者为准)。如果您的函数在调用期间内存不足,则运行时首先终止进程守护程序以释放内存。

进程守护程序完全由 Lambda 管理,用户无法配置。通过调用函数生成的所有分段都记录在与 Lambda 函数相同的账户中。无法将进程守护程序配置为将这些分段重定向到任何其他账户。

有关更多信息,请参阅 X-Ray 开发人员指南中的 X-Ray 进程守护程序

使用 Lambda API 启用活动跟踪

要使用 AWS CLI 或 AWS 开发工具包管理跟踪配置,请使用以下 API 操作:

以下示例 AWS CLI 命令对名为 my-function 的函数启用活跃跟踪。

aws lambda update-function-configuration --function-name my-function \ --tracing-config Mode=Active

跟踪模式是发布函数版本时版本特定配置的一部分。您无法更改已发布版本上的跟踪模式。

使用 AWS CloudFormation 启用主动跟踪

要对 AWS CloudFormation 模板中的 AWS::Lambda::Function 资源激活跟踪,请使用 TracingConfig 属性。

function-inline.yml – 跟踪配置
Resources: function: Type: AWS::Lambda::Function Properties: TracingConfig: Mode: Active ...

对于 AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function 资源,请使用 Tracing 属性。

template.yml – 跟踪配置
Resources: function: Type: AWS::Serverless::Function Properties: Tracing: Active ...