发布于: Aug 11, 2022

在 CodeGuru Profiler 代码审查中,分析组是可以进行一起分析的一组应用程序单元。通过上一文我们提到的 Profiler 代理将应用程序数据发送到单个分析组,然后对分析组中所有应用程序的数据进行聚合和分析。您可以通过 CodeGuru 控制台上的”分析组”页面对其进行管理,当然也可以通过 CLI和 API 的方式进行管理,您可以查看所有分析组、以及它的状态列表,或者创建或删除分析组。更多详细信息,请参阅 Setting up Amazon CodeGuru Profiler. 分析组支持对部署在多个主机上的单个应用程序进行分析,还可以分析两个相关的不同应用程序。

 

启用基于资源的授权

通过启用基于资源的授权,可以大大简化您的应用程序启用性能优化功能的步骤,之前必须每个应用程序的角色或者用户都必须通过控制台配置IAM 权限。同时该功能的上线也有助于减少配置错误,并可将应用程序快速载入分析组。 在本节中,我们将向您展示如何在 CodeGuru Profiler 控制台上授予所需的权限。首次载入应用程序时,管理员需要创建 IAM 角色或者用户,该角色或者用户被用于提交分析数据以及配置代理。此次新功能发布后,您只需要在下拉列表中选择您的用户或者角色即可成此设置,无需在 IAM 控制台上设置权限。

创建分析组(使用基于资源的授权方式)

创建启用了基于资源的授权的分析组,请完成以下步骤:

  • 在 CodeGuru Profiler 控制台上,选择”创建分析组”。

 

 

  • 设置名称为 test-group
  • 然后选择创建

 

 

现在,我们可以向您展示基于资源的授权增强功能。在通过代理上传性能数据之前,您需要对应用程序执行的角色或者用户已经创建好,比如我当前使用的是我的 IAM 用户“admin” 在本机执行代码,下面选择的时候就选择 admin 用户即可。

  • 创建成功后,您可以看到如下界面设置用户/角色具备上传性能数据权限到 CloudGuru Profiler 的权限
  • 下面选择我当前执行代码的 IAM 用户 admin
  • 选择 保存 ,这样,您已为分析组中的用户和角色设置了数据提交权限。

启动 Profiler 代理(不修改应用程序的方式)

接下来,我们通过一个完整的例子来演示如何在不修改应用程序代码的情况下启动 Profiler 代理。

先决条件

如果您想完成以下实验,需要先执行以下操作:

  • 拥有一个Amazon Web Services 账户
  • 一台可上网的笔记本电脑或台式电脑
  • 已安装 Corretto 8 或 JDK 8 或更高版本的 JDK(如果在 EC2 上运行,需要安装在 EC2 上)
  • 已安装 Maven(如果在 EC2 上运行,需要安装在 EC2 上)

您不再需要修改应用程序代码或添加依赖项来运行代理。只需要使用-javaagent 参数启动代理即可,这样您可以分析现有应用程序,而无需重新编译或更改应用程序的代码。不过 -javaagent 方法不支持用于 Lambda 和 Spark 作业,此场景下只能使用之前的方式。 要载入应用程序,请完成以下步骤:

  • 创建分析组,并设置区域的环境变量。
  • 从 CodeGuru Profiler 控制台下载最新的 Profiler Java JAR 文件。
  • 通过运行 -javaagent 参数重新启动 JVM
这篇文章有一些额外的步骤在实际中并不是必须的,这里主要是因为该示例通过两个不同的分析组来进行测试,一个是 DemoApplication-WithIssues(存在问题的场景) 和 DemoApplicationWithoutIssue(不存在问题的场景),因此需要通过设置如环境变量来区分。

克隆示演示代码

