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

在 Amazon Lambda 中检测 Java 代码

Lambda 与 Amazon X-Ray 集成,以帮助您跟踪、调试和优化 Lambda 应用程序。您可以在某个请求遍历应用程序中的资源(其中可能包括 Lambda 函数和其他 Amazon 服务)时,使用 X-Ray 跟踪该请求。

要将跟踪数据发送到 X-Ray,您可以使用以下两个软件开发工具包 (SDK) 库之一:

ADOT 和 X-Ray SDK 二者均提供了将遥测数据发送到 X-Ray 服务的方法。然后,您可以使用 X-Ray 查看、筛选和获得对应用程序性能指标的洞察,从而发现问题和优化机会。

重要

ADOT 是分析 Lambda 函数的首选方法。我们建议将 ADOT 用于所有新应用程序。但是,由于 OpenTeleMetry 提供的灵活性,Lambda 函数调用可能会遇到冷启动延迟增加的情况。如果您正在针对低延迟进行优化并且不需要 OpenTelemetry 的高级功能(例如遥测关联和动态可配置的后端目标),则可能需要使用基于 ADOT 的 Amazon X-Ray SDK。

使用 ADOT 分析您的 Java 函数

ADOT 提供完全托管式 Lambda ,这些层使用 OTel SDK,将收集遥测数据所需的一切内容打包起来。通过使用此层,您可以在不必修改任何函数代码的情况下,对您的 Lambda 函数进行分析。您还可以将您的层配置为对 OTel 进行自定义初始化。有关更多信息,请参阅 ADOT 文档中的适用于 Lambda 上的 ADOT 收集器的自定义配置

对于 Java 运行时,您可以在两个层之间选择使用:

使用 X-Ray SDK 分析您的 Java 函数

要记录关于您的函数对应用程序中的其他资源和服务进行调用的数据,您可以将适用于 Java 的 X-Ray SDK 添加到您的构建配置中。以下示例显示了一种 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' ... }

在添加正确的依赖项并进行必要的代码更改后,请通过 Lambda 控制台或 API 激活函数配置中的跟踪。

使用 Lambda 控制台激活跟踪

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

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

  2. 选择函数。

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

  4. 选择 Edit(编辑)。

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

  6. 选择保存

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

注意

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

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


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

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


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

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

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

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

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

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

定价

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

在层中存储运行时依赖项 (X-Ray SDK)

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

以下示例显示了存储适用于 Java 的 Amazon SDK for Java 和 X-Ray SDK 的 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

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

为依赖项创建层要求更改构建配置才能在部署之前生成层存档。有关工作示例,请参阅 GitHub 上的 java-basic 示例应用程序。

示例应用程序中的 X-Ray 跟踪 (X-Ray SDK)

本指南的 GitHub 存储库包括演示如何使用 X-Ray 跟踪的示例应用程序。每个示例应用程序都包含用于轻松部署和清理的脚本、一个 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 层存储运行时依赖项。


        X-Ray 服务映射以及调用 Lambda API 的函数。

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