在 Amazon Lambda 中检测 Java 代码
Lambda 与 Amazon X-Ray 集成使您能够跟踪、调试和优化 Lambda 应用程序。在请求遍历应用程序中的资源(从前端 API 到后端的存储和数据库)时,您可以使用 X-Ray 跟踪请求。只需将 X-Ray 开发工具包库添加到构建配置中,就可以记录您的函数对Amazon服务进行的任何调用的错误和延迟。
X-Ray 服务地图显示了通过您的应用程序的请求流。来自错误处理器示例应用程序的以下示例显示了具有两个函数的应用程序。主函数处理事件,有时会返回错误。次函数处理主函数的日志组中显示的错误,并使用 Amazon 开发工具包来调用 X-Ray、Amazon S3 和 Amazon CloudWatch Logs。

要跟踪没有跟踪标头的请求,请在函数的配置中启用活动跟踪。
启用活动跟踪
打开 Lamba 控制台的 Functions(函数)页面
。 -
选择函数。
选择 Configuration(配置),然后选择 Monitoring tools(监控工具)。
选择 Edit。
-
在 X-Ray 下,启用 Active tracing(活动跟踪)。
-
选择保存。
X-Ray 有一款永久免费套餐。超出免费套餐阈值后,X-Ray 会对跟踪存储和检索进行收费。有关详细信息,请参阅 Amazon X-Ray 定价
您的函数需要权限才能将跟踪数据上载到 X-Ray。在 Lambda 控制台中启用活动跟踪后,Lambda 会将所需权限添加到函数的执行角色。如果没有,请将 AWSXRayDaemonWriteAccess
X-Ray 应用采样算法确保跟踪有效,同时为应用程序所服务的请求提供代表性样本。默认采样规则是每秒 1 个请求和 5% 的其他请求。无法为 Lambda 函数配置此采样率。
启用活动跟踪后,Lambda 会记录对调用子集的跟踪。Lambda 会记录两个片段,从而在服务地图上创建两个节点。第一个节点表示接收调用请求的 Lambda 服务。第二个节点由函数的运行时记录。

要记录您的函数对其他资源和服务进行的调用的详细信息,请将 X-Ray SDK for Java 添加到您的构建配置中。以下示例显示 Gradle 构建配置,其中包括启用 Amazon SDK for Java 2.x 客户端自动分析的库。
例 build.gradle
dependencies { implementation platform('software.amazon.awssdk:bom:2.10.73')
implementation platform('com.amazonaws:aws-xray-recorder-sdk-bom:2.4.0')
implementation 'software.amazon.awssdk:lambda'implementation 'com.amazonaws:aws-xray-recorder-sdk-core' implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-core' implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2' implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2-instrumentor'
... }
以下示例显示了一个具有 2 个分段的跟踪。两个分段都被命名为 my-function,但是其中一个为 AWS::Lambda
类型,另一个为 AWS::Lambda::Function
类型。将函数分段展开可显示其子分段。

第一个分段表示由 Lambda 服务处理的调用请求。第二个分段记录由函数完成的工作。函数分段有 3 个子分段。
-
初始化 – 表示加载函数和运行初始化代码所花费的时间。此子分段仅对于由函数的每个实例处理的第一个事件才显示。
-
调用 – 表示处理程序代码完成的工作。通过检测您的代码,您可以使用额外的子分段来扩展此子分段。
-
开销 – 表示 Lambda 运行时为准备处理下一个事件而完成的工作。
您还可以分析 HTTP 客户端、记录 SQL 查询以及使用注释和元数据创建自定义子段。有关更多信息,请参阅 Amazon X-Ray 开发人员指南中的 Amazon X-Ray SDK for Java。
使用 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 启用主动跟踪
要对 AWS::Lambda::Function
模板中的 Amazon CloudFormation 资源启用活动跟踪,请使用 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开发工具包客户端和您的函数代码,则您的部署程序包可能会变得相当大。为了避免每次更新函数代码时上载运行时依赖项,请将它们打包到 Lambda 层中。
以下示例显示存储 SDK for Java 和 X-Ray SDK for Java 的 AWS::Serverless::LayerVersion
资源。
例 template.yml
Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: build/distributions/blank-java.zip Tracing: Active
Layers: - !Ref libs
...libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-java-lib Description: Dependencies for the blank-java sample app. ContentUri: build/blank-java-lib.zip CompatibleRuntimes: - java8
使用此配置,只有在更改运行时依赖项时才会更新库层。函数部署包仅包含您的代码。当您更新函数代码时,上载速度比在部署包中包含依赖项要快得多。
为依赖项创建层要求更改构建配置才能在部署之前生成层存档。有关工作示例,请参阅 java-basic
示例应用程序中的跟踪
本指南的 GitHub 存储库包括演示如何使用跟踪的示例应用程序。每个示例应用程序都包含用于轻松部署和清理的脚本、一个 Amazon SAM 模板和支持资源。
Java 中的 Lambda 应用程序示例
-
blank-java
– 一个 Java 函数,用于显示 Lambda 的 Java 库、日志记录、环境变量、层、Amazon X-Ray 跟踪、单元测试和Amazon开发工具包的使用情况。 -
java-basic
– 具有单元测试和变量日志记录配置的最小 Java 函数。 -
java-events
– 此最小 Java 函数使用 aws-lambda-java-events 库的最新版本(3.0.0 及更高版本)。这些示例不需要Amazon开发工具包作为依赖项。 -
s3-java
– 此 Java 函数可处理来自 Amazon S3 的通知事件,并使用 Java 类库 (JCL) 从上载的图像文件创建缩略图。
所有示例应用程序都为 Lambda 功能启用了活动跟踪。blank-java
应用程序显示 Amazon SDK for Java 2.x 客户端的自动分析、用于测试的段管理、自定义子段以及使用 Lambda 层存储运行时依赖项。

blank-java
示例应用程序中的此示例显示了 Lambda 服务、函数和 Lambda API 的节点。该函数调用 Lambda API 来监控 Lambda 中的存储使用情况。