将演示应用程序克隆到本机或者 EC2 (https://www.amazonaws.cn/ec2/) 实例,请输入以下代码:

git clone  https://github.com/aws-samples/aws-codeguru-profiler-demo-applicationcd aws-codeguru-profiler-demo-application 

切换当前目录到 aws-codeguru-profiler-demo 应用程序后,可以看到 pom.xml 文件等信息:

创建分析组

在命令行中输入以下命令,该命令用于创建分析组(在执行该命令前,需要您的执行环境已经安装了 Amazon Web Services CLI,同时配置了 Amazon Web Services configure 这里配置的 ak,sk 就是上面选择的执行角色或者用户):

aws codeguruprofiler create-profiling-group --profiling-group-name DemoApplication-WithIssues
aws codeguruprofiler create-profiling-group --profiling-group-name DemoApplication-WithoutIssues

上面的命令创建了 DemoApplication-WithIssues 和 DemoApplication-WithoutIssues 两个分析组

设置演示应用程序

要完成该项目,您需要创建一个 Amazon 简单存储服务 (Amazon
S3) 存储桶和一个 Amazon 简单队列服务 (Amazon
SQS) 队列。创建 S3 存储桶和 SQS 队列并不是必须的,只是因为本演示程序使用了该组件。该示例程序通过读取S3上的图片信息,然后将信息写入到SQS队列,另外一个线程通过消费 SQS 队列中的消息,然后对消息中的图像进行处理,然后再将处理后的图片存储到S3中。首先我们创建程序需要的S3和SQS资源,请输入以下代码:

Amazon Web Services s3 mb s3://demo-application-test-bucket-YOUR BUCKET NAME aws sqs create-queue –queue-name DemoApplicationQueue

对于本文,请用一组随机的数字或者您的名字简拼替换您的桶名称,这里主要是因为 S3 的桶名称需要全局唯一。 接下来,我们使用以下命令设置环境变量。这些步骤不是必要的,正如上文所述主要是为了测试不同场景,因此通过环境变量进行设置区分,这里的设置包括桶的名称,SQS 的地址等 这些信息可以通过上面命令执行结果的返回中获取,或者通过 Console 获取,第三个参数是当前使用的 CodeGuru 所在区域的编码比如弗吉尼亚需要配置为 us-east-1。

export DEMO_APP_BUCKET_NAME="demo-application-test-bucket-10245"export DEMO_APP_SQS_URL="https://sqs.us-east-1.amazonaws.com/12345678/DemoApplicationQueue"export AWS_CODEGURU_TARGET_REGION=REPLACE WITH YOUR-AWS-REGION

下载 Java agent 的 jar 文件

首先我们测试有问题的场景,因此设置环境变量为:

export AWS_CODEGURU_PROFILER_GROUP_NAME=DemoApplication-WithIssues

提示: “有问题场景“模拟了日志 Logger 未复用的问题,java 中一般会建议日志打印对象,通过一个类共享的方式进行使用,如定一个 static 的全局日志类,不用每次打印的时候去初始化一个 Logger 对象用于日志输出,这样是很消耗资源的方式。同时日志输出操作本身也很耗时,也不建议在生产环境中一直卡其 Debug。 然后我们编译并打包测试应用,当前应用使用的是 Maven 进行项目的管理,因此在 /aws-codeguru-profiler-demo-application 目录下执行如下命令构建(该目录下包含 pom.xml 文件,该文件是用于构建和管理 java 应用):

mvn clean install

如上命令会将当前测试应用构建为jar包并生成在 /aws-codeguru-profiler-demo-application/targe 目录下。此过程可能需要 1 分钟左右的时间。 对于本文中的操作,您不需要下载 CodeGuru Profiler Java agent JAR 文件,因为上面通过 GitHub 下载的 Demo 应用程序中已包含该文件,不过,当您在实际生产上使用应用程序进行分析时,建议从 CodeGuru Profiler 控制台下载 最新的 JAR 文件,下载页面如下图所示:

运行演示应用程序

接下来,通过运行 -javaagent 重新启动 JVM,同时需要确保命令中包含应用程序的启动命令。需要注意的是当您运行此项目时,实际的
CodeGuru Profiler java agent JAR 文件的版本可能已经更新。

java -javaagent:codeguru-profiler-java-agent-standalone-1.0.0.jar \
-jar target/DemoApplication-1.0-jar-with-dependencies.jar with-issues

当您通过您的环境看到如下日志时说明 CodeGuru Profiler 已经配置成功:

INFO: Profiling scheduled, sampling rate is PT1S

您将命令窗口上看到消息运行几分钟后,此时您可以选择继续运行或者退出。如果选择了退出,同时是使用 Ec2 的话需要通过 SSH 重新连接到 EC2 实例再次查看运行情况。 您可以通过如下命令可以查看 agent 是否仍然在运行:

ps -ef |grep javaagent

相关文章