如何在jython/python中解析getAttribute(jmx)的输出

2024-05-28 19:22:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用jython时遇到了一个问题。 当我使用jython/python脚本访问MBean时,我得到了打印的值,但是我想解析结果,以便能够提取出需要的内容。在

下面是代码和输出:

def get_attribute(mbean,attribute):
    #<domain>:type=<type>
    obn = javax.management.ObjectName(mbean)
    #<attribute> ie: HeapMemoryUsage
    return remote.getAttribute(obn, attribute)

print get_attribute("java.lang:type=Memory","HeapMemoryUsage")

文本输出为:

在javax.management.openmbean.CompositeDataSupport(复合类型=javax.management.openmbean.CompositeType(名称=java.lang.management管理.MemoryUsage,items=((itemName=committed,itemType)=javax.management.openmbean.SimpleType(名称=java.lang.Long文件)),(项目名称=初始化,项目类型=javax.management.openmbean.SimpleType(名称=java.lang.Long文件)),(项目名称=最大值,项目类型=javax.management.openmbean.SimpleType(名称=java.lang.Long文件)),(项目名称=已使用,项目类型=javax.management.openmbean.SimpleType(名称=java.lang.Long文件)))),contents={committed=61276160,init=63313088,max=129761280,used=30232944})

如果有人能给我一些例子或想法那就太好了。在

非常感谢。在

例如,对于Jython,如果您想获取有关一个MBean的信息,那么可以很容易地调用:

^{pr2}$

但是,输出是这样的:

javax.management.MBeanInfo[description=Information on the management interface of the MBean, attributes=[javax.management.MBeanAttributeInfo[description=Verbose, name=Verbose, type=boolean, read/write, isIs, descriptor={openType=javax.management.openmbean.SimpleType(name=java.lang.Boolean), originalType=boolean}], javax.management.openmbean.OpenMBeanAttributeInfoSupport(name=HeapMemoryUsage,openType=javax.management.openmbean.CompositeType(name=java.lang.management.MemoryUsage,items=((itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)))),default=null,minValue=null,maxValue=null,legalValues=null,descriptor={openType=javax.management.openmbean.CompositeType(name=java.lang.management.MemoryUsage,items=((itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)))), originalType=java.lang.management.MemoryUsage}), javax.management.MBeanAttributeInfo[description=ObjectPendingFinalizationCount, name=ObjectPendingFinalizationCount, type=int, read-only, descriptor={openType=javax.management.openmbean.SimpleType(name=java.lang.Integer), originalType=int}], javax.management.openmbean.OpenMBeanAttributeInfoSupport(name=NonHeapMemoryUsage,openType=javax.management.openmbean.CompositeType(name=java.lang.management.MemoryUsage,items=((itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)))),default=null,minValue=null,maxValue=null,legalValues=null,descriptor={openType=javax.management.openmbean.CompositeType(name=java.lang.management.MemoryUsage,items=((itemName=committed,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=init,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=max,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)),(itemName=used,itemType=javax.management.openmbean.SimpleType(name=java.lang.Long)))), originalType=java.lang.management.MemoryUsage}), javax.management.openmbean.OpenMBeanAttributeInfoSupport(name=ObjectName,openType=javax.management.openmbean.SimpleType(name=javax.management.ObjectName),default=null,minValue=null,maxValue=null,legalValues=null,descriptor={openType=javax.management.openmbean.SimpleType(name=javax.management.ObjectName), originalType=javax.management.ObjectName})], constructors=[], operations=[javax.management.MBeanOperationInfo[description=gc, name=gc, returnType=void, signature=[], impact=unknown, descriptor={openType=javax.management.openmbean.SimpleType(name=java.lang.Void), originalType=void}]], notifications=[javax.management.MBeanNotificationInfo[description=Memory Notification, name=javax.management.Notification, notifTypes=[java.management.memory.threshold.exceeded, java.management.memory.collection.threshold.exceeded], descriptor={}]], descriptor={immutableInfo=true, interfaceClassName=java.lang.management.MemoryMXBean, mxbean=true}]

所以,如果有人知道一个很好的方法来将这些输出解析成某个对象,为了得到一个漂亮的显示,请给出评论。在

非常感谢。在


Tags: namelangjavanullmanagementlongopentypedescriptor
1条回答
网友
1楼 · 发布于 2024-05-28 19:22:25

我自己找到了答案。在

其思想是将结果保存为一个对象。然后对该对象调用方法get(""),即obj.get("committed")。 实际上,当调用"print obj"时,我得到了与上面相同的结果,因为我相信python调用了该对象的toString()方法。在

我发布了一个示例代码,希望它能对某些人有所帮助。在

  1 import javax.management.remote.JMXConnector;
  2 import javax.management.remote.JMXConnectorFactory;
  3 import javax.management.remote.JMXServiceURL;
  4 import javax.management.ObjectName as ObjectName;
  5 import java.lang.management.ManagementFactory;
  6 import sys, cmd, socket, optparse
  7 from urlparse import urljoin
  8 from cmd import Cmd
  9 
 10 def get_connection(host, port):
 11     serviceURL = str()
 12     serviceURL = "service:jmx:rmi:///jndi/rmi://"
 13     serviceURL = serviceURL + host + ":" + str(port) + "/jmxrmi"
 14         url =  javax.management.remote.JMXServiceURL(serviceURL);
 15         connector = javax.management.remote.JMXConnectorFactory.connect(url);
 16         global remote
 17         remote = connector.getMBeanServerConnection();
 18 
 19 def get_domain_list():
 20         domainList = []
 21         get_connection('127.0.0.1', 1099)
 22         domainList = remote.getDomains()
 23         return domainList
 24 
 25 def print_domain_list():
 26         domainList = get_domain_list()
 27         for element in domainList:
 28             print element
 29 
 30 def get_domain_objects(domain):
 31         pass
 32 
 33 def get_object_list():
 34         dmiDomains = {}
 35         domainList = get_domain_list()
 36         for element in domainList:
 37         print element
 38         str = element + ":*"
 39         for ele in remote.queryNames(ObjectName(str),None):
 40             print "\t\t" + ele.toString()
 41         return dmiDomains
 42 
 43 def get_mbean_list():
 44         dmiDomains = {}
 45         domainList = get_domain_list()
 46         for element in domainList:
 47         print element
 48         str = element + ":*"
 49         for ele in remote.queryMBeans(ObjectName(str),None):
 50             print "\t\t" + ele.toString()
 51     
 52     obj = remote.getMBeanInfo(ObjectName("java.lang:type=Memory"))
 53     print obj.getClass();
 54     for element in obj.getAttributes():
 55         print element.toString() + "\n"
 56     return dmiDomains
 57 
 58 def get_attribute(mbean,attribute):
 59         #<domain>:type=<type>
 60         obn = javax.management.ObjectName(mbean)
 61     #<attribute> ie: HeapMemoryUsage
 62         return remote.getAttribute(obn, attribute)
 63 
 64 print print_domain_list()
 65 print get_object_list()
 66 print get_mbean_list()
 67 
 68 obj = get_attribute("java.lang:type=Memory","HeapMemoryUsage")
 69 print "="*25
 70 print "Heap Memory usage :"
 71 print "="*25
 72 print "Commited bytes : " + str(obj.get("committed"))
 73 print "Init bytes : " + str(obj.get("init"))
 74 print "Max bytes : " + str(obj.get("max"))
 75 print "Used bytes : " + str(obj.get("used"))
 76 print "="*25

相关问题 更多 >

    热门问题