Before monitoring Glassfish Server, it should be configured for this purpose. In admin service, you should edit jmx connector settings properly. For detailed explanation, please visit this link.
When the editing is done, it is time to code. First, connection to jmx service should be established. However, to achieve this, JMX java library is required. Oracle doesn't provide this library in any other languages, therefore we are forced to take this action in java. Fortunately, in python, with the help of jpype library, we can open a jvm and use the library. Jython is another option to use java libraries in python environment. For this tutorial, we will use jpype, so it is better to quickly install it.
Each class has its own attributes. By giving the class name, simply the corresponding attributes are attained. If you wonder why I have given lots of properties in the example, my answer will be that because I afford to find the attributes and evaluate their importance. I hope it will be also useful for your case. To see full list of classes and properties, visit glassfish jconsole.
When the editing is done, it is time to code. First, connection to jmx service should be established. However, to achieve this, JMX java library is required. Oracle doesn't provide this library in any other languages, therefore we are forced to take this action in java. Fortunately, in python, with the help of jpype library, we can open a jvm and use the library. Jython is another option to use java libraries in python environment. For this tutorial, we will use jpype, so it is better to quickly install it.
import jpype
from jpype import java
from jpype import javax
class Glassfish:
def __init__(self, gip, gport):
self.url = "service:jmx:rmi:///jndi/rmi://%s:%d/jmxrmi" % (gip, gport)
jpype.startJVM(constants.jvm_path)
java.lang.System.out.println("JVM has been started.")
environment = java.util.HashMap()
credentials = jpype.JArray(java.lang.String)([glassfish_user, glassfish_password])
environment.put(javax.management.remote.JMXConnector.CREDENTIALS, credentials)
self.jmxurl = javax.management.remote.JMXServiceURL(self.url)
self.jmxc = javax.management.remote.JMXConnectorFactory.connect(self.jmxurl, environment)
self.mbsc = self.jmxc.getMBeanServerConnection()
In the code above, jvm is started. As second step, python client is authorized to retrieve status data. Finally, MBeanServerConnection is established which provides them.def get_data(self):
glassfish_data = {}
#get attributes of Threading
threading = "java.lang:type=Threading"
peakThreadCount = "PeakThreadCount"
threadCount = "ThreadCount"
daemonThreadCount = "DaemonThreadCount"
glassfish_data['Threading.%s' %peakThreadCount]= self.mbsc.getAttribute(javax.management.ObjectName(threading), peakThreadCount)
glassfish_data['Threading.%s' %threadCount] = self.mbsc.getAttribute(javax.management.ObjectName(threading), threadCount)
glassfish_data['Threading.%s' %daemonThreadCount] = self.mbsc.getAttribute(javax.management.ObjectName(threading), daemonThreadCount)
#get attributes of Memory
memory="java.lang:type=Memory"
hMemoryUsage="HeapMemoryUsage"
nonHMemoryUsage = "NonHeapMemoryUsage"
attr=self.mbsc.getAttribute(javax.management.ObjectName(memory), hMemoryUsage)
glassfish_data["Memory.%s.used" % hMemoryUsage] = attr.contents.get("used")
glassfish_data["Memory.%s.max" % hMemoryUsage] = attr.contents.get("max")
glassfish_data["Memory.%s.committed" % hMemoryUsage] = attr.contents.get("committed")
attr=self.mbsc.getAttribute(javax.management.ObjectName(memory), nonHMemoryUsage)
glassfish_data["Memory.%s.used" % nonHMemoryUsage] = attr.contents.get("used")
glassfish_data["Memory.%s.max" % nonHMemoryUsage] = attr.contents.get("max")
glassfish_data["Memory.%s.committed" % nonHMemoryUsage] = attr.contents.get("committed")
#get attributes of ClassLoading
classLoading = "java.lang:type=ClassLoading"
loadedClassCnt = "LoadedClassCount"
unloadedClassCnt = "UnloadedClassCount"
glassfish_data["ClassLoading.%s" % loadedClassCnt] = self.mbsc.getAttribute(javax.management.ObjectName(classLoading), loadedClassCnt)
glassfish_data["ClassLoading.%s" % unloadedClassCnt] = self.mbsc.getAttribute(javax.management.ObjectName(classLoading), unloadedClassCnt)
#get attributes of OperatingSystem
os = "java.lang:type=OperatingSystem"
maxFileDC = "MaxFileDescriptorCount"
openFileDC = "OpenFileDescriptorCount"
freePhysicalMS = "FreePhysicalMemorySize"
freeSwapSS = "FreeSwapSpaceSize"
processCpuLoad = "ProcessCpuLoad"
sysLoadAvg = "SystemLoadAverage"
glassfish_data["OS.%s" % maxFileDC] = self.mbsc.getAttribute(javax.management.ObjectName(os), maxFileDC)
glassfish_data["OS.%s" % openFileDC] = self.mbsc.getAttribute(javax.management.ObjectName(os), openFileDC)
glassfish_data["OS.%s" % freePhysicalMS] = self.mbsc.getAttribute(javax.management.ObjectName(os), freePhysicalMS)
glassfish_data["OS.%s" % freeSwapSS] = self.mbsc.getAttribute(javax.management.ObjectName(os), freeSwapSS)
glassfish_data["OS.%s" % processCpuLoad] = self.mbsc.getAttribute(javax.management.ObjectName(os), processCpuLoad)
glassfish_data["OS.%s" % sysLoadAvg] = self.mbsc.getAttribute(javax.management.ObjectName(os), sysLoadAvg)
return glassfish_data
In the second code block above, status data of glassfish server is being fetched. They are many as seen, because I found them useful for my case and there are more.Each class has its own attributes. By giving the class name, simply the corresponding attributes are attained. If you wonder why I have given lots of properties in the example, my answer will be that because I afford to find the attributes and evaluate their importance. I hope it will be also useful for your case. To see full list of classes and properties, visit glassfish jconsole.
Comments
Post a Comment