はじめに
New Relic APMの Java agent をdocker-composeで立ち上げたSpringのアプリケーションに入れて遊んでみたので、導入手順や結果・感想について簡単にまとめようと思います。
(追記)ついでに「New Relic CodeStream」でも遊んでみました。
※今回はNew Relic APMで遊ぶことがメインなので、アプリの作りには詳しく言及しません。
環境
- OS:Windows 11 / WSL (Ubuntu 22.04)
- アプリケーション:Java 17
- Spring Boot 3.2.0
- DB:PostgreSQL 15
New Relic APM Java agentは 8.7.0
を利用しています。
$ java -jar newrelic.jar -v
8.7.0
構成
マイクロサービスチックにした方が楽しそうだったので、今回は以下のような構成を組んでみました。
「Product Service」はPostgreSQLからproduct情報を取得します。
そして、わざわざそのProduct Serviceを「Caller」から呼ぶという構成にしていますw
APMの設定
接続確認
New Relicでアカウント登録してログインすると、以下のような画面が表示されるので、まずはこの画面に従って接続テストをしてみます。
表示されるコマンドは以下です。
mkdir ~/newrelic-infra && cd ~/newrelic-infra && echo "license_key: ***" > newrelic-infra.yml
cat >> newrelic-infra.dockerfile << EOF
FROM newrelic/infrastructure:latest
ADD newrelic-infra.yml /etc/newrelic-infra.yml
EOF
cat >> docker-compose.yaml << EOF
version: '3'
services:
agent:
container_name: newrelic-infra
build:
context: .
dockerfile: newrelic-infra.dockerfile
cap_add:
- SYS_PTRACE
network_mode: bridge
pid: host
privileged: true
volumes:
- "/:/host:ro"
- "/var/run/docker.sock:/var/run/docker.sock"
restart: unless-stopped
EOF
docker-compose -f docker-compose.yaml up -d
APM Java agent (newrelic-java.zip) のダウンロード
※ココから微妙に画面に従いません。
Test Connectionが完了し「Continue」を押すと、そのままAPMの設定画面に進めます。
「newrelic-java.zip」を解凍した結果はこんな感じです。この中にある「newrelic.jar」を最終的に利用します。
$ ls
LICENSE extension-example.xml newrelic-api-javadoc.jar newrelic-api.jar newrelic.yml
THIRD_PARTY_NOTICES.md extension.xsd newrelic-api-sources.jar newrelic.jar
イメージの作成
以下の画面を参考に、アプリケーションのイメージを作成します。
やる作業は以下の2つ。
- 「newrelic.jar」, 「newrelic.yml」を
/usr/local/newrelic
に配置 -
ENTRYPOINT
にJava agentの起動を追加
が、「newrelic.jar」, 「newrelic.yml」はボリュームマウントする方が使い勝手が良さそうだったので、Dockerfileは以下のようにしました。
FROM mcr.microsoft.com/openjdk/jdk:17-ubuntu
RUN mkdir -p /usr/local/newrelic
COPY ./build/libs/product-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-javaagent:/usr/local/newrelic/newrelic.jar","-jar","/app.jar"]
newrelic.ymlの作成
Java agentの設定ファイルである「newrelic.yml」はダウンロードしたファイル一式の中にはあり、それをそのまま使っても問題ないのですが、一応、ガイダンス画面に表示されたものをコピーして利用しました。
また、今回は以下のように2つの設定ファイルを作成しました。
- Caller用:newrelic_caller.yml
- Product Service用:newrelic_product.yml
docker-compose.yamlの作成&コンテナ起動
先述の通り、「newrelic.jar」と「newrelic.yml」のボリュームマウントを設定したdocker-compose.yamlを作成します。
version: '3'
services:
product:
image: product-service
ports:
- 8081:8081
volumes:
- ./newrelic/newrelic.jar:/usr/local/newrelic/newrelic.jar
- ./newrelic/newrelic_product.yml:/usr/local/newrelic/newrelic.yml
depends_on:
- postgresql
caller:
image: caller
ports:
- 8080:8080
volumes:
- ./newrelic/newrelic.jar:/usr/local/newrelic/newrelic.jar
- ./newrelic/newrelic_caller.yml:/usr/local/newrelic/newrelic.yml
postgresql:
image: postgres:15.0
restart: always
environment:
POSTGRES_PASSWORD: PASSWORD
ports:
- 5000:5432
volumes:
- ./pgdata:/var/lib/postgresql/data
作成したらdocker-compose up -d
でコンテナを起動します。
結果確認まで
結果詳細確認
実際にAPIを実行していくつかの画面を見てみます。
Service map
Caller > Product Service > PostgreSQL という経路を確認することができました。
Transactions
実行したAPIの概要
どの処理がどの程度の時間を占めているのかも確認できます。
「Transaction traces」から選択すると更に詳細を見ることができます!
「View distributed trace」で関連サービスをまとめて見ることも可能です!!
勝手にTrace IDを振ってくれるので、複数サービスに跨ってまとめてログを見ることもできます!!(便利)
どんなクエリが実行されていたかも確認可能です。
JVMs
latency、throughput、メモリ使用量などが確認できます。
Errors Inbox
敢えてエラーを発生させてみます。
エラーの詳細からDistributed traceを確認することができます。
ログも複数サービスのログを一気通貫で確認可能です。
New Relic CodeStreamという拡張機能を利用すると、Stack traceから「Open in IDE」で該当のコードに速攻で飛ぶことも可能です。そちらについては「New Relic CodeStream」に詳しく記載していますので、ご参照ください。
Service level management
本当はサービスレベル管理(SLI, SLO, SLA)もできたりするのですが、今回は作ったアプリケーションがショボいので割愛します。
参考
New Relic CodeStream
New Relic CodeStream は、コードのパフォーマンスを開発プロセスの初期段階の一部にすることでシフトレフトを可能にする IDE 拡張機能です。
こちらについても追加で設定・動作確認をしてみようと思います。
リポジトリの接続
APMの画面からリポジトリとの接続を行います。
New Relic CodeStream(拡張機能)のインストール
New Relic CodeStreamをVisual Studio Codeにインストールします。
インストール後、拡張機能からサインインを行うと、左メニューに以下のようなものが表示されます。
他IDEの拡張機能については、以下ドキュメントをご参照ください。(記事執筆時点では、Visual Studio Code、Visual Studio、IntelliJに対応していそうです。)
パフォーマンスの確認
設定後、APIを実行してみると、latency, throughput, Error rate, 依存サービスなどをVSCodeの拡張機能上で確認することができます。コードの該当箇所にもlatency, Error rateが表示されるので、特定の処理がどのようなパフォーマンスなのかを確認するのが簡単にできそうです。
コード上の結果をクリックすると、以下のようなlatencyとリクエスト数(サンプル数)のグラフを見ることもできます。
Stack traceの確認
Errors Inboxからエラーを確認し、「Open in IDE」をクリックします。
以下の画面が表示されるので、ここからVSCodeを開きます。
すると、Stack traceから該当のコードの箇所を自動的に表示してくれます。Stack traceをじっくり眺める必要が無いので、これはめっちゃ楽ですね!
まとめ
New Relic APM Java agentで遊んでみましたが、導入も簡単で非常に便利だなと思いました。
サービスの俯瞰的な状態から、コードレベルの状態・パフォーマンスまで確認できるので、開発者にとっては非常に有用なツールだと思いますし、サービスオーナー、運用者とも同じ画面を見て会話できるのではないかと感じました。
Java agentを起動するため、パフォーマンスにどう影響するかが気になるところではありますが、本番前の環境であれば、気軽に導入してサービス・コードの状態を確認してみるのはアリな気がします。