[レポート]Amazon CodeGuruの概要: 自動コードレビュー&アプリケーションパフォーマンスのリコメンデーション #DOP211 #reinvent

本ブログはAWS re:Invent 2019のセッション『Intro to Amazon CodeGuru: Automated code reviews & application performance recommendations』のレポートです。

撮影に失敗して、スライドが見切れてしまっていますがご容赦ください。

セッション概要

Even for the most seasoned engineers, it can be difficult to detect some types of code issues and challenging to identify the most expensive lines of code without performance engineering expertise. Amazon CodeGuru is a new machine learning service that helps you catch code issues faster and improve application performance. In this session, you get the details and a demo on how CodeGuru works. CodeGuru reviews Java code in your GitHub and AWS CodeCommit source code repositories, and it profiles your applications and searches for optimizations even in production. It also provides intelligent recommendations so that you can take action immediately to fix and improve code issues and inefficiencies.

熟練したエンジニアでもコードの問題を検出することは困難であり、パフォーマンスエンジニアリングの専門知識がなければ、ハイコストなコード行を特定することは困難です。Amazon CodeGuruは新しい機械学習サービスで、コードの問題をより早く発見し、アプリケーションのパフォーマンスを向上させます。このセッションでは、CodeGuruの動作の詳細とデモを確認します。CodeGuruはGitHubとAWS CodeCommitのソースコードリポジトリにあるJavaコードをレビューし、アプリケーションをプロファイリングし、本番環境でも最適化を探します。また、コードの問題や非効率性を修正および改善するためのアクションをすぐに実行できるよう、インテリジェントな推奨事項も提供します。

動画&スライド

レポート

Lynnのある一日

Lynn: Eコマース会社のJavaプロジェクトのテックリードとして働く

  • データ破損の問題が発生
    • 原因はデータ競合
    • コードレビュー中にこの問題を早期に発見できないのか?
  • レイテンシーの増加が発生
    • 原因はCPUの過負荷
    • パフォーマンスの専門家がチームに居てくれたら!

Lynnは何を気にかけている?

  • コードをどうやって改善する?
  • 顧客の待ち時間を最小化できているか?
  • インフラのコストが無駄に増えていないか?
  • まだ見つかっていない問題はないか?

Lynnのエコシステム

  • 標準的なソフトウェア開発ライフサイクル
    • コードを書いて、レビューする
    • コードをビルドして、テストする
    • コードを運用環境にデプロイする
    • 運用環境で監視および測定する
    • 測定したものに基づいて改善し、コードに戻り、サイクルを繰り返す

このエコシステムには欠けているものがあります。

Lynnのエコシステムには何が欠けているか

  • コード欠陥の早期発見
  • コーディングベストプラクティスの維持
  • パフォーマンスボトルネックとなるコードの特定
  • アプリケーションパフォーマンスのビジュアルツール
  • パフォーマンス専門知識の可用性
  • より早い時間での問題の解決と修復

  • デベロッパーはライフサイクル全体を統合的に見るツールを必要としている

  • ツールはフェーズ全体で実行できる推奨事項を提供してほしい

そんなLynnのような人々が問題をより迅速に検出して修正できるように、Amazon CodeGuru を作りました。

Amazon CodeGuruとは?

  • 機械学習を用いてパフォーマンスに関するコードレビューを自動で行うサービ ス
  • Amazonで数十年にわたる知識と経験に基づいてトレーニング
  • ユーザーフィードバックによってさらに進化
  • 本番環境でも継続的に最適化を検出
  • 特定された問題を修正するための推奨事項を提供

  • 検出が難しいコードの欠陥を自動的に検査

  • 実行中のアプリケーションで最適化方法を見つけるのに役立つ

It is like having a distinguished engineer on call 24x7

開発ライフサイクルにおけるCodeGuru

  • CodeGuru Reviewer
    • コードレビューフェーズで、改善のための推奨事項を提供
  • CodeGuru Profiler
    • テストフェーズで、ハイコストなコードを検出、最適化
    • 運用フェーズで、パフォーマンスとコストの改善点を簡単に特定

CodeGuru Reviewerが提供するもの

  • 自動化されたコードレビューと推奨事項を提供
  • Javaアプリケーションをサポート
  • リポジトリとしてGitHubとAWS CodeCommitをサポート
  • Pull Requestベースでコードレビューを活用できる

標準的なPull Requestワークフロー

  1. ブランチの作成
  2. コードの変更
  3. Pull Requestの作成
  4. レビュアーがコメントし、レビュイーが対応
  5. 承認後、コードの変更をマージ

CodeGuru Reviewerがワークフローへどうやって適合するのか説明する前に、いくつかの重要な課題について説明します。

