在 Amazon Lambda 中检测 Ruby 代码 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在 Amazon Lambda 中检测 Ruby 代码

Lambda 与 Amazon X-Ray 集成使您能够跟踪、调试和优化 Lambda 应用程序。在请求遍历应用程序中的资源(从前端 API 到后端的存储和数据库)时,您可以使用 X-Ray 跟踪请求。只需将 X-Ray 开发工具包库添加到构建配置中,就可以记录您的函数对Amazon服务进行的任何调用的错误和延迟。

在配置活跃跟踪后,您可以通过应用程序观察特定请求。X-Ray 服务图将显示有关应用程序及其所有组件的信息。来自错误处理器示例应用程序的以下示例显示了具有两个函数的应用程序。主函数处理事件,有时会返回错误。顶部的第二个函数处理第一个日志组中出现的错误,并使用软件开发工具包调用 X-Ray、Amazon Amazon Simple Storage Service (Amazon S3) 和 Amazon CloudWatch Logs。


        一幅显示 X-Ray 中两个独立应用程序及其各自服务地图的图

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

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

  2. 选择函数。

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

  4. 选择编辑

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

  6. 选择 Save(保存)。

定价

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

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

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

注意

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

使用活动跟踪时,Lambda 会每个跟踪记录 2 个分段,这些分段将在服务图上创建两个节点。下图突出显示了错误处理程序示例应用程序中的主函数的这两个节点。


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

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


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

此示例将展开函数分段,以显示其三个子分段。

  • 初始化 – 表示加载函数和运行初始化代码所花费的时间。此子分段仅对由您的函数的每个实例处理的第一个事件显示。

  • 调用 – 表示执行处理程序代码花费的时间。

  • 开销 – 表示 Lambda 运行时为准备处理下一个事件而花费的时间。

您可以使用处理程序代码来记录元数据并跟踪下游调用。要记录有关您的处理程序对其他资源和服务进行调用的详细信息,请使用 X-Ray SDK for Ruby。要获取开发工具包,请将 aws-xray-sdk 包添加到应用程序的依赖项中。

blank-ruby/function/Gemfile
# Gemfile source 'https://rubygems.org' gem 'aws-xray-sdk', '0.11.4' gem 'aws-sdk-lambda', '1.39.0' gem 'test-unit', '3.3.5'

要检测 Amazon 开发工具包客户端,需要在初始化代码中创建客户端后运行 aws-xray-sdk/lambda 模块。

blank-ruby/function/lambda_function.rb – 跟踪Amazon开发工具包客户端
# lambda_function.rb require 'logger' require 'json' require 'aws-sdk-lambda' $client = Aws::Lambda::Client.new() $client.get_account_settings() require 'aws-xray-sdk/lambda' def lambda_handler(event:, context:) logger = Logger.new($stdout) ...

使用活动跟踪时,Lambda 会每个跟踪记录 2 个分段,这些分段将在服务图上创建两个节点。下图突出显示了错误处理程序示例应用程序中的主函数的这两个节点。


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

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


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

此示例将展开函数分段,以显示其三个子分段。

  • 初始化 – 表示加载函数和运行初始化代码所花费的时间。此子分段仅对由您的函数的每个实例处理的第一个事件显示。

  • 调用 – 表示执行处理程序代码花费的时间。

  • 开销 – 表示 Lambda 运行时为准备处理下一个事件而花费的时间。

您还可以分析 HTTP 客户端、记录 SQL 查询以及使用注释和元数据创建自定义子段。有关更多信息,请参阅 Amazon X-Ray 开发人员指南中的 X-Ray SDK for Ruby

使用 Lambda API 启用活动跟踪

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

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

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

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

使用 Amazon CloudFormation 启用主动跟踪

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

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

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

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

在层中存储运行时依赖项

如果您使用 X-Ray 开发工具包来分析Amazon开发工具包客户端和您的函数代码,则您的部署程序包可能会变得相当大。为了避免每次更新函数代码时上载运行时依赖项,请将 X-Ray SDK 打包到 Lambda 层中。

以下示例显示存储 X-Ray SDK for Ruby 的 AWS::Serverless::LayerVersion 资源。

template.yml – 依赖项层
Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: function/. Tracing: Active Layers: - !Ref libs ... libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-ruby-lib Description: Dependencies for the blank-ruby sample app. ContentUri: lib/. CompatibleRuntimes: - ruby2.5

使用此配置,仅在更改运行时依赖项时您才会更新库层。由于函数部署软件包仅包含您的代码,因此可以帮助缩短上传时间。

为依赖项创建层需要更改构建才能在部署之前生成层存档。有关工作示例,请参阅 blank-ruby 示例应用程序。