ども、cloudpack の かっぱ (@inokara) です。
も少し
Jolokia について掘り起こしたいと思いますので、こちら「Chapter 6. Jolokia Protocol」を参考にとりあえずチートシートっぽいのを書いていきます。尚、MBean 等の用語の使い方に誤りがあるかもしれませんので、その際にはご指摘頂けると幸いです。
リクエスト
とりあえず…
<base-url>
は http://localhost:8778/jolokia とします。ポート番号については Jolokia を起動する際に変更することが可能です。前回の記事では以下のように環境変数 ES_JAVA_OPTS
に設定して Elasticsearch を起動していますので、ポート番号は 8778
番で Jolokia は Listen することになります。
ES_JAVA_OPTS="$JVM_OPTS -javaagent:/opt/jolokia/jolokia-jvm-1.2.3-agent.jar=port=8778,host=127.0.0.1"
Jolokia の基本的な URL は以下の通りです。
/ / / /..../
<type>
には read
や write
や list
そして exec
等があります。また、HTTP の GET
や POST
のメソッドを利用することが出来るようですが、 ドキュメント を読み解けるところから書いていきたいと思います。
read
以下の URL は MBean の java.lang:type=Memory
を指定しており Attribute として HeapMemoryUsage
を指定しています。
http://localhost:8080/jolokia/read/java.lang:type=Memory/HeapMemoryUsage
以下のように curl 等の HTTP クライアントを利用して値を取得することが可能です。
$ curl -s http://127.0.0.1:8778/jolokia/read/java.lang:type=Memory/HeapMemoryUsage | python -m json.tool { "request": { "attribute": "HeapMemoryUsage", "mbean": "java.lang:type=Memory", "type": "read" }, "status": 200, "timestamp": 1421762273, "value": { "committed": 259719168, "init": 268435456, "max": 1065025536, "used": 21187648 } }
以下のように POST
メソッドを利用することも可能です。
$ curl -X POST -s http://127.0.0.1:8778/jolokia/ -d ' > { > "type":"READ", > "mbean":"java.lang:type=Memory", > "attribute":"HeapMemoryUsage" > } > '| python -m json.tool { "request": { "attribute": "HeapMemoryUsage", "mbean": "java.lang:type=Memory", "type": "read" }, "status": 200, "timestamp": 1421763730, "value": { "committed": 259719168, "init": 268435456, "max": 1065025536, "used": 27714888 } }
また、アトリビュートである HeapMemoryUsage
の後に inner path
として used
や max
等をリクエスト URL に加えることで出力を絞り込むことが出来るようになります。
$ curl -s http://127.0.0.1:8778/jolokia/read/java.lang:type=Memory/HeapMemoryUsage/used | python -m json.tool { "request": { "attribute": "HeapMemoryUsage", "mbean": "java.lang:type=Memory", "path": "used", "type": "read" }, "status": 200, "timestamp": 1421762409, "value": 21992784 }
上記は HeapMemoryUsage
の used
の値が value
キーの値として返却されます。また、 max
を指定すると以下の通りです。
$ curl -s http://127.0.0.1:8778/jolokia/read/java.lang:type=Memory/HeapMemoryUsage/max | python -m json.tool { "request": { "attribute": "HeapMemoryUsage", "mbean": "java.lang:type=Memory", "path": "max", "type": "read" }, "status": 200, "timestamp": 1421762470, "value": 1065025536 }
search
以下のようにリクエストを投げることで MBean を検索することが出来ます。
/search/
例えば、以下のようにリクエストを投げると java.lang:
が含まれる MBean がレスポンスとして返却されます。
$ curl -s http://127.0.0.1:8778/jolokia/search/java.lang:* | python -m json.tool { "request": { "mbean": "java.lang:*", "type": "search" }, "status": 200, "timestamp": 1421763203, "value": [ "java.lang:name=CMS Old Gen,type=MemoryPool", "java.lang:type=Memory", "java.lang:name=Copy,type=GarbageCollector", "java.lang:name=Code Cache,type=MemoryPool", "java.lang:type=Runtime", "java.lang:type=ClassLoading", "java.lang:name=ConcurrentMarkSweep,type=GarbageCollector", "java.lang:type=Threading", "java.lang:type=Compilation", "java.lang:name=Eden Space,type=MemoryPool", "java.lang:name=Survivor Space,type=MemoryPool", "java.lang:name=CMS Perm Gen,type=MemoryPool", "java.lang:type=OperatingSystem", "java.lang:name=CodeCacheManager,type=MemoryManager" ] }
も少し絞り込んでみたいと思います。
$ curl -s http://127.0.0.1:8778/jolokia/search/java.lang:type=* | python -m json.tool { "request": { "mbean": "java.lang:type=*", "type": "search" }, "status": 200, "timestamp": 1421763309, "value": [ "java.lang:type=Compilation", "java.lang:type=Memory", "java.lang:type=Runtime", "java.lang:type=ClassLoading", "java.lang:type=Threading", "java.lang:type=OperatingSystem" ] }
ちなみに、 GET
ではなくて POST
メソッドでも同様の結果を得ることが可能ですので、以下のような出力が返却されます。
curl -X POST -s http://127.0.0.1:8778/jolokia/ -d ' { "type":"SEARCH", "mbean":"java.lang:type=*" } '| python -m json.tool { "request": { "mbean": "java.lang:type=*", "type": "search" }, "status": 200, "timestamp": 1421763525, "value": [ "java.lang:type=Compilation", "java.lang:type=Memory", "java.lang:type=Runtime", "java.lang:type=ClassLoading", "java.lang:type=Threading", "java.lang:type=OperatingSystem" ] }
list
以下のようにリクエストを投げることで MBean の一覧(メトリクスの一覧)を取得することが可能です。
/list/
例えば、以下のようにリクエストを投げるとアトリビュートの一覧が返却されます。
{ "request": { "path": "java.lang/type=Memory", "type": "list" }, "status": 200, "timestamp": 1421764732, "value": { "attr": { "HeapMemoryUsage": { "desc": "HeapMemoryUsage", "rw": false, "type": "javax.management.openmbean.CompositeData" }, "NonHeapMemoryUsage": { "desc": "NonHeapMemoryUsage", "rw": false, "type": "javax.management.openmbean.CompositeData" }, "ObjectName": { "desc": "ObjectName", "rw": false, "type": "javax.management.ObjectName" }, "ObjectPendingFinalizationCount": { "desc": "ObjectPendingFinalizationCount", "rw": false, "type": "int" }, "Verbose": { "desc": "Verbose", "rw": true, "type": "boolean" } }, "desc": "Information on the management interface of the MBean", "op": { "gc": { "args": [], "desc": "gc", "ret": "void" } } } }
同様に POST
メソッドでも同じような結果が得られます。
$ curl -X POST -s http://127.0.0.1:8778/jolokia/ -d ' { "type":"LIST", "path":"java.lang/type=Memory" } '| python -m json.tool { "request": { "path": "java.lang/type=Memory", "type": "list" }, "status": 200, "timestamp": 1421764817, "value": { "attr": { "HeapMemoryUsage": { "desc": "HeapMemoryUsage", "rw": false, "type": "javax.management.openmbean.CompositeData" }, "NonHeapMemoryUsage": { "desc": "NonHeapMemoryUsage", "rw": false, "type": "javax.management.openmbean.CompositeData" }, "ObjectName": { "desc": "ObjectName", "rw": false, "type": "javax.management.ObjectName" }, "ObjectPendingFinalizationCount": { "desc": "ObjectPendingFinalizationCount", "rw": false, "type": "int" }, "Verbose": { "desc": "Verbose", "rw": true, "type": "boolean" } }, "desc": "Information on the management interface of the MBean", "op": { "gc": { "args": [], "desc": "gc", "ret": "void" } } } }
exec
モニタリングという観点では若干縁遠いかもしれませんが exec
を利用するとコマンドを実行することが出来るようです。(※参考)
$ curl -s http://127.0.0.1:8778/jolokia/exec/java.lang:type=Memory/gc | python -m json.tool { "request": { "mbean": "java.lang:type=Memory", "operation": "gc", "type": "exec" }, "status": 200, "timestamp": 1421765363, "value": null }
上記は GC のリクエストを投げている例です。
ということで
Jolokia を利用して JMX のメトリクスを取得する sensu プラグインを作ってみました。(これについては改めて書きます。)
元記事はこちらです。
「俺の Jolokia チートシート」