LoginSignup
0

New Relic APMをJava (Spring)アプリケーションに導入してみる

Last updated at Posted at 2023-12-17

はじめに

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

構成

マイクロサービスチックにした方が楽しそうだったので、今回は以下のような構成を組んでみました。

image.png

「Product Service」はPostgreSQLからproduct情報を取得します。
そして、わざわざそのProduct Serviceを「Caller」から呼ぶという構成にしていますw

APMの設定

接続確認

New Relicでアカウント登録してログインすると、以下のような画面が表示されるので、まずはこの画面に従って接続テストをしてみます。

  • 「Application monitoring」でJavaを選択します。
    image.png

  • 今回はdocker-composeでアプリケーションを動かすので、Docker Compose > Default Bridge と選択。
    image.png

  • コマンドが表示されるのでdocker-compose upまで無心で実行していきます。
    image.png

表示されるコマンドは以下です。

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
  • 「newrelic-infra」のコンテナが無事に起動したら「Test Connection」します。
    image.png

  • 「Successful」になったらOK。
    image.png

APM Java agent (newrelic-java.zip) のダウンロード

※ココから微妙に画面に従いません。

Test Connectionが完了し「Continue」を押すと、そのままAPMの設定画面に進めます。

  • 今回は「Docker」を選択
    image.png

  • WSLで作業するので、敢えて「No, running on Linux」を選択して、表示されたコマンドで「newrelic-java.zip」をダウンロードします。
    image.png

「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

イメージの作成

以下の画面を参考に、アプリケーションのイメージを作成します。

image.png

やる作業は以下の2つ。

  • 「newrelic.jar」, 「newrelic.yml」を/usr/local/newrelicに配置
  • ENTRYPOINT にJava agentの起動を追加

が、「newrelic.jar」, 「newrelic.yml」はボリュームマウントする方が使い勝手が良さそうだったので、Dockerfileは以下のようにしました。

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を作成します。

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 でコンテナを起動します。

結果確認まで

  • Optionalのinfrastructure agentの設定は今回スキップしています。
    image.png

  • 「Test Connection」で「Successful」になったらOKです。
    image.png

  • See your data
    image.png

  • 「Services - APM」に2つのアプリケーションが表示されます。
    image.png

結果詳細確認

実際にAPIを実行していくつかの画面を見てみます。

Service map

Caller > Product Service > PostgreSQL という経路を確認することができました。

image.png

Transactions

実行したAPIの概要

image.png

どの処理がどの程度の時間を占めているのかも確認できます。

image.png

image.png

「Transaction traces」から選択すると更に詳細を見ることができます!

image.png

「View distributed trace」で関連サービスをまとめて見ることも可能です!!

image.png

勝手にTrace IDを振ってくれるので、複数サービスに跨ってまとめてログを見ることもできます!!(便利)

image.png

どんなクエリが実行されていたかも確認可能です。

image.png

JVMs

latency、throughput、メモリ使用量などが確認できます。

image.png

Errors Inbox

敢えてエラーを発生させてみます。

image.png

エラーの詳細からDistributed traceを確認することができます。

image.png

ログも複数サービスのログを一気通貫で確認可能です。

image.png

New Relic CodeStreamという拡張機能を利用すると、Stack traceから「Open in IDE」で該当のコードに速攻で飛ぶことも可能です。そちらについては「New Relic CodeStream」に詳しく記載していますので、ご参照ください。

image.png

Service level management

本当はサービスレベル管理(SLI, SLO, SLA)もできたりするのですが、今回は作ったアプリケーションがショボいので割愛します。

image.png

参考

New Relic CodeStream

New Relic CodeStream は、コードのパフォーマンスを開発プロセスの初期段階の一部にすることでシフトレフトを可能にする IDE 拡張機能です。

New Relic CodeStream の紹介より引用。

こちらについても追加で設定・動作確認をしてみようと思います。

リポジトリの接続

APMの画面からリポジトリとの接続を行います。

image.png

New Relic CodeStream(拡張機能)のインストール

New Relic CodeStreamをVisual Studio Codeにインストールします。
インストール後、拡張機能からサインインを行うと、左メニューに以下のようなものが表示されます。

image.png

他IDEの拡張機能については、以下ドキュメントをご参照ください。(記事執筆時点では、Visual Studio Code、Visual Studio、IntelliJに対応していそうです。)

パフォーマンスの確認

設定後、APIを実行してみると、latency, throughput, Error rate, 依存サービスなどをVSCodeの拡張機能上で確認することができます。コードの該当箇所にもlatency, Error rateが表示されるので、特定の処理がどのようなパフォーマンスなのかを確認するのが簡単にできそうです。

image.png

コード上の結果をクリックすると、以下のようなlatencyとリクエスト数(サンプル数)のグラフを見ることもできます。

image.png

Stack traceの確認

Errors Inboxからエラーを確認し、「Open in IDE」をクリックします。

image.png

以下の画面が表示されるので、ここからVSCodeを開きます。

image.png

すると、Stack traceから該当のコードの箇所を自動的に表示してくれます。Stack traceをじっくり眺める必要が無いので、これはめっちゃ楽ですね!

image.png

まとめ

New Relic APM Java agentで遊んでみましたが、導入も簡単で非常に便利だなと思いました。
サービスの俯瞰的な状態から、コードレベルの状態・パフォーマンスまで確認できるので、開発者にとっては非常に有用なツールだと思いますし、サービスオーナー、運用者とも同じ画面を見て会話できるのではないかと感じました。

Java agentを起動するため、パフォーマンスにどう影響するかが気になるところではありますが、本番前の環境であれば、気軽に導入してサービス・コードの状態を確認してみるのはアリな気がします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0