ども、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> には readwritelist そして exec 等があります。また、HTTP の GETPOST のメソッドを利用することが出来るようですが、 ドキュメント を読み解けるところから書いていきたいと思います。

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 として usedmax 等をリクエスト 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
}

上記は HeapMemoryUsageused の値が 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 チートシート