在 Amazon Lambda 中检测 Python 代码
Lambda 与 Amazon X-Ray 集成,以帮助您跟踪、调试和优化 Lambda 应用程序。您可以在某个请求遍历应用程序中的资源(其中可能包括 Lambda 函数和其他 Amazon 服务)时,使用 X-Ray 跟踪该请求。
要将跟踪数据发送到 X-Ray,您可以使用以下两个软件开发工具包 (SDK) 库之一:
-
适用于 OpenTelemetry 的 Amazon 发行版 (ADOT)
– 一种安全、可供生产、支持 Amazon 的 OpenTelemetry (OTel) SDK 的分发版本。 -
Amazon X-Ray SDK for Python – 用于生成跟踪数据并将其发送到 X-Ray 的 SDK
ADOT 和 X-Ray SDK 二者均提供了将遥测数据发送到 X-Ray 服务的方法。然后,您可以使用 X-Ray 查看、筛选和获得对应用程序性能指标的洞察,从而发现问题和优化机会。
X-Ray 开发工具包是 Amazon 提供的紧密集成的分析解决方案的一部分。ADOT Lambda Layers 是全行业通用的跟踪分析标准的一部分,该标准通常会收集更多数据,但可能不适用于所有使用案例。您可以使用任一解决方案在 X-Ray 中实现端到端跟踪。要了解有关如何在两者之间进行选择的更多信息,请参阅在 Amazon Distro for Open Telemetry 和 X-Ray 开发工具包之间进行选择。
小节目录
使用 ADOT 分析您的 Python 函数
ADOT 提供完全托管式 Lambda 层,这些层使用 OTel SDK,将收集遥测数据所需的一切内容打包起来。通过使用此层,您可以在不必修改任何函数代码的情况下,对您的 Lambda 函数进行分析。您还可以将您的层配置为对 OTel 进行自定义初始化。有关更多信息,请参阅 ADOT 文档中的适用于 Lambda 上的 ADOT 收集器的自定义配置
对于 Python 运行时,可以添加 Amazon适用于 ADOT Python 的托管 Lambda 层以自动分析您的函数。此层适用于 arm64 和 x86_64 架构。有关如何添加此层的详细说明,请参阅 ADOT 文档中的适用于 OpenTelemetry 的 Amazon 发行版对于 Python 的 Lambda 支持
使用 X-Ray SDK 分析您的 Python 函数
要记录有关您的 Lambda 函数对应用程序中的其他资源进行调用的详细信息,您还可以使用 Amazon X-Ray SDK for Python。要获取开发工具包,请将 aws-xray-sdk
包添加到应用程序的依赖项中。
例 requirements.txt
jsonpickle==1.3 aws-xray-sdk==2.4.3
在函数代码中,可以通过使用 aws_xray_sdk.core
模块修补 boto3
库来分析 Amazon SDK 客户端。
例 函数 – 跟踪 Amazon SDK 客户端
import boto3 from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.core import patch_all logger = logging.getLogger() logger.setLevel(logging.INFO) patch_all() client = boto3.client('lambda') client.get_account_settings() def lambda_handler(event, context): logger.info('## ENVIRONMENT VARIABLES\r' + jsonpickle.encode(dict(**os.environ))) ...
在添加正确的依赖项并进行必要的代码更改后,请通过 Lambda 控制台或 API 激活函数配置中的跟踪。
使用 Lambda 控制台激活跟踪
要使用控制台切换 Lambda 函数的活动跟踪,请按照以下步骤操作:
打开活跃跟踪
打开 Lamba 控制台的函数页面
。 -
选择函数。
选择 Configuration(配置),然后选择 Monitoring and operations tools(监控和操作工具)。
选择 Edit(编辑)。
-
在 X-Ray 下方,开启 Active tracing(活动跟踪)。
-
选择 Save(保存)。
使用 Lambda API 激活跟踪
借助 Amazon CLI 或 Amazon SDK 在 Lambda 函数上配置跟踪,请使用以下 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 跟踪
您的函数需要权限才能将跟踪数据上载到 X-Ray。在 Lambda 控制台中激活跟踪后,Lambda 会将所需权限添加到函数的执行角色。如果没有,请将 AWSXRayDaemonWriteAccess
在配置活跃跟踪后,您可以通过应用程序观察特定请求。X-Ray 服务图将显示有关应用程序及其所有组件的信息。来自错误处理器示例应用程序的以下示例显示了具有两个函数的应用程序。主函数处理事件,有时会返回错误。位于顶部的第二个函数将处理第一个函数的日志组中显示的错误,并使用 Amazon SDK 调用 X-Ray、Amazon Simple Storage Service (Amazon S3) 和 Amazon CloudWatch Logs。

X-Ray 无法跟踪对应用程序的所有请求。X-Ray 将应用采样算法确保跟踪有效,同时仍会提供所有请求的一个代表性样本。采样率是每秒 1 个请求和 5% 的其他请求。
您无法为您的函数配置此 X-Ray 采样率。
使用活动跟踪时,Lambda 会每个跟踪记录 2 个分段,这些分段将在服务图上创建两个节点。下图突出显示了错误处理程序示例应用程序中的主函数的这两个节点。

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

此示例将展开函数分段,以显示其三个子分段。
-
初始化 – 表示加载函数和运行初始化代码所花费的时间。此子分段仅对由您的函数的每个实例处理的第一个事件显示。
-
调用 – 表示执行处理程序代码花费的时间。
-
开销 – 表示 Lambda 运行时为准备处理下一个事件而花费的时间。
您还可以分析 HTTP 客户端、记录 SQL 查询以及使用注释和元数据创建自定义子段。有关更多信息,请参阅 Amazon X-Ray 开发人员指南中的 Amazon X-Ray SDK for Python。
作为 Amazon 免费套餐的组成部分,您可以每月免费使用 X-Ray 跟踪,但不能超过一定限制。超出该阈值后,X-Ray 会对跟踪存储和检索进行收费。有关更多信息,请参阅 Amazon X-Ray 定价
在层中存储运行时依赖项 (X-Ray SDK)
如果您使用 X-Ray 开发工具包来分析Amazon开发工具包客户端和您的函数代码,则您的部署程序包可能会变得相当大。为了避免每次更新函数代码时上载运行时依赖项,请将 X-Ray SDK 打包到 Lambda 层中。
以下示例显示存储 Amazon X-Ray SDK for Python 的 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-python-lib Description: Dependencies for the blank-python sample app. ContentUri: package/. CompatibleRuntimes: - python3.8
使用此配置,仅在更改运行时依赖项时您才会更新库层。由于函数部署软件包仅包含您的代码,因此可以帮助缩短上传时间。
为依赖项创建层需要更改构建才能在部署之前生成层存档。有关工作示例,请参阅 blank-python