我们知道 java 项目中的 JMX 接口信息是十分有用的,我们可以提取这些信息来分析或告警。但是 JMX 的 API 只在 java 中实现,因此,找到一个 Python 代码调用 Java 代码的桥梁是非常有意义的。JPype 就是这样的一个工具,利用它可以使 Python 程序方便的调用 Java 代码,从而扩充 Python 语言的能力,弥补 Python 语言的不足。本文介绍了如何利用 JPype 来对JMX接口进行访问查询。官方地址:
二、安装我们这里用pip安装简单一些。这里注意名称是JPype1。
# pip install JPype1 三、示例 #!/usr/bin/python import jpype from jpype import java from jpype import javax HOST='gf0' PORT=8386 USER='admin' # 这里没有配安全认证的话可以不填 PASS='mypass' # 同上 URL = "service:jmx:rmi:///jndi/rmi://%s:%d/jmxrmi" % (HOST, PORT) #this it the path of your libjvm /usr/lib/jvm/sun-jdk-1.6/jre/lib/amd64/server/libjvm.so on linux jpype.startJVM("/System/Library/Frameworks/JavaVM.framework/Libraries/libjvm_compat.dylib") # 这里写对应使用的jdk路径 java.lang.System.out.println("JVM load OK") jhash = java.util.HashMap() jarray=jpype.JArray(java.lang.String)([USER,PASS]) jhash.put (javax.management.remote.JMXConnector.CREDENTIALS, jarray); jmxurl = javax.management.remote.JMXServiceURL(URL) jmxsoc = javax.management.remote.JMXConnectorFactory.connect(jmxurl,jhash) connection = jmxsoc.getMBeanServerConnection(); object="java.lang:type=Threading" # 查询线程 attribute="ThreadCount" attr=connection.getAttribute(javax.management.ObjectName(object),attribute) print attribute, attr #Memory is a special case the answer is a Treemap in a CompositeDataSupport object="java.lang:type=Memory" # 查询内存 attribute="HeapMemoryUsage" attr=connection.getAttribute(javax.management.ObjectName(object),attribute) print attr.contents.get("used")这里只列举了几个指标。在java mission control上可以看到完整的各个指标,都可以拿来查询分析。