NewRelic APM(Java)導入前に設定で知っておきたい事
はじめに
こんにちは。株式会社SHIFT ITソリューション部の松本です。
現在は、主にお客さまの新規導入ソリューションのPOCなどを実施しています。
今回は、NewRelicのAPM(Java)の導入前に知っておきたい事を紹介します。
APMとは
Application Performance Monitoring の事で、アプリケーションの状態を監視し 傾向や原因の特定、改善を行うためのツールのことです。
公式HPの説明
APMとは
設定の優先順位
NewRelicのAPM(Java) ※以降APMと記載します。
APMの設定では、いくつかの場所で設定が可能になっており、優先順位が決まっています。
公式HPの説明
Javaエージェント設定:設定ファイル
これを利用して、個別に設定したい項目を優先順位が高い箇所に設定する事で、設定をオーバーライドする事が可能です。
今回は、導入前に検討しておきたい環境変数とシステムプロパティを利用した方法を紹介します。
設定ファイルの個別指定
APMは実行されているJavaプログラムの色々な情報を収集して、Web画面で可視化する事ができます。
1サーバ上に複数のJavaプログラムが動いている場合、それぞれにAPMのnewrelic.jarを指定して起動しますが、newrelic.jarはサーバ上に1つあれば問題ありません。
下記のような構成です。
JavaアプリAとJavaアプリBは、同じ場所のnewrelic.jarを指定して起動させます。
ディレクトリ構成
/data/
└── newrelic/
├── newrelic.jar
├── newrelic.yml
JavaアプリA
export JAVA_OPTIONS="${JAVA_OPTIONS} -javaagent:/data/newrelic/newrelic.jar
JavaアプリB
export JAVA_OPTIONS="${JAVA_OPTIONS} -javaagent:/data/newrelic/newrelic.jar
APMは、newrelic.jarファイルと同じ場所の設定ファイルnewrelic.ymlを読み込んで起動します。
これはデフォルトの動きです。
それぞれのJavaプログラムが同じnewrelic.jarを指定して起動すると、同じnewrelic.ymlの設定でAPMが起動し、情報収集します。
ここで問題になるのが、それぞれのJavaプログラムに異なった設定でAPMを起動させたい場合です。
もちろん、Javaアプリケーション数と同じ数のnewrelic.jarを用意しても実現可能ですが、APMのバージョン管理など運用管理上煩雑になりますので、避けたいところです。
システムプロパティ(newrelic.config.file)
このシステムプロパティをJavaプログラム起動引数に設定する事で、同じnewrelic.jarを利用しても、それぞれ別々の設定ファイルを指定する事が出来ます。
設定例
ディレクトリ構成
/data/
└── newrelic/
├── newrelic.jar
├── newrelic_app01.yml
├── newrelic_app02.yml
設定(起動スクリプトに記載した場合)
JavaアプリA
export JAVA_OPTIONS="${JAVA_OPTIONS} -javaagent:/data/newrelic/newrelic.jar -Dnewrelic.config.file=/data/newrelic/newrelic_app01.yml"
JavaアプリB
export JAVA_OPTIONS="${JAVA_OPTIONS} -javaagent:/data/newrelic/newrelic.jar -Dnewrelic.config.file=/data/newrelic/newrelic_app02.yml"
Javaプログラム毎である程度纏まった処理グループでAPMの設定を分けたい場合などで便利です。
JVM名の指定
NewRelicのUIで表示されるJVMは、命名する優先順位が決まっています。
公式HPの説明
Javaでのホスト名ロジック
WebSphere および WebLogic を利用した場合は、アプリケーションサーバ名を優先利用するようになっていますが、有効にならない場合があります。 うまくアプリケーションサーバの情報を利用できないと "ホスト名:ポート番号" といったUIの表示になり、どのアプリケーションサーバの情報なのか直感的に分かりにくくなってしまいます。
アプリケーションサーバ名が利用されない場合の画面
下記の例では、「weblogic-test」がサーバ名です。後ろの4桁(7002、7003)がアプリケーションサーバが利用しているポート番号です。 視覚的にどのアプリケーションサーバなのか判別しにくくなっています。
環境変数(NEW_RELIC_PROCESS_HOST_DISPLAY_NAME)
アプリケーションサーバ名を個別に指定する事で、NewRelicのUIに表示する事が可能です。
アプリケーションサーバ上で環境変数を設定しても良いですし、起動スクリプトに設定しても良いです。
設定例
設定(起動スクリプトに記載した場合)
NEW_RELIC_PROCESS_HOST_DISPLAY_NAME="${SERVER_NAME}"
export NEW_RELIC_PROCESS_HOST_DISPLAY_NAME
設定後の画面
アプリケーションサーバ名(Server-1、Server-2)に変換されて表示されます。
APMログファイル名を指定
APMの設定ファイルが同じ場合、APMのログ出力先が同じになります。 永遠に1ファイルに出力されていれば問題ないのですが、運用管理上ログローテーションを設定すると思います。
複数のJavaアプリケーションがAPMを実行している場合に、APMログ出力ファイルが同じ設定でローテーション設定を有効にすると、下記のようにログロテーション後のファイルに継続して出力してしまう問題が発生します。
※今回は、APMの設定で、日次とログサイズでのローテーション設定しています。
複数のJavaアプリケーションが同じAPMログ出力先を指定した場合
/data/
└── newrelic/
├── newrelic.jar
├── newrelic.yml
├── log/
│ ├── newrelic_agent.log ←最新のログファイル
│ ├── newrelic_agent.log.2024-11-16.1
│ ├── newrelic_agent.log.2024-11-16.2
│ ├── newrelic_agent.log.2024-11-16.3 ←ローテーション済みだが更新されているログファイル
実際のAPMログ状態画面
最新のAPMログは「newrelic_agent.log」なのですが、すでにローテーションされている「newrelic_agent.log.2024-11-16.3」がファイルのタイムスタンプから更新されている事が分かります。
システムプロパティ(newrelic.logfile)
このシステムプロパティを利用して、それぞれのJavaプログラム起動引数にAPMログ出力先を設定する事で、別々のログファイルに出力する事が可能です。
ログローテーションも下記のようにそれぞれのファイルで実行されます。
設定例
設定(起動スクリプトに記載した場合)
export JAVA_OPTIONS="${JAVA_OPTIONS} -javaagent:/data/newrelic/newrelic.jar -Dnewrelic.logfile=/data/newrelic/logs/newrelic_agent_${SERVER_NAME}.log"
※ファイル名だけ指定すると、アプリケーションサーバのログ出力先に出力されるようです。
設定後のAPMログ出力結果
別々のログに出力されています。 ローテーションされているログファイルも更新されていません。
最後に
導入は利用できれば良いだけでなく、今後の運用も考慮して設定していく必要があります。
導入後に変更するのは大変ですので、導入前の検討材料になれば幸いです。
SHIFTへのお問合せはお気軽に
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/
PHOTO:UnsplashのBernd 📷 Dittrich