APMを導入してアプリケーションの品質を改善しよう！（導入編 - Java）

New Relic APMをアプリケーションに導入することで、システム障害やユーザー体験の劣化につながるアプリケーションのパフォーマンスやエラーの原因特定と解決、改善に繋げることができます。今回はJavaアプリへの導入方法を紹介します！

APMの概要について理解されたい方は以下の記事をご確認ください。

https://qiita.com/nr-mito/items/74bf587bc97128403d9e

# 早速導入してみよう！
今回は[PetClinic](https://github.com/spring-projects/spring-petclinic)というJavaで作られているWebアプリケーションにNew Relic APMのJava エージェントを導入します。

## 事前準備と起動確認
本記事ではJavaの実行環Amazon Linux 2023とDockerへの導入方法を紹介します。

### Amazon linux 2023 の場合
Amazon linux 2023にインストールする場合の手順を紹介します。まずは、Javaとgitをインストールします。
```bash
sudo yum install java git
```
続いて、PetClinicをCloneします。
```bash
git clone https://github.com/spring-projects/spring-petclinic.git
```
PetClinicの起動確認を行います。
```bash
cd spring-petclinic
./mvnw package
java -jar target/*.jar
```
ブラウザでアクセスできることを確認します。
※PetClinicはデフォルト設定ではTCP:8080でListenします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/31939354-35bd-b512-4b0f-19c28b457833.png)
起動確認できたらCtrl + Cで停止します。

### Docker の場合
Docker用のPetClinicのリポジトリを実行環境にCloneします。
```bash
git clone https://github.com/dockersamples/spring-petclinic-docker.git
```
Docker ComposeでPetClinicを起動します。
```bash
cd spring-petclinic
docker compose up -d
```
Dockerの場合もデフォルトはTCP:8080でListenするので、```http://localhost:8080/```でブラウザでアクセスできることを確認します。

## APM エージェントを導入
それではAPM エージェントを導入しましょう。

New Relicの管理画面にログインし、「＋ Integrations & Agens」を選択->「java」で検索かけて、表示されたアイコンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/c8065316-ef82-0d22-490b-9ac472204f29.png" width="60%">

### Amazon Linux 2023にインストール
APMエージェントのインストール方法を選択します。
MavenやGradleなどのビルドツールを使ったインストール、AWS Lambdaへのインストールもサポートしています。今回はホスト上にエージェントをDLしてインストールする方式である、「On a host」を選択して、次に進みます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/0a1f08de-f826-aa0d-b070-599e238e5b85.png" width="60%">
インストールで使用するlicense keyとuse keyを作成します。作成したキーはコピーして控えておきましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/23f46aa0-5cfb-43b2-a11b-605632c32d4b.png" width="70%">
インストール先のOSのタイプはAmazon linux 2023なので、今回はLinuxを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/d76d325a-2c45-1b6e-20a6-6e26870b2d50.png" width="70%">
APMエージェントがサポートしているjavaのバージョンかコマンドで確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/f28f3c33-4706-834a-cb2c-5a52797ffa7d.png" width="70%">
```bash:バージョン確認出力例
$ java --version | head -n 1
openjdk 23.0.1 2024-10-15
```
インストール要件の詳細は以下公式ドキュメントをご確認ください。

https://docs.newrelic.com/jp/docs/apm/agents/java-agent/getting-started/compatibility-requirements-java-agent/#jvm

