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

【摘要】

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

【正文】

监控原理
用cmdline-jmxclient-0.10.3.jar监控Tomcat的先决条件
JDK(Java Development Kit)环境安装配置(略过)
Tomcat 环境安装配置
解压安装包
开启防火墙8080端口
远程连接的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表示不使用监控,即不需要用户名和密码。实际配置如图:

​ ​​

2.获取配置原理

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

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

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

源码层级
如图:

 

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)

判断凭据是否健全,
否protected static void usage()
是protected static void usage(int exitCode, String message)
对参数进行处理
获取连接服务
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类型,方便处理。

posted @ 2023-03-18 15:33  呼长喜  阅读(139)  评论(0编辑  收藏  举报