How to parse getAttribute (jmx) output in jython / python

I ran into a problem using jython. I get the value printed when I access the MBean with a jython / python script, but I would like to analyze the result so that I can just extract what is needed.

Here is the code and output:

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") 

Text output:

javax.management.openmbean.CompositeDataSupport (compositeType = javax.management.openmbean.CompositeType (name = java.lang.management.MemoryUsage, elements = ((ITEMNAME = done, ItemType = javax.management.openmbean.Simpleava lang.Long)), (ITEMNAME = initial, 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)))), contents = {commit = 61276160, init = 63313088, max = 129761280, used = 30232944})

If someone can give me an example or idea, that would be great.

Many thanks.

For example, with Jython, if you want to get information about one MBean, then it is easy to call it:

 print remote.getMBeanInfo(ObjectName("java.lang:type=Memory")) 

But again, the output looks something like this:

 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}] 

So, if someone knows a good way to parse this output to some object in order to get a nice display, please give a comment.

Many thanks.

+4
source share
1 answer

I found the answer myself.

The idea is to save the result as an object. Then call the get("") method on this object, i.e. obj.get("committed") . In fact, when I call "print obj" I get the same result as above, because I believe that python calls the toString() method of this object.

I am posting a sample code, hoping this helps someone.

  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 
+3
source

Source: https://habr.com/ru/post/1496946/


All Articles