使用しているフレームワークを選択します。APMエージェントはサポートしているフレームワークを使用している場合、アプリケーションのパフォーマンスのデータを取得するコードが自動計装されます。今回はSpring Bootを選択します。サポートしているフレームワークを使っていない場合は、[カスタム計装](https://docs.newrelic.com/jp/docs/apm/agents/java-agent/custom-instrumentation/java-custom-instrumentation/)することで、データを取得することもできます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/4f52bbe1-66f8-988f-1dd0-3d4235e8c27b.png" width="25%">

APMエージェントが内包されているZipファイルをcurlコマンドでAmazon linux 2023上にDLし、``` /opt/newrelic ```のディレクトリを作成し、DLしたZipファイルを作成したディレクトリ内にunizpで解凍します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/50e50953-8c97-6056-8067-604a23ae49a2.png" width="70%">
```bash:コマンド例
curl -O https://download.newrelic.com/newrelic/java-agent/newrelic-agent/current/newrelic-java.zip
sudo mkdir /opt/newrelic
sudo unzip -j newrelic-java.zip -d /opt/newrelic/
# ec2-userでpetclinicを起動させるため、ec2-userでディレクトリ以下のファイルの読み込みができるように設定
sudo chown -R ec2-user:ec2-user /opt/newrelic/
```

New Relic 上でのアプリケーションの表示名を入力し、APMエージェントの設定ファイル(newrelic.yml)をコピーして、zip内に含まれているサンプルの設定ファイル``` /opt/newrelic/newrelic.yml ``` の中身を書き換えて、次に進みます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/74f7c5b3-6876-3e27-fa03-bfca958571b3.png" width="70%">

javaエージェントの起動方法のコマンド例が提示されます。javaのAPMエージェントはjarファイルで提供されており、起動オプションに``` -javaagent ```の引数を追加して、APMエージェントを読み込ませます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/1a779a2a-8c51-b7b1-3e71-6e6514802b30.png" width="70%">
今回は以下コマンドで起動させて、次に進みます。
```bash:起動コマンド例
java -javaagent:/opt/newrelic/newrelic.jar -jar target/*.jar
```
Infrastructure エージェントを導入することによるログ転送のオプションのセットアップが表示されますが、今回はスキップして次に進みます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/d4e0d64e-daa3-5c8b-8479-995c6b0d41e1.png" width="80%">
Visual Studio CodeなどIDEとAPMの計測データを連携できるCodeStreamという機能の連携を求められますが、今回はスキップして次に進みます。CodeStreamについて知りたい方は[こちら](https://docs.newrelic.com/jp/docs/codestream/start-here/what-is-codestream/)をご確認ください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/34c04598-eae1-6af4-579d-6cf3a6525712.png" width="80%">
起動したPetClinicにブラウザでアクセスして、トランザクションを発生させたあとに「Test connection」をクリックして、計測したデータが取得できていることを確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/89824d67-a000-69bc-354b-ce822bc4dafc.png" width="80%">

### Dockerにインストール
インストール方法の箇所でDockerを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/0a1f08de-f826-aa0d-b070-599e238e5b85.png" width="60%">
license key を作成し、コピーして控えておきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/5d9005f2-99dc-3c9a-7aa8-3c7893eabf0e.png" width="60%">
Dockerの実行環境のOSを選択します。今回はLinuxを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/ec4dc5f1-4f39-0d66-700b-9c84a5c3ee6c.png" width="60%">
APMエージェントをDocker実行環境にDL、unizipで解凍してリポジトリのルートディレクトリに配置します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/9fd5c528-1868-2b6e-5e6d-7c3e57ca4a22.png" width="60%">
```bash:実行例
cd spring-petclinic-docker
curl -O https://download.newrelic.com/newrelic/java-agent/newrelic-agent/current/newrelic-java.zip
unzip newrelic-java.zip
rm newrelic-java.zip
```

New Relic 上でのアプリケーションの表示名を入力し、APMエージェントの設定ファイル(newrelic.yml)をコピーして、zip内に含まれているサンプルの設定ファイル``` spring-petclinic-docker/newrelic/newrelic.yml ``` の中身を書き換えて、次に進みます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/12cc5313-dce3-b847-59a7-a9bd2dba07d3.png" width="60%">

PetClinicのアプリを起動するときにAPMエージェントを読み込むようにDockerfileを更新するための手順が表示されますので、Dockerfileを更新します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/2751807b-bde9-c7f7-7966-f36a92e1b6d0.png" width="60%">

Dockerイメージをビルドする際にnohttp-checkstyleの規約チェックでエラーが起きるため、今回はモジュールの読み込みをコメントアウトで無効化しておきます。
```bash:src/checkstyle/nohttp-checkstyle.xml
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
		"-//Puppy Crawl//DTD Check Configuration 1.2//EN"
		"https://checkstyle.org/dtds/configuration_1_2.dtd">
<module name="com.puppycrawl.tools.checkstyle.Checker">
	<!-- <module name="io.spring.nohttp.checkstyle.check.NoHttpCheck"/> -->
</module>
```
今回は以下の内容でDockerfileを更新します。
```bash:spring-petclinic-docker/Dockerfile.multi
FROM eclipse-temurin:21-jdk-jammy as base
WORKDIR /app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:resolve
COPY src ./src

#FROM base as development
#CMD ["./mvnw", "spring-boot:run", "-Dspring-boot.run.profiles=mysql", "-Dspring-boot.run.jvmArguments='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000'"]

FROM base as build
RUN ./mvnw package

FROM eclipse-temurin:21-jre-jammy as development
EXPOSE 8080
COPY --from=build /app/target/spring-petclinic-*.jar /spring-petclinic.jar
RUN mkdir -p /usr/local/newrelic
ADD ./newrelic/newrelic.jar /usr/local/newrelic/newrelic.jar
ADD ./newrelic/newrelic.yml /usr/local/newrelic/newrelic.yml
#CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/spring-petclinic.jar"]
ENTRYPOINT ["java","-javaagent:/usr/local/newrelic/newrelic.jar","-jar","/spring-petclinic.jar"]

```
PetClinicのコンテナを再ビルドして、ブラウザでアクセスできることを確認できたら、New Relicの画面に戻ります。
```bash:
docker compose stop petclinic
docker compose rm petclinic
docker compose build --no-cache petclinic
docker compose up -d petclinic
```
オプションでガイドされるInfrastructure エージェントのセットアップは今回はスキップして次に進みます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/f849fba0-1753-1491-a847-018db075b1e2.png" width="70%">
データが届いていることを確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/8402b41c-609b-697c-dbb1-5e1e491eddf1.png" width="70%">

APMの画面でもデータが取得できていることを確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/a9327df9-6ad4-ac1c-c149-594c49d59fce.png" width="90%">

Java エージェントの導入とデータ確認までを紹介させていただきました。
アプリケーションの品質を維持するために重要な指標となるパフォーマンスやエラーなどのデータを簡単なセットアップで計装できるようになりますよ。ぜひ、お試しください！！

# その他
New Relicでは、**新しい機能やその活用方法**について、QiitaやXで発信しています！
**無料でアカウント作成**も可能なのでぜひお試しください！

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

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