コードレビューにおける重要な課題

  • エキスパートなエンジニアは不足しています
  • コードレビューには高度な技術が要求されます。しかし、チームはコーディングに時間を費やしたり、他の重要なタスクに時間を費やす必要もあります
  • システムの領域は多岐にわたっていて、エキスパートが必要なトピックの数は増加しています
  • コードレビューはビジネスロジックに焦点を当てており、機能の正確さにはあまり焦点を当てていません
  • レビューすべきコードのサイズはどんどん増加しています

CodeGuru Reviewerが対処する領域

  • AWS Best Practice: AWS APIの正しい使用方法。コードのパフォーマンス、正確性に影響を与える可能性がある。
  • Concurrency: 並行性をもつシステムの正しい実装。並行性は難しく、正確さとパフォーマンスの問題の両方につながる可能性がある。
  • Resouse Leaks: 正しいリソースの取り扱い。リソースの不適切な処理によって時間がかかり、可用性に影響を与える可能性がある。
  • Sensitive Information Leak: 個人情報の漏洩。機密データ(クレジットカード番号等)の漏洩によりコンプライアンスの問題が発生する。
  • Code defects discovered by mining data: 検出が困難な欠陥。

CodeGuru Reviewerプロセス

CodeGuru Reviewerの実行概要

  • Pull RequestをトリガーにソースコードをInput
  • コードのパターン/特徴を抽出し、MLアルゴリズムでコードの欠陥を検出
  • 修正推奨事項をOutput

CodeGuru reviewerデモ

GitHubと連携してCodeGuruがプルリクをレビューして、S3.listObjects呼び出し時に、すべての結果が返ってこないでページ分割される可能性がある。 それを考慮していないことを指摘しているデモ。そのほかにも、いろいろなレビュー結果を紹介。

CodeGuru ReviwerのFeedback

  • Amazon CodeGuru reviewerは、重要な部分を見て長期にわたる競合状態をキャッチできたと述べています
  • 今までAmazon DynamoDBを典型的な使い方で使用していなかった。Amazon CodeGuru reviewerでページ分割される可能性があることを検出した。
  • Amazon CodeGuru reviewertry-with-resources の使用を推奨し、すぐに実装しました。

アプリケーションパフォーマンスの低下がもたらす課題

ビジネスへの悪い影響

  • ユーザーエクスペリエンスの低下
  • 顧客喪失
  • 高コストなインフラ
  • ミッションクリティカルなシステムへの影響

CodeGuru Profiler

  • システムパフォーマンスの専門知識を有する
  • パフォーマンスのベストプラクティスを学び続ける
  • 継続的にシステムパフォーマンスを改善する
  • パフォーマンスの問題箇所をダイレクトに指摘する
  • 修正推奨事項を提供する
  • エンジニアのコード修正を助ける

CodeGuru Profilerの特徴

  • 最適なパフォーマンスになるようトレーニングされている
  • コードをどう修正すればよいか推奨事項を提供する
  • 長年のAmazonのパフォーマンスエンジニアリングの経験に基づいてトレーニング

  • 低オーバーヘッド
  • プロダクション環境での継続的な実行
  • 継続的なパフォーマンス解析
  • Javaアプリケーションをサポート

CodeGuru Profiler デモ

CodeGuru Profilerの設定方法とパフォーマンス解析結果のビジュアライゼーションをデモ。その他、修正推奨事項レポート等を紹介。

CodeGuru Profilerの実行概要

  • 数行のコードを追加してProfilerスレッドを開始。スタックトレースをバックエンドに送信
  • バックエンドは、すべてのスタックトレースを集約し、パフォーマンス等の問題を検出}
  • コンソールにて、パフォーマンス解析結果のビジュアライゼーション
  • コンソールにて、修正推奨事項をレポート

Amazon Developer のパフォーマンス改善例

サマリー

  • Amazon CodeGuru はアプリケーションのパフォーマンス改善を容易にする
  • Amazon CodeGuru は継続的に学習・改善する
  • Amazon CodeGuru Reviewer
    • コードの欠陥を検出し、コードの修正推奨事項を提供する
    • Pull Requestベースで継続的にコードレビューができる
  • Amazon CodeGuru Profiler
    • パフォーマンス問題に関する修正推奨事項を提供する
    • リッチなビジュアルがトラブルシュートを手助けする

感想

CodeGuru Reviewer, Profilerともにデモが良くて、そこを本ブログでは伝えきれていないのでセッション動画の公開を期待しています!

CodeGuruでは主にパフォーマンスに関するコードレビューをしてくれるようで、自分のコードだとどんな感じでレポートを出してくれるのかとても気になります。

現在、対応言語はJavaのみということで、Javaでアプリケーション開発をしている方はこの機会に試してみるのはいかがでしょうか?

Python, TypeScriptといった他の言語に対応することを期待しています!