一, 介绍
我们知道 java 项目中的 JMX 接口信息是十分有用的, 我们可以提取这些信息来分析或告警. 但是 JMX 的 API 只在 java 中实现, 因此, 找到一个 Python 代码调用 Java 代码的桥梁是非常有意义的. JPype 就是这样的一个工具, 利用它可以使 Python 程序方便的调用 Java 代码, 从而扩充 Python 语言的能力, 弥补 Python 语言的不足. 本文介绍了如何利用 JPype 来对 JMX 接口进行访问查询. 官方地址: http://jpype.sourceforge.net/
二, 安装
我们这里用 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 上可以看到完整的各个指标, 都可以拿来查询分析.
四, 参考地址
http://blog.nobugware.com/post/2010/11/08/jmx-query-python-cpython/
来源: https://www.cnblogs.com/bugsbunny/p/8397715.html