亚马逊AWS官方博客

送你一个编程教练可好?你应当了解的 Amazon CodeGuru

前言

去年12月初,我在拉斯维加斯参加了一年一度的AWS re:Invent 大会。会议上最激动人心的时刻当属主题演讲中发布的各具特色的新服务。这一届大会新服务的发布数量超过了70个。但是当我问到一个国内去参会的朋友对哪一个新服务最感兴趣的时候,他给我的答案却是:“除了Amazon CodeGuru, 其它都记不得了。”  虽不能完全苟同,但我也觉得CodeGuru 确实是最特别的一个。

 

究竟这个CodeGuru 是什么?

作为一个Java程序员,我们难免会经常遇到这样的一些错误信息“Unclosed String Literal”,”Illegal Start of an Expression”, ”Incompatible Types“,“Cannot Return a Value From Method Whose Result Type Is Void”以及“Non-Static Variable … Cannot Be Referenced From a Static Context”等等。也许我们已经习惯了依赖IntelliJ IDEA 、Eclipse或者NetBeans 来帮助我们完成代码在语法层面的检查。尽管Java作为一个强类型语言,静态分析的工具已经非常成熟,但是对于关键业务应用,或者复杂的代码还是需要人工介入以进行代码审核。但即使是资深的Java 程序员受限于经验和能力的不足,也很难通过静态的方法将潜藏于代码中的问题逐一识别出来。随着敏捷开发思想的普及,以及微服务架构的成熟,代码中的缺陷带来的挑战引出了一个新的需求 – 能否有一款更智能、脱离静态语法分析的局限来实现高质量应用的代码分析工具?

这就需要引出今天的主角Amazon CodeGuru。这里提到的CodeGuru 是AWS的一款新服务,与Windows开发人员熟悉的codeguru.com 完全不是一回事,切莫混淆。关于CodeGuru服务,借用官方文档的描述就是 –

 “ Amazon CodeGuru 是一种机器学习服务,可自动执行代码审查,并提供应用程序性能建议。它可以帮助您找到影响应用程序性能的最昂贵的代码行,并全天候帮助您排查问题,然后为您提供修复或改进代码的具体建议。”

可以说,这款服务是基于Amazon数十年软件开发的知识和经验积累而成的、利用现代机器学习的技术,用于自动代码审查和应用程序性能分析的工具。CodeGuru 的机器学习模型来源于 Amazon 自有的代码库进行训练所得。这些代码库包括大约数十万个Amazon内部的项目,以及 GitHub 上的 1 万多个开源项目。数万名 Amazon 开发人员凭借数十年的代码审查和应用程序分析经验为 CodeGuru 的训练提供了最有益的帮助。这个工具因其托管于AWS云计算之上,会随者越来越多的用户在生产环境中的使用反馈而不断的搜索优化、不断的发展。从功能上来看,它会自动检查代码以查找通常难以发现的缺陷,并提供了可行的建议来解决已发现的问题 ,并帮助在运行的应用程序中找到最有希望的优化方法。与人工的代码审核比较起来,CodeGuru 像不像一位任劳任怨的全时工作的老师傅!

“It’s like having a dedicated engineer on call 24/7”

Amazon CodeGuru服务中有两个重要的组件,第一个组件是静态代码分析器,叫做Amazon CodeGuru Reviewer;第二个组件是Amazon CodeGuru Profiler,用于探查在EC2、ECS、EKS以及Fargate上运行的由Java开发的应用程序。

 

Amazon CodeGuru Review

CodeGuru的功能之一是代码审核。 在这个环节中,它能够标记出来源代码中的严重的缺陷和可靠性的问题。 不同于以往的针对程序的质量分析工具,CodeGuru 的能力建立在机器学习之上。例如,CodeGuru Reviewer 使用规则挖掘和监督机器学习模型(结合使用逻辑回归和神经网络)进行训练。在训练期间,为了检测与最佳实践的偏差,它会挖掘 Amazon 代码库中包含 AWS API 调用的拉取请求。它会查看代码更改并针对文档数据进行交叉引用,同时也会并行挖掘文档数据。这将创建新的最佳实践模型,当 Reviewer 审查代码以提供建议时就将使使用这些模型。而针对于另外一个组件CodeGuru Profiler,则是由 Amazon 性能优化工程师进行训练,用于分析 Amazon 内部使用的数万项服务。CodeGuru的使用者可以决定是否接受 CodeGuru 提供的每项建议,使用者提供的反馈越多,它给出的建议就越好。这就是CodeGuru 神奇能力的秘密!

 

