我正在为 zabbix 开发监控脚本和模板的集合.它叫做ZTC并且所有脚本都在 python 上。
现在我想添加对一些 java 监控的支持。我还没有找到从 CPython 中做到这一点的方法——只能从 Java 或 jython 中找到。由于所有项目都在 python 上,我决定在 jython 上编写一个简单的脚本,它将从我的 cpython 类中调用。
这是我的代码的样子:
#!/usr/bin/env jython
#Java Dependencies
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.lang.management.ManagementFactory;
#Python Dependencies
import sys, cmd, socket
def usage():
print """Usage:
jmxclient.py -h
jmxclient.py <connect_url> <jmx_attribute_path> <jmx_property>"""
class JMXClient:
remote = None
def connect(self, connect_url):
if self.remote:
return True
#Establish Connection to JMX Server
url = javax.management.remote.JMXServiceURL(connect_url);
connector = javax.management.remote.JMXConnectorFactory.connect(url);
self.remote = connector.getMBeanServerConnection();
def getAttribute(self, mbean_path, attribute):
"""Query the mbean server for a specific attribute and return the
result"""
obn = javax.management.ObjectName(mbean_path);
result = self.remote.getAttribute(obn, attribute);
return result
if len(sys.argv) <= 1:
usage()
sys.exit(2)
if sys.argv[1] in ('-h', '--help'):
usage()
sys.exit(2)
if len(sys.argv) <> 4:
usage()
sys.exit(2)
(connect_url, mbean_path, attribute) = sys.argv[1:]
j = JMXClient()
j.connect(connect_url)
print j.getAttribute(mbean_path, attribute)
好的,现在我正在尝试从 terracotta 服务器获取一些属性。它使用带有 url 服务的 jmxmp:jmx:jmxmp://0.0.0.0:9520。
所以,我按如下方式运行我的脚本:
$ ./jmxclient.py service:jmx:jmxmp://localhost:9520 java.lang.ClassLoading LoadedClassCount
Traceback (innermost last):
File "./jmxclient.py", line 87, in ?
File "./jmxclient.py", line 61, in connect
at javax.management.remote.JMXConnectorFactory.newJMXConnector(JMXConnectorFactory.java:327)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:247)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:207)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
java.net.MalformedURLException: java.net.MalformedURLException: 不支持的协议(protocol): jmxmp
(由于一些剥离的评论,行号不相关)
如何添加对此 jmxmp 协议(protocol)的支持?
我发现它似乎可以通过 jmxremote_optional.jar 启用。如何将此 jar 添加到我的 jython(首选不是系统范围)?
更新:
按照建议,我从 jmxremote-1_0_1-ri-bin-b58.zip
引用实现中添加了 jmxremote_optional.jar 和 jmxremote.jar:jython -Djava.endorsed.dirs= . -Dpython.path=.../jmxremote_optional.jar:.../jmxremote.jar:.../jmissl.jar jmxclient.py 服务:jmx:jmxmp://localhost:9520 java.lang.ClassLoading LoadedClassCount
,但仍然出现相同的错误。我确定 jmxremote_optional.jar 在类路径中,代码似乎与引用示例非常相似。
阅读 api 文档后,我尝试了以下更改:
url = javax.management.remote.JMXServiceURL('jmxmp', 'localhost', 9520);
connector = javax.management.remote.jmxmp.JMXMPConnector(url)
connector.connect()
self.remote = connector.getMBeanServerConnection();
这让我想到了另一个异常(exception):
Traceback (innermost last):
File "../src/jmxclient.py", line 87, in ?
File "../src/jmxclient.py", line 61, in connect
at com.sun.jmx.remote.opt.security.AdminClient.connectionOpen(AdminClient.java:209)
at com.sun.jmx.remote.generic.ClientSynchroMessageConnectionImpl.connect(ClientSynchroMessageConnectionImpl.java:72)
at javax.management.remote.generic.GenericConnector.connect(GenericConnector.java:177)
at javax.management.remote.jmxmp.JMXMPConnector.connect(JMXMPConnector.java:119)
at javax.management.remote.generic.GenericConnector.connect(GenericConnector.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
java.io.IOException: java.io.IOException: javax.management.remote.message.HandshakeBeginMessage
Jython 版本是 2.2,我不喜欢用更高版本,因为这个脚本主要是在 RHEL5 机器上使用,他们只有 jython 2.2.1。
PS:将问题标记为已回答,因为我决定放弃并使用 jmxterm 或类似工具,只需添加 -Djava.endosed.dirs=/path/to/dir_with_jmxremote_optional/即可使用 jmxmp。 但我仍然希望看到 jython 解决方案。
最佳答案
伙计,我把那篇文章读了大约 7 遍......
无论如何,这就是我认为正在发生的事情。 jmxmp 协议(protocol)未打包在标准 J2SE 运行时中。看这个page .引用:
注意 – 如果您想使用 JMXMP 连接器,请从 http://java.sun.com/products/JavaManagement/download.html 下载 JSR 160 引用实现,并将 jmxremote_optional.jar 文件添加到类路径中。您将在 JSR 160 引用实现附带的 JMX 远程 API 教程中找到使用 JMXMP 连接器的示例。
我对 jython 不太熟悉,但它看起来像这样 post应该联系你。
关于java - Jython jmxmp 协议(protocol)支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5510939/