share facebook facebook2 twitter menu hatena pocket slack

2014.11.20 THU

Play2 が動いている JVM を Jolokia で監視する

川原 洋平

WRITTEN BY川原 洋平

はじめに

Play2 に限らず JVM を利用するアプリケーションで JVM の各種メトリクス監視をどうしようかなあと思っていたら Jolokia があったのを思い出したので設定を試してみました。

参考

Jolokia とは…

こちらの「JolokiaでMBeanにアクセスする」の記事を参考にさせて頂くと…

MBeanにHTTP経由でアクセスできるようにjmxの口を空けてくれるJavaのエージェント

とのことです。

自分としては Java アプリケーションで利用している JVM 等の情報を HTTP 経由で取得することが出来るラッパー API って認識です…。(多分、意味としては同じですかね…)

もう少し登場人物の整理が必要なようです…すいません。

手順

jar のダウンロード

cd /path/to/app
mkdir lib
wget https://repo1.maven.org/maven2/org/jolokia/jolokia-jvm/1.2.3/jolokia-jvm-1.2.3-agent.jar

JAVA_OPTS をアプリケーションユーザーの .bash_profile に追加

JAVA_OPTS="-javaagent:/path/to/app/lib/jolokia-jvm-1.2.3-agent.jar=port=8778,host=localhost"
export JAVA_OPTS

アプリケーションの起動

play start

run とか stage でも良いかも。

アプリケーションを起動すると以下のように出力されます。

 $ play start
I> No access restrictor found, access to all MBean is allowed
Jolokia: Agent started with URL http://127.0.0.1:8778/jolokia/
[info] Loading project definition from /opt/app/hoge/project
[info] Set current project to hoge (in build file:/opt/app/hoge/)

(Starting server. Type Ctrl+D to exit logs, the server will remain in background)

Play server process ID is 9345

これで jolokia 経由で JVM の情報を監視出来るようになります。

fluent-plugin-jolokia を利用する

fluent-plugin-jolokia の準備

sudo yum install gcc make git
git clone https://github.com/lburgazzoli/lb-fluent-plugin-jolokia.git
cd lb-fluent-plugin-jolokia
/usr/lib64/fluent/ruby/bin/rake
sudo /usr/lib64/fluent/ruby/bin/fluent-gem install pkg/fluent-plugin-jolokia-0.0.1.gem --no-ri --no-rdoc -V

設定

以下のように jolokia の URL とタグ、取得するリソースを指定します。

<source>
  type jolokia
  tag play.test
  jolokia_url http://127.0.0.1:8778/jolokia/
  jmx_bean java.lang:type=Memory
  jmx_attribute NonHeapMemoryUsage
  run_interval 5s
</source>

<match play.test>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type forward
    buffer_type file
    buffer_path /tmp/fluent.dstat.buffer
    <server>
      host xxx.xxx.xxx.xxx
      port 24224
    </server>
  </store>
</match>

どんな感じで出力されるか?

以下のように出力されます

2014-11-12 05:25:44 +0000 play.test: {"timestamp":1415769944,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37923248}}
2014-11-12 05:25:49 +0000 play.test: {"timestamp":1415769949,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37924496}}
2014-11-12 05:25:54 +0000 play.test: {"timestamp":1415769954,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37924496}}
2014-11-12 05:25:59 +0000 play.test: {"timestamp":1415769959,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37924496}}
2014-11-12 05:26:04 +0000 play.test: {"timestamp":1415769964,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37924496}}
2014-11-12 05:26:09 +0000 play.test: {"timestamp":1415769969,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37924496}}
2014-11-12 05:26:14 +0000 play.test: {"timestamp":1415769974,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37924496}}
2014-11-12 05:26:19 +0000 play.test: {"timestamp":1415769979,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37924496}}
2014-11-12 05:26:24 +0000 play.test: {"timestamp":1415769984,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37924496}}
2014-11-12 05:26:29 +0000 play.test: {"timestamp":1415769989,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37924496}}
2014-11-12 05:26:34 +0000 play.test: {"timestamp":1415769994,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37924496}}
2014-11-12 05:26:39 +0000 play.test: {"timestamp":1415769999,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"NonHeapMemoryUsage","type":"read"},"value":{"max":738197504,"committed":38731776,"init":24313856,"used":37924496}}

value キーに含まれるキーと値を利用して可視化とか出来そうですね

あと…

jstst と jps

jsp で JVM で稼働しているプロセスの ID を確認して jstat でヒープ領域を監視することが出来るようです。

$ jps
10118 Jps
9903 NettyServer
[/bash]

<code>NettyServer</code> が Play Framework で利用している Web サーバーになるのでこのプロセス ID を利用して jstat を実行すると...以下のように出力されます。


$ jstat7 -gcutil 9903 1000
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0.00 100.00 100.00  60.25  92.75     17    0.033     0    0.000    0.033
  0.00 100.00 100.00  60.25  92.75     17    0.033     0    0.000    0.033
  0.00 100.00 100.00  60.25  92.75     17    0.033     0    0.000    0.033

各項目の見方については後で調べて書きます。

sensu プラグイン

  • Sensu のプラグインとかあるといいですね!

気になる...

  • .bash_profile に JAVA_OPTS を書くのがキモい...

元記事はこちらです。
Java - Play2 が動いている JVM を Jolokia で監視する