对于使用AWS API的开发人员,它会检测与使用 AWS API 和开发工具包的最佳实践的偏差,标记可能导致出现生产问题的常见问题,例如检测分页缺失或批处理操作的错误处理。它会检测并发性问题(例如原子性违规和使用非线程安全的类),即使经验丰富的程序员也很难发现这些问题。它会检测资源何时未正确关闭,并因此而引发延迟问题和中断。它还会识别正确的输入验证,未经审查的输入可能会导致注入攻击或拒绝服务等问题。

例如并发问题 –
例如分页问题 –
例如敏感信息泄漏问题 –

注:Amazon CodeGuru Reviewer 目前支持 GitHub 和 AWS CodeCommit 存储库中存储的 Java 代码。

 

总结一下,CodeGuru Reviewer解决的核心领域包括了以下几项:

  • AWS最佳实践:正确的使用AWS API
  • 并发:并发结构的正确实现
  • 资源泄漏:正确的资源处理方式
  • 敏感信息泄漏:泄漏个人身份信息、账户信息等
  • 通过数据挖掘发现缺陷代码:通常难以发现的缺陷

 

CodeGuru Reviewer的实际工作流程是怎样的?使用的第一步就是登录 AWS CodeGuru Reviewer 的管理控制台,然后可以关联 GitHub 或 AWS CodeCommit 上的现有代码的存储库。完成一次性设置后,CodeGuru Reviewer 会开始启动对代码的分析,并直接在拉取请求或代码存储库中提供代码改进建议。下面这张图解释了这个过程。

“CodeGuru Reviewer 可帮助我们捕捉潜伏在关键代码段中为时已久的争用状况。人工审查人员可能会漏掉此问题,因为它不在我所更改的代码范围之内…有此服务把关真是太棒了,不仅可提高我们的代码质量,而且无需设置或中断。”

–  负责 AWS 生成器工具的高级软件开发工程师 Mike Thompson

Amazon CodeGuru Profiler

CodeGuru Profiler关注于解决应用程序性能带来的挑战和问题。如果我们的应用程序性能不好,可能会对关键业务产生重大影响,例如,它可能使我们的交易失败,使得客户蒙受损失,并且让用户有了糟糕的体验。这还会导致系统架构的成本居高不下,并且可能会深刻影响到企业的发展。应用程序性能不佳的原因归起来,大多与分布式应用的复杂性有关。对于许多开发人员来说,这是个巨大的挑战,显然并非人人都是分布式应用的专家。

 

CodeGuru Profiler可以帮助开发人员重新考虑性能优化的问题。过查找最昂贵的代码行,基于其自身的训练来查找性能优化的方法,并给出关于如何修复代码的建议。它是为生产系统而构建的,设计的目标之一就是不会影响当前应用的性能。它可以连续地运行在生产环境中,并连续地进行性能的分析。目前,它仅支持用Java编写的应用程序。它的应用环境应该是这个样子的 –

 

使用 CodeGuru Profiler

要开始使用CodeGuru Profiler,需创建一个性能分析组,并为这个组命名;记得更新Profiler代理使用的IAM角色;为Java应用程序设置依赖项。最后通过添加AWS提供的几行代码来启动应用程序中的Profiler代理 到应用程序当中(如果有兴趣尝试,这里是一个样例的链接:https://github.com/aws-samples/aws-codeguru-profiler-sample-application)。CodeGuru Profiler还为应用程序提供了可视化的展现。必不可少的,CodeGuru Profiler还针对常见的性能问题提供了自动建议。

按照 CodeGuru Profiler 的建议删除这些克隆值之后,CPU 使用率大幅降低 – 同步队列降低了 40%,异步队列降低了 67%

–   负责 Amazon.com 目录管理服务的高级软件开发工程师 Rajesh Konatham

结语

Amazon CodeGuru已经被数百名Amazon开发人员使用了很多年。它已经帮助Amazon改进了许多应用程序。在2017年Prime Day的活动中,使用了Amazon CodeGuru之后 系统CPU 的利用率提高了325%,而成本却降低了39%。这可真是个了不起的成果啊!我非常期待去使用它。

 

本篇作者

费良宏

费良宏,AWS Principal Developer Advocate。在过去的20多年一直从事软件架构、程序开发以及技术推广等领域的工作。他经常在各类技术会议上发表演讲进行分享,他还是多个技术社区的热心参与者。他擅长Web领域应用、移动应用以及机器学习等的开发,也从事过多个大型软件项目的设计、开发与项目管理。目前他专注与云计算以及互联网等技术领域,致力于帮助中国的 开发者构建基于云计算的新一代的互联网应用。