Amazon CodeGuruを試してみた

re:Invent 2019のKeynoteにて、続々新しいサービスが発表されていますが、自動コードレビュー／アプリケーション動作モニタリングのサービスが紹介されました。

https://aws.amazon.com/jp/codeguru/

![スクリーンショット 2019-12-04 3.12.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/1ebaae94-2016-519d-1ffa-1c89bb7b1be3.png)



大きく2つのサービスがあるようですが、現状はJavaアプリにのみ対応しているようです。

# CodeGuru Reviewer
今までのAWSのベストプラクティスや知見をもとに、GitHubやCodeCommitに登録されているアプリケーションのソースコードをレビューし、結果をPullRequestとして通知してくれるようです。

# CodeGuru Profiler
Agentを仕込んでアプリケーションを動作させることで、CPU使用率や遅延などいくつかの項目から分析／可視化してくれ、さらにパフォーマンス問題がある場合には自動的にそれを識別し、修正方法を提案してくれるサービスのようです。

# 料金はそれなり、ご利用は計画的に
料金は「$0.75 per 100 lines of code scanned per month」とのこと。100ラインをスキャンさせていたら月額0.75ドル。それなりにかかりますね。値下げを期待。

# 使ってみた
## CodeGuru Reviewer
手元に大したコードがないので、以前作成したDynamoDB Viewer用Javaアプリケーションを対象としてかけてみたいと思います。

![スクリーンショット 2019-12-04 8.59.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/545db794-78f7-fb39-5690-390f5a4b06d8.png)

非常に簡単にGitHubと連携することができます。で、登録後しばらく待ちましたが特に通知などは来ず。FAQによると「指摘するものがないと通知もない」らしいです。使い方を誤ったのか指摘項目がなかったのかはわからず。。。

![スクリーンショット 2019-12-04 8.59.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/18f7d4ea-32d9-0f0f-756b-a76375280c2e.png)


## CodeGuru Profiler

![スクリーンショット 2019-12-04 8.58.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/5382d08e-21bf-45a1-ac77-e832ee908cbb.png)

こんな感じのDynamoDBをスキャンしてくれるWebアプリケーションを対象にプロファイリングしてみました。

pom.xmlとgradleファイルどちらかに追記が必要になりますが、上記のアプリはMavenでビルドしていたため、以下の項目追記が必要になりました。

repositoriesの定義
```xml
        <repository>
            <id>codeguru-profiler</id>
            <name>codeguru-profiler</name>
            <url>https://d1osg35nybn3tt.cloudfront.net</url>
        </repository>

```

dependenciesの定義追加
```xml
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>codeguru-profiler-java-agent</artifactId>
            <version>0.1.0</version>
        </dependency>
```

また、Mainメソッドに実装も必要になります。公式ページに追加する内容が書いてありますが、今回は以下の内容を追記しました。

```java
import software.amazon.codeguruprofilerjavaagent.Profiler;


        new Profiler.Builder()
                .profilingGroupName("sample-profiling-group")
                .build().start();
```

この状態で実行してしばらく操作すると、以下のようなログが出力されました。

```
2019-12-04 08:48:25.781  INFO 38529 --- [Amazon-Profiler] s.a.c.ProfilingCommand                   : Attempting to report profile data: start=2019-12-03T23:43:24.789Z end=2019-12-03T23:48:25.781Z force=false memoryRefresh=false numberOfTimesSampled=301
2019-12-04 08:48:26.657  INFO 38529 --- [Amazon-Profiler] s.a.c.ProfilingCommand                   : Successfully reported profile
2019-12-04 08:53:28.626  INFO 38529 --- [Amazon-Profiler] s.a.c.ProfilingCommand                   : Attempting to report profile data: start=2019-12-03T23:48:28.300Z end=2019-12-03T23:53:28.625Z force=false memoryRefresh=false numberOfTimesSampled=300
2019-12-04 08:53:29.269  INFO 38529 --- [Amazon-Profiler] s.a.c.ProfilingCommand                   : Successfully reported profile
2019-12-04 08:58:31.283  INFO 38529 --- [Amazon-Profiler] s.a.c.ProfilingCommand                   : Attempting to report profile data: start=2019-12-03T23:53:31.011Z end=2019-12-03T23:58:31.283Z force=false memoryRefresh=false numberOfTimesSampled=300
2019-12-04 08:58:32.064  INFO 38529 --- [Amazon-Profiler] s.a.c.ProfilingCommand                   : Successfully reported profile
2019-12-04 09:03:33.529  INFO 38529 --- [Amazon-Profiler] s.a.c.ProfilingCommand                   : Attempting to report profile data: start=2019-12-03T23:58:33.396Z end=2019-12-04T00:03:33.528Z force=false memoryRefresh=false numberOfTimesSampled=300
2019-12-04 09:03:34.222  INFO 38529 --- [Amazon-Profiler] s.a.c.ProfilingCommand                   : Successfully reported profile
```

実際にCodeGuru Profilerを見に行くと、分析が始まっているようでした。


![スクリーンショット 2019-12-04 8.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/fd6c676e-c192-b29a-0a49-69b1ebcc8d61.png)

ほとんどがorg.apacheなどのフレームワーク部分なので、これらを除外しないと実際の実装部分が見えないですね。

![スクリーンショット 2019-12-04 8.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/1ee44a37-609e-8554-d5a1-1aa40c4eb311.png)

いったん「org.apache.*」を除外設定すると、Spring Frameworkの内容は残っているものの、ある程度見える形にはなってきました。CPU使用率や遅延に関する情報が乗るようなので、これを確認しながらプロファイリングするようです。

![スクリーンショット 2019-12-04 9.00.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/a9b1cb65-15db-4649-a40b-543ebd4d4225.png)


# まとめ
大したアプリケーションではないので、AWSが載せているようなきちんとした分析はできませんでしたが、それでも簡単にProfilingの可視化やレビューをしてもらえるのはありがたいサービスです。とはいえ、料金も料金なので、ご利用は計画的に、ですね。