はじめに

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]

NettyServer が 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 で監視する