nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

WildFlyのJMXへスクリプトからアクセスする

監視などの目的でGUIなJConsoleではなく、スクリプトからJMXへアクセスしたいことがあります。JBoss AS 6まではtwiddleというコマンドベースのJMXクライアントが付属しましたがAS7やWildFlyには付属していません。さてどうするか、ということでいくつか手段があります。

Jolokia

JolokiaJMX over HTTPを提供するツールです。RESTでJMXアクセスできます。WildFlyではwar版を利用するのが一番簡単でしょう。

$ curl http://localhost:8080/jolokia-war-1.2.0/exec/java.lang:type=Memory/gc
{"timestamp":1397463592,"status":200,"request":{"operation":"gc","mbean":"java.lang:type=Memory","type":"exec"},"value":null}
$ curl http://localhost:8080/jolokia-war-1.2.0/read/java.lang:type=Memory/HeapMemoryUsage
{"timestamp":1397463683,"status":200,"request":{"mbean":"java.lang:type=Memory","attribute":"HeapMemoryUsage","type":"read"},"value":{"max":510066688,"committed":510066688,"init":536870912,"used":30441040}}

Jmxterm

JmxtermというJMX Remotingを使うCLIJMXツールがあります。WildFlyJMX Remotingを利用してリモート接続するにはjboss-cli-client.jarがクラスパスに必要なので、クラスパスの変更ができないjava -jarでJmxtermを起動してはいけません。

$ java -classpath ./jmxterm-1.0-alpha-4-uber.jar:$WFLY_HOME/bin/client/jboss-cli-client.jar org.codehaus.classworlds.uberjar.boot.Bootstrapper -l "service:jmx:http-remoting-jmx://localhost:9990"

JBoss EAP6の場合はhttp-remoting-jmxではなくremoting-jmxで、ポートが9999になります。

JRuby

一番ラクだし自由度も高いので個人的にはやっぱりJRubyです。$WFLY_HOME/binに置いてjrubyで実行。

require 'java'
require 'client/jboss-cli-client.jar'
java_import 'javax.management.remote.JMXConnectorFactory'
java_import 'javax.management.remote.JMXServiceURL'

host_name = "localhost"
port = 9990

jmx_service_url = JMXServiceURL.new("service:jmx:http-remoting-jmx://#{host_name}:#{port}")
environment = {} # empty hash
jmx_connector = JMXConnectorFactory::connect(jmx_service_url, environment)
conn = jmx_connector.getMBeanServerConnection()
puts conn.getMBeanCount()
jmx_connector.close
$ jruby jmx.rb
857