配合使用 AWS Lambda和 AWS X-Ray - AWS Lambda

配合使用 AWS Lambda和 AWS X-Ray

您可以使用 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. 选择 Save(保存)。

定价

作为 AWS 免费套餐的组成部分,您可以每月免费使用 X-Ray 跟踪,但不能超过一定限制。超出该阈值后,X-Ray 会对跟踪存储和检索进行收费。有关更多信息,请参阅 AWS X-Ray 定价

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

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

注意

您无法为您的函数配置此 X-Ray 采样率。

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

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

位于左侧的第一个节点表示接收调用请求的 Lambda 服务。第二个节点表示特定的 Lambda 函数。以下示例显示了一个包含这 2 个分段的跟踪。两者都命名为 my-function,但其中一个函数具有 AWS::Lambda 源,另一个则具有 AWS::Lambda::Function 源。如果 AWS::Lambda 分段显示错误,则表示 Lambda 服务存在问题。如果 AWS::Lambda::Function 分段显示错误,则说明函数存在问题。

一个 X-Ray 跟踪,它将显示特定 Lambda 调用的每个子分段的延迟。

该函数分段(AWS::Lambda::Function)带有 InitializationInvocationRestore(仅 Lambda SnapStart)和 Overhead 子分段。有关更多信息,请参阅 Lambda 执行环境生命周期

注意

X-Ray 将 Lambda 函数中未处理的异常视为 Error 状态。X-Ray 仅在 Lambda 遇到内部服务器错误时才会记录 Fault 状态。有关更多信息,请参阅《X-Ray 开发人员指南》中的 Errors, faults, and exceptions(错误、故障和异常)。

Initialization 子分段表示 Lambda 执行环境生命周期的初始化阶段。在此阶段,Lambda 会使用您配置的资源创建或取消冻结执行环境、下载函数代码和所有层、初始化扩展、初始化运行时以及运行函数的初始化代码。

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

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

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

注意

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

重要

在 Lambda 中,您可以使用 X-Ray 开发工具包来扩展 Invocation 子分段,使其具有用于进行下游调用、注释和元数据的更多子分段。您无法直接访问函数分段,也无法记录在处理程序调用范围之外完成的工作。

有关 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 ...