JavaではJMXという仕組みがあり、外部から任意の値を取得したり、設定したりすることができるようになっています。

New RelicのJava agentもデフォルトでJMX経由で各種値が取れるようになっております。

ただし、お客様自身でMBeanを作成して外部取得できるようにしていたり、前述のページに記載のないメトリクスなど取得されたいケースがあります。その場合は、カスタムJMX YAMLを使って取得していただくことができます。本ブログでは、カスタムJMXに記載するための情報の取得及び、設定に関して記載します。

前提

  • New RelicのJava agentがすでに計装済みでJVMのデータが取得できる状態になっている
  • Javaアプリケーションがローカルで起動できるあるいは、リモートで起動する場合SSH経由でポートフォワーディングしてJMXポートに接続できる
  • ローカルにJavaがインストールされている

なお本ブログでは、Petclinicを用いて確認しています。

jconsoleを使った情報の取得

JMX経由でのデータ取得の場合、オブジェクト名属性名が必要になります。これらをjconsoleを使って取得します。まず、対象となるJavaアプリケーションをローカルあるいは、リモートで起動してください。続いて、ローカルのterminalからjconsoleとタイプして、jconsoleを起動してください。すると次のようなUIが表示されます。

 

ローカルでJavaアプリを起動している場合は対象のプロセスを選択し、リモートで起動している場合は接続に必要な情報を入力して接続を選択してください。

SSL接続ができない場合、SSLなしでの接続が促されます。今回SSL対応していないのでSSLなしで接続します。すると次のような画面が表示されるかと思います。

画面右上のMBeansのタブを選択すると、Mbeanの情報を確認してもらうことができます。

今回は、httpリクエストのリクエスト数や最大時間を取得してみたいと思います。jconsoleの画面内左側にてTomcat > GlobalRequestProcessor > "http-nio-8080" を開くと以下のように確認できると思います。

"http-nio-8080"を選択し、画面右側に表示されるObjectNameをコピーしてください。
今回は、Tomcat:type=GlobalRequestProcessor,name="http-nio-8080"になります。

続いて、属性名もコピーします。今回はmaxTimerequestCountです。
なお、対象の属性名を左画面で選択すると、次の図のように現在の値などが確認できます。
 

どちらも数値ですが、maxTimeは最大値の数値が記録され、requestCountは積算のリクエスト数が記録されることに注意してください。

設定の追加方法

続いて、手順に従い設定を追加します。

まず、対象のアプリのagent(newrelic.jar)が保存されているフォルダ直下にextensionsというフォルダを作成してください。
作成したextensionsフォルダの下に、.ymlという拡張子をもつファイルを作成してください。(なお、設定で変更されている場合は、extensions.dirにて設定したフォルダに作成してください)

作成した、.ymlファイルをテキストエディタ等で開き、先程コピーした値を使って以下のように設定に記載します。
 

name: TomcatCustom
version: 1.0
enabled: true
jmx:
  - object_name: Tomcat:type=GlobalRequestProcessor,name="http-nio-8080"
    metrics:
      - attributes: requestCount
        type: monotonically_increasing
      - attributes: maxTime
        type: simple

object_nameには、先程取得したオブジェクト名、attributesには先ほど取得した属性名を設定してください。なお、requestCountは前述の通り積算された値のため、typeにmonotonically_increasingを設定しています。monotonically_increasingを設定することで、差分の数のみをMetricとして取得することができます。またmaxTimeは単純なそれまでの最大値のため、simpleを設定しています。

こちらを保存し、設定を反映するため、Javaアプリケーションを再起動してください。

動作確認

Javaアプリケーションを再起動後少し経過すると、UI上で確認できるようになります。対象のアプリのMetric explorerで「jmx/tomcat」などと入力すると以下のように表示されることが確認できるかと思います。

 

なお、右側で表示されるチャートに関して、デフォルトで1,000倍されていることにご注意ください。特にrequestCountは1,000倍する必要はないので、以下のようなクエリーでご確認いただくのが良いかと思います。

SELECT average(newrelic.timeslice.value) as requestCount FROM Metric WHERE metricTimesliceName = 'JMX/Tomcat/GlobalRequestProcessor/"http-nio-8080"/requestCount' AND `entity.guid` = '対象アプリのguid' TIMESERIES

もし、正しく設定したのに、うまく取得できないなどあれば、お気軽にお問い合わせください。