開発者による非機能要件の実現を効率的にしよう

# 概要
どの企業においてもデジタルがビジネスの中核になりつつありますが、ビジネスニーズにスピーディ応えつつ、システムの問題によってビジネスの成長を阻害することを避けるためには、高い品質のコードを素早くリリースしていくことが求められています。

そのためにはソフトウェア開発ライフサイクルの早い段階でバグやパフォーマンスなどの品質問題を刈り取ること、および問題が発生してしまった時に早急に修正して解決できるようにすることが重要になってきます。つまりは、開発者自身がバグやパフォーマンスの問題にすぐに気付けるような環境を作り上げていく必要があります。

オブザーバビリティプラットフォームであるNew Relicは、システム全体を観測し問題の発見と解決の迅速化を可能にする機能群を提供していますが、その中に開発者向けの機能の一つとして [**CodeStream**](https://newrelic.com/jp/codestream) というものがあります。

CodeStreamは、開発者が利用しているVisual StudioやIntelliJなどの統合開発環境（IDE）のプラグインとして動作し、開発者がコードを書きながらそのコードレベルで品質（エラー率やレスポンスタイムなど）を把握することを可能にし、上述の通り、ライフサイクル上流での品質刈り取りや問題発生時の状況把握の迅速化を実現するものになります。

本記事では、Javaのサンプルアプリを使ってCodeStreamでどのような情報が見えるか試したいと思います。

:::note info
この機能に関する詳細はこちら
[New Relic アップデート(2023年2月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202309 "New Relic アップデート(2023年2月)")
[New Relic アップデート一覧](https://newrelic.com/jp/blog/nerdlog/new-relic-update)
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！
](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::


# 前提
## New Relic のアカウント作成
CodeStreamを動作させる場合、New Relicのアカウントが必要になります。まだNew Relicのアカウントをお持ち出ない方は、[サインアップフォーム](https://newrelic.com/jp/sign-up-japan)からフリーのアカウントを作成してくダサい。

## IDEへのCodeStreamのインストール
IDEのプラグインとして動作するCodeStreamを導入しておきます。例えば、Visual Studio CodeでCodeStreamと検索すると以下の画像のようなプラグインが見えるはずです。本記事では導入手順は割愛しますので[公式ドキュメント](https://docs.newrelic.com/jp/docs/codestream/start-here/install-codestream/)を参考にインストールしてください。

![Install-CodeStream.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/e697d188-4081-0d61-eccf-c611210b384f.png)


# アプリの用意
今回はサンプルアプリケーションとしてJavaの[spring-petclinic](https://github.com/spring-projects/spring-petclinic)を利用してみます。
```
git clone https://github.com/spring-projects/spring-petclinic.git
```

# APMエージェントの設定
IDEのプラグインとしてインストールしたCodeStreamに、アプリケーションのエラーやレイテンシーなどの情報を連携するために、アプリケーションにAPMエージェントを導入します。

## APMエージェント導入手順の確認
エージェントの導入手順は言語ごとに異なりますが、New Relicの画面上 [+ Add Data] メニューから対象言語を選ぶだけで簡単に確認できます。

![Javaエージェント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/8576fe45-a535-7166-bc7d-53fba5cf78fc.png)



## pomの設定
参考までにAPMエージェントを起動するためのMavenの設定も記します。もちろんMaven以外の方法で導入しても構いません。
```
<dependency>
    <groupId>com.newrelic.agent.java</groupId>
    <artifactId>newrelic-java</artifactId>
    <version>8.7.0</version> <!-- 適宜最新に合わせる -->
    <scope>provided</scope>
    <type>zip</type>
</dependency>
```
```
<!-- New Relicのエージェントを取得して/targetに配置 -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.1.1</version>
    <executions>
        <execution>
        <id>unpack-newrelic</id>
        <phase>package</phase>
        <goals>
            <goal>unpack-dependencies</goal>
        </goals>
        <configuration>
            <includeGroupIds>com.newrelic.agent.java</includeGroupIds>
            <includeArtifactIds>newrelic-java</includeArtifactIds>
            <!-- you can optionally exclude files -->
            <!-- <excludes>**/newrelic.yml</excludes> -->
            <overWriteReleases>false</overWriteReleases>
            <overWriteSnapshots>false</overWriteSnapshots>
            <overWriteIfNewer>true</overWriteIfNewer>
            <outputDirectory>${project.build.directory}</outputDirectory>
        </configuration>
        </execution>
    </executions>
</plugin>
```

## アプリケーション、エージェントを起動
アプリケーションを起動します。正しく設定されていればエージェントも合わせて起動され、エラーやパフォーマンスに関するデータが収集されます。
```
java -javaagent:target/newrelic/newrelic.jar -jar target/*.jar
```


無事アプリケーションが起動しました。色々な画面にアクセスしてみます。

![petclinic-home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/e30fa23c-26f9-a8c6-b0bc-39dded9744f6.png)


## APMのデータを確認
アプリケーションが起動するとすぐにAPMでもパフォーマンスデータが確認できます。

![apm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/999b640c-27f4-027f-b1a8-39ff8bc5d902.png)


# IDEでのパフォーマンスデータの確認
いよいよ本題です。IDEにプラグインとして導入したCodeStreamでエラーやパフォーマンスデータがみられるかを確認してみます。今回は、Visual Studio Codeを利用します。
CodeStream側のアカウントが作成されていない場合は以下のような画面が表示されますが、必要事項を記入してログインできるようにします。

![codestream-signup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/e7c293a3-5dc2-2c76-e44d-381b2ab456b9.png)


# アプリケーションの品質指標を俯瞰
CodeStreamのペインでは、アプリケーションの各種品質指標を俯瞰できます。例えば、アプリケーション全体やメソッド単位のエラーレートやレスポンスタイム、スループットなどのゴールデンメトリクスや、発生しているエラーの情報、検出された脆弱性などです。

これらが開発環境で把握できるので、開発者が対応すべき問題を即座に把握していくことが可能になります。

![codestream-summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/f7edfc35-cb0a-a8b3-67bd-88988372ee04.png)



# コードレベル メトリクスの確認
また、各コードの中のメソッド単位でレスポンスやエラーレートがインライン表示されます。そしてクリックするとその詳細情報を時系列で確認することができます。これにより、例えば機能テストや負荷テストの際に品質影響のある問題コードを即座に特定することが可能です。

![codeleve-metrics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/856da6f0-47f6-97f4-702d-b01dfb6ac371.png)


# エラーの詳細確認
バグ等が起因でアプリケーションにエラーが発生している場合は、エラー発生時のスタックトレースやメッセージも確認できます。スタックトレースはクリッカブルになっており、該当のメソッド名をクリックすると対応するソースコードを自動的に画面上に表示してくれます。

開発中の環境と、テストや本番で動いている環境のコードのバージョンが異なっていても、エラーが発生した環境で動いているバージョンに対応したソースコードを自動的に表示してくれるため、いちいち別環境をクローンする必要などもありません。
なお、コードのバージョンを紐づけるにはエージェントの環境変数(NEW_RELIC_METADATA_COMMIT)でコミットハッシュを渡す必要があります。詳細は[公式ドキュメント](https://docs.newrelic.com/docs/codestream/how-use-codestream/performance-monitoring/#buildsha)を参照してください。

![codestream-error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/59cdba63-22fb-8572-0f62-d52150dd193e.png)


ちなみに、該当のエラーのソースコードはIDE上からだけでなく、New Relicの画面上からもシームレスにジャンプすることが可能です。APMのエラー画面にて[Open in IDE] ボタンを押下するとIDE上で該当のエラーとソースコードを簡単に確認することができます。

![open-in-ide.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/aa68c598-e4bd-2dce-079e-303de8385cfc.png)


# まとめ
本記事ではNew RelicのCodeStreamというIDEのプラグインを利用することで、開発者が普段使う時間の長い統合開発環境にてアプリケーションの品質指標を即座に確認できることを試してみました。

本番環境に限らず、ステージング環境や性能評価環境、テスト環境などにAPMを導入し、開発者がライフサイクルの早い段階から問題に気づいて修正できる状況を作り出しておくことにより、後工程で問題が発覚して手戻りが発生した場合の工数肥大化を防いだり、問題の把握と修正のスピードアップを実現することが可能になります。

New Relic APMと同様にCodeStreamも多様なアプリケーションの言語に対応していますので是非お試しください。

# 余談
ちなみに、執筆時点（2023年10月31日）でPublic Preview中である、生成AIによるオブザーバビリティアシスタントである[New Relic Grok](https://newrelic.com/jp/platform/new-relic-grok)もCodeStreamに組み込まれ、エラーの原因分析やコードの修正、テストケースの作成などを支援してくれるようになっています。こちらも是非ご利用ください。


:::note info
この機能に関する詳細はこちら
[New Relic アップデート(2023年2月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202309 "New Relic アップデート(2023年2月)")
[New Relic アップデート一覧](https://newrelic.com/jp/blog/nerdlog/new-relic-update)
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！
](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::

:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::