JmxtermはコマンドラインベースのJMXクライアントで、Tomcat等のJava MBeanサーバにアクセスできます。jconsoleのコマンドライン版的な感じです。面白いツールなので紹介したいと思います。
Jmxtermは、GyclopsGroup.org のオープンソースJavaプロジェクトです。
利用するまでの簡易手順
利用するにはまず、以下のページから jarファイルをダウンロードします。
http://wiki.cyclopsgroup.org/jmxterm/download
2013年5月現在では、以下のファイルがダウンロードできます。
jmxterm-1.0-alpha-4-uber.jar
使い方は、以下のようにダウンロードしたjarファイルを使って、Jmxtermのコンソールで操作する形となります。
$ java -jar jmxterm-1.0-alpha-4-uber.jar Welcome to JMX terminal. Type "help" for available commands. $>quit #bye $
JMXターミナルに入ったら、helpコマンドで利用オプションを表示する事ができます。
# java -jar jmxterm-1.0-alpha-4-uber.jar Welcome to JMX terminal. Type "help" for available commands. $>help #following commands are available to use: about - Display about page bean - Display or set current selected MBean. beans - List available beans under a domain or all domains bye - Terminate console and exit close - Close current JMX connection domain - Display or set current selected domain. domains - List all available domain names exit - Terminate console and exit get - Get value of MBean attribute(s) help - Display available commands or usage of a command info - Display detail information about an MBean jvms - List all running local JVM processes open - Open JMX session or display current connection option - Set options for command session quit - Terminate console and exit run - Invoke an MBean operation set - Set value of an MBean attribute $>
さまざまなコマンドが用意されています。
TomcatのMBeanを確認する方法
Jmxtermを利用して、様々なJava MBeanサーバにアクセスできますが、以下にTomcatを使った利用方法を記載します。
まず、上記載例のとおり、Jmxtermターミナルに接続しておきます。
次に、Tomcatサーバにopenコマンドで接続します。(TomcatはJMXで作業端末から接続できる状態にしておく必要があります。)
# java -jar jmxterm-1.0-alpha-4-uber.jar Welcome to JMX terminal. Type "help" for available commands. $> $>open (Tomcatサーバ):(JMXポート) #Connection to (Tomcatサーバ):(JMXポート) is opened $>domains #following domains are available Catalina JMImplementation Users com.sun.management java.lang java.nio java.util.logging $>
Catalinaドメインを始め、幾つかのドメインが表示されます。
次に、Catalina のMBeansリストを表示してみます。CatalinaドメインのMBeansリストが沢山表示されます。
$>beans -d Catalina #domain = Catalina: Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Servlet,name=default Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Servlet,name=jsp Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,name=jsp,type=JspMonitor Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,j2eeType=Servlet,name=default Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,j2eeType=Servlet,name=jsp Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/docs,name=jsp,type=JspMonitor Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Compression Filter Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Request Dumper Filter Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Set Character Encoding Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Filter,name=Timing filter Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=ChatServlet Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=CompressionFilterTestServlet Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=CookieExample Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=HelloWorldExample Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=RequestHeaderExample Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=RequestInfoExample Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=RequestParamExample Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=ServletToJsp Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=SessionExample Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async0 Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async1 Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async2 Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=async3 Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=default Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=jsp Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=stock Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsChat Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsEchoMessage Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsEchoStream Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=wsSnake Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,name=jsp,type=JspMonitor Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Filter,name=CSRF Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Filter,name=SetCharacterEncoding Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=HTMLHostManager Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=HostManager Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=default Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,j2eeType=Servlet,name=jsp Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/host-manager,name=jsp,type=JspMonitor Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Filter,name=CSRF Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Filter,name=SetCharacterEncoding Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=HTMLManager Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=JMXProxy Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=Manager Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=Status Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=default Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=jsp Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,name=jsp,type=JspMonitor Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/ Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/docs Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/examples Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/host-manager Catalina:J2EEApplication=none,J2EEServer=none,j2eeType=WebModule,name=//localhost/manager Catalina:class=org.apache.catalina.UserDatabase,name="UserDatabase",resourcetype=Global,type=Resource Catalina:context=/,host=localhost,name=StandardContextValve,type=Valve Catalina:context=/,host=localhost,type=Cache Catalina:context=/,host=localhost,type=Loader Catalina:context=/,host=localhost,type=Manager Catalina:context=/,host=localhost,type=NamingResources Catalina:context=/,host=localhost,type=WebappClassLoader Catalina:context=/docs,host=localhost,name=StandardContextValve,type=Valve Catalina:context=/docs,host=localhost,type=Cache Catalina:context=/docs,host=localhost,type=Loader Catalina:context=/docs,host=localhost,type=Manager Catalina:context=/docs,host=localhost,type=NamingResources Catalina:context=/docs,host=localhost,type=WebappClassLoader Catalina:context=/examples,host=localhost,name=FormAuthenticator,type=Valve Catalina:context=/examples,host=localhost,name=StandardContextValve,type=Valve Catalina:context=/examples,host=localhost,name=foo/bar/name2,resourcetype=Context,type=Environment Catalina:context=/examples,host=localhost,name=foo/name1,resourcetype=Context,type=Environment Catalina:context=/examples,host=localhost,name=foo/name4,resourcetype=Context,type=Environment Catalina:context=/examples,host=localhost,name=minExemptions,resourcetype=Context,type=Environment Catalina:context=/examples,host=localhost,name=name3,resourcetype=Context,type=Environment Catalina:context=/examples,host=localhost,type=Cache Catalina:context=/examples,host=localhost,type=Loader Catalina:context=/examples,host=localhost,type=Manager Catalina:context=/examples,host=localhost,type=NamingResources Catalina:context=/examples,host=localhost,type=WebappClassLoader Catalina:context=/host-manager,host=localhost,name=BasicAuthenticator,type=Valve Catalina:context=/host-manager,host=localhost,name=StandardContextValve,type=Valve Catalina:context=/host-manager,host=localhost,type=Cache Catalina:context=/host-manager,host=localhost,type=Loader Catalina:context=/host-manager,host=localhost,type=Manager Catalina:context=/host-manager,host=localhost,type=NamingResources Catalina:context=/host-manager,host=localhost,type=WebappClassLoader Catalina:context=/manager,host=localhost,name=BasicAuthenticator,type=Valve Catalina:context=/manager,host=localhost,name=StandardContextValve,type=Valve Catalina:context=/manager,host=localhost,type=Cache Catalina:context=/manager,host=localhost,type=Loader Catalina:context=/manager,host=localhost,type=Manager Catalina:context=/manager,host=localhost,type=NamingResources Catalina:context=/manager,host=localhost,type=WebappClassLoader Catalina:host=localhost,name=AccessLogValve,type=Valve Catalina:host=localhost,name=ErrorReportValve,type=Valve Catalina:host=localhost,name=StandardHostValve,type=Valve Catalina:host=localhost,type=Deployer Catalina:host=localhost,type=Host Catalina:name="ajp-bio-8009",type=GlobalRequestProcessor Catalina:name="ajp-bio-8009",type=ThreadPool Catalina:name="http-bio-8080",type=GlobalRequestProcessor Catalina:name="http-bio-8080",type=ThreadPool Catalina:name=HttpRequest1,type=RequestProcessor,worker="http-bio-8080" Catalina:name=HttpRequest2,type=RequestProcessor,worker="http-bio-8080" Catalina:name=HttpRequest3,type=RequestProcessor,worker="http-bio-8080" Catalina:name=HttpRequest4,type=RequestProcessor,worker="http-bio-8080" Catalina:name=HttpRequest5,type=RequestProcessor,worker="http-bio-8080" Catalina:name=HttpRequest6,type=RequestProcessor,worker="http-bio-8080" Catalina:name=StandardEngineValve,type=Valve Catalina:name=common,type=ServerClassLoader Catalina:port=8009,type=Connector Catalina:port=8009,type=Mapper Catalina:port=8009,type=ProtocolHandler Catalina:port=8080,type=Connector Catalina:port=8080,type=Mapper Catalina:port=8080,type=ProtocolHandler Catalina:realmPath=/realm0,type=Realm Catalina:realmPath=/realm0/realm0,type=Realm Catalina:type=Engine Catalina:type=MBeanFactory Catalina:type=NamingResources Catalina:type=Server Catalina:type=Service Catalina:type=StringCache $>
とても沢山のMBeanリストが表示されます。
次に、Catalinaドメインと bean名を指定し、MBeanが供給できる情報を表示させてみます。
$>info -b name="http-bio-8080",type=ThreadPool -d Catalina #mbean = Catalina:name="http-bio-8080",type=ThreadPool #class name = org.apache.tomcat.util.modeler.BaseModelMBean # attributes %0 - acceptorThreadCount (int, rw) %1 - acceptorThreadPriority (int, rw) %2 - algorithm (java.lang.String, rw) %3 - allowUnsafeLegacyRenegotiation (java.lang.String, rw) %4 - backlog (int, rw) %5 - bindOnInit (boolean, rw) %6 - ciphers (java.lang.String, rw) %7 - ciphersArray ([Ljava.lang.String;, r) %8 - clientAuth (java.lang.String, rw) %9 - connectionCount (long, r) %10 - crlFile (java.lang.String, rw) %11 - currentThreadCount (int, r) %12 - currentThreadsBusy (int, r) %13 - daemon (boolean, rw) %14 - deferAccept (boolean, r) %15 - keepAliveTimeout (int, rw) %16 - keyAlias (java.lang.String, rw) %17 - keyPass (java.lang.String, rw) %18 - keystoreFile (java.lang.String, rw) %19 - keystorePass (java.lang.String, rw) %20 - keystoreProvider (java.lang.String, rw) %21 - keystoreType (java.lang.String, rw) %22 - localPort (int, r) %23 - maxConnections (int, rw) %24 - maxHeaderCount (int, rw) %25 - maxKeepAliveRequests (int, rw) %26 - maxThreads (int, rw) %27 - minSpareThreads (int, rw) %28 - modelerType (java.lang.String, r) %29 - name (java.lang.String, rw) %30 - paused (boolean, r) %31 - port (int, rw) %32 - running (boolean, r) %33 - sSLEnabled (boolean, rw) %34 - sessionCacheSize (java.lang.String, rw) %35 - sessionTimeout (java.lang.String, rw) %36 - soLinger (int, rw) %37 - soTimeout (int, rw) %38 - socketProperties (org.apache.tomcat.util.net.SocketProperties, r) %39 - sslEnabledProtocols (java.lang.String, w) %40 - sslEnabledProtocolsArray ([Ljava.lang.String;, r) %41 - sslProtocol (java.lang.String, rw) %42 - tcpNoDelay (boolean, rw) %43 - threadPriority (int, rw) %44 - trustManagerClassName (java.lang.String, rw) %45 - trustMaxCertLength (java.lang.String, rw) %46 - truststoreAlgorithm (java.lang.String, rw) %47 - truststoreFile (java.lang.String, rw) %48 - truststorePass (java.lang.String, rw) %49 - truststoreProvider (java.lang.String, rw) %50 - truststoreType (java.lang.String, rw) %51 - useComet (boolean, r) %52 - useCometTimeout (boolean, r) %53 - usePolling (boolean, r) %54 - useSendfile (boolean, r) # operations %0 - java.lang.String adjustRelativePath(java.lang.String param0,java.lang.String param1) %1 - void bind() %2 - void createExecutor() %3 - void destroy() %4 - java.lang.Object getAttribute(java.lang.String param0) %5 - java.lang.String getProperty(java.lang.String param0) %6 - void init() %7 - void pause() %8 - void resume() %9 - boolean setProperty(java.lang.String param0,java.lang.String param1) %10 - void shutdownExecutor() %11 - void start() %12 - void startInternal() %13 - void stop() %14 - void stopInternal() %15 - void unbind() #there's no notifications $>
次は、実際にMBeanから値を表示してみます。
$>get -b name="http-bio-8080",type=ThreadPool -d Catalina * #mbean = Catalina:name="http-bio-8080",type=ThreadPool: useSendfile = false; acceptorThreadPriority = 5; minSpareThreads = 10; maxThreads = 200; sSLEnabled = false; keystorePass = null; localPort = 8080; connectionCount = 1; currentThreadCount = 10; keepAliveTimeout = 20000; threadPriority = 5; keyPass = null; useComet = false; soLinger = -1; sslEnabledProtocolsArray = [ ]; #RuntimeIOException: Runtime IO exception: error unmarshalling return; nested exception is: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.apache.tomcat.util.net.SocketProperties $>
Catalina の http-bio-8080 の ThreadPool に関する値が表示されました。
ちなみに、最後に「RuntimeIOException」が表示されるのは、jmxtermがセキュリティマネージャ機能を持っていない為らしいです。
Jmxterm は、コマンドラインツールなので、例えばBash Shellなどを使って、MBeanの値を取得する事も可能です。
必要に応じて色々なケースで利用できる可能性があるツールだと思います。
参考
https://wiki.jasig.org/display/UPM32/Monitoring+uPortal+MBeans,+Jmxterm+and+Cacti