はじめに
Play2 に限らず JVM を利用するアプリケーションで JVM の各種メトリクス監視をどうしようかなあと思っていたら Jolokia があったのを思い出したので設定を試してみました。
参考
- Jolokia
- org.jolokia:jolokia-jvm:1.2.3
- JolokiaでMBeanにアクセスする
- JMXのメトリクスをfluentd経由で蓄積する
- 本番モードで起動したplay2.2.4のJVMを調整する
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 で監視する」