浅谈Tomcat监控原理 --cmdline-jmxclient-0.10.3.jar源码解析

【摘要】

cmdline-jmxclient-0.10.3.jar是一个开源jar包,在zabbix3.0中常用于测试的一个工具,可以用来测试jmx是否配置正确。在监控方面后还可以对Tomcat各种属性进行监控。本文主要从源码jar包反编译后生成的class文件源码进行说明,分析获取监控属性的原理。

【正文】

  • 监控原理
    1. 用cmdline-jmxclient-0.10.3.jar监控Tomcat的先决条件
      1. JDK(Java Development Kit)环境安装配置(略过)
      2. Tomcat 环境安装配置
      3. 解压安装包
        1. 开启防火墙8080端口
        2. 远程连接的jmx监控参数配置,修改catalina.sh文件。找到如下内容“#—–Execute The Requested Command”,在其上添加以下配置,此配置不需要用户名、密码。

CATALINA_OPTS=”$CATALINA_OPTS

-Dcom.sun.management.jmxremote

-Djava.rmi.server.hostname=192.168.23.1

-Dcom.sun.management.jmxremote.port=9999

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=false”

ip是你要监控的tomcat所在服务器的ip地址,端口号,是你要开启的监控端口号。ssl,false表示不使用ssl链接authenticate,false表示不使用监控,即不需要用户名和密码。实际配置如图:

浅谈Tomcat监控原理 --cmdline-jmxclient-0.10.3.jar源码解析_第1张图片 ​​

 

             2.获取配置原理

传入特定的IP和端口以及类型区域和Bean属性名称连接JVM,获取Bean下面的相关属性。(

可以传入上文中配置账号密码进行权限校验)

  • 源码结构

源码为cmdline-jmxclient-0.10.3.jar反编译出来的java文件

  1. 源码层级

如图:浅谈Tomcat监控原理 --cmdline-jmxclient-0.10.3.jar源码解析_第2张图片

 

 

 

2.源码分析

主函数入口:

         public static void main(String[] args) throws Exception {

        Client client = new Client();

        Logger l = Logger.getLogger("");

        Handler[] hs = l.getHandlers();  //日志队列

        for(int i = 0; i < hs.length; i++) {

            Handler h = hs[0];

            if (h instanceof java.util.logging.ConsoleHandler) {

                client.getClass(); h.setFormatter(new OneLineSimpleLogger(client));

            }

        }

        client.execute(args);

}

         主要执行函数:protected void execute(String[] args)

  1. 判断凭据是否健全,
    1. 否protected static void usage()
    2. 是protected static void usage(int exitCode, String message)
  2. 对参数进行处理
  3. 获取连接服务

JMXServiceURL rmiurl = new JMXServiceURL("service:jmx:rmi://" + hostport + "/jndi/rmi://" + hostport + "/jmxrmi");

4.连接客户端:

jmxc = JMXConnectorFactory.connect(rmiurl, formatCredentials(userpass));

5.获取连接对象:

MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

6.获取Bean的实例名

ObjectInstance instance = (ObjectInstance)beans.iterator().next();

7.连接Bean对象,传入client,实例名和操作命令(单Bean和多Bean分别处理)

doBean(mbsc, instance, command);

8.获取属性列表

listOptions(mbsc, instance);

操作相关的略:doSubCommand(mbsc, instance, command[i]);

核心方法是两个递归:recurseCompositeData

                                             recurseTabularData

9.获取属性信息

MBeanInfo info = mbsc.getMBeanInfo(instance.getObjectName());

MBeanAttributeInfo[] attributes = info.getAttributes();

讲属性信息打印输出:

if (attributes.length > 0) {

            System.out.println("Attributes:");

            for (int i = 0; i < attributes.length; i++) {

                System.out.println(' ' + attributes[i].getName() + ": " + attributes[i].getDescription() + " (type=" + attributes[i].getType() + ")");

            }

        }

10.关闭连接

jmxc.close();

  • 如何使用

使用demo:

java -jar cmdline-jmxclient-0.10.3.jar – 192.168.163.213:12346 java.lang:type=Memory NonHeapMemoryUsage

 

获取堆内存状况,返回值

committed: 24313856

init: 24313856

max: 136314880  (堆最大分配空间)

used: 16842264   (当前堆使用空间)

  • 总结

通过采用cmdline-jmxclient-0.10.3.jar获取jvm信息的方式存在返回结果格式不确定的问题,难以用共性凝练以及复用。并且cmdline-jmxclient-0.10.3.jar中采用的jdk语法多为java Platfrom SE5.0和java Platfrom SE6.0。在更高级的jdk版本当中会有一些方法的弃用,对于语法兼容性和bug问题存在未知方向。

后期研究方向为使用jolokia获取监控信息,对中间件进行监控修改,jolokia的优点是返回的参数为json类型,方便处理。

 

        

 

你可能感兴趣的:(源码)