Groovy - JMX

  • 简述

    JMX 是事实上的标准,用于监控所有与 Java 虚拟环境有关的应用程序。鉴于 Groovy 直接位于 Java 之上,Groovy 可以利用已经为 JMX 和 Java 完成的大量工作。
  • 监控 JVM

    可以使用 java.lang.management 中可用的标准类来执行 JVM 的监视。以下代码示例显示了如何完成此操作。
    
    import java.lang.management.*
    def os = ManagementFactory.operatingSystemMXBean 
    println """OPERATING SYSTEM: 
    \tOS architecture = $os.arch 
    \tOS name = $os.name 
    \tOS version = $os.version 
    \tOS processors = $os.availableProcessors 
    """ 
     
    def rt = ManagementFactory.runtimeMXBean 
    println """RUNTIME: 
       \tRuntime name = $rt.name 
       \tRuntime spec name = $rt.specName 
       \tRuntime vendor = $rt.specVendor 
       \tRuntime spec version = $rt.specVersion 
       \tRuntime management spec version = $rt.managementSpecVersion 
       """ 
    def mem = ManagementFactory.memoryMXBean 
    def heapUsage = mem.heapMemoryUsage 
    def nonHeapUsage = mem.nonHeapMemoryUsage 
    println """MEMORY: 
       HEAP STORAGE: 
          \tMemory committed = $heapUsage.committed 
          \tMemory init = $heapUsage.init 
          \tMemory max = $heapUsage.max 
          \tMemory used = $heapUsage.used NON-HEAP STORAGE: 
          \tNon-heap memory committed = $nonHeapUsage.committed 
          \tNon-heap memory init = $nonHeapUsage.init 
          \tNon-heap memory max = $nonHeapUsage.max 
          \tNon-heap memory used = $nonHeapUsage.used 
       """
      
    println "GARBAGE COLLECTION:" 
    ManagementFactory.garbageCollectorMXBeans.each { gc ->
       println "\tname = $gc.name"
       println "\t\tcollection count = $gc.collectionCount"
       println "\t\tcollection time = $gc.collectionTime"
       String[] mpoolNames =   gc.memoryPoolNames
       
       mpoolNames.each { 
          mpoolName -> println "\t\tmpool name = $mpoolName"
       } 
    }
    
    执行代码时,输​​出将根据运行代码的系统而有所不同。下面给出了输出示例。
    
    OPERATING SYSTEM: 
       OS architecture = x86 
       OS name = Windows 7 
       OS version = 6.1 
       OS processors = 4
       
    RUNTIME: 
       Runtime name = 5144@Babuli-PC 
       Runtime spec name = Java Virtual Machine Specification 
       Runtime vendor = Oracle Corporation 
       Runtime spec version = 1.7 
       Runtime management spec version = 1.2
       
    MEMORY: 
       HEAP STORAGE: 
          Memory committed = 16252928 
          Memory init = 16777216 
          Memory max = 259522560 
          Memory used = 7355840
       
    NON-HEAP STORAGE: 
       Non-heap memory committed = 37715968 
       Non-heap memory init = 35815424 
       Non-heap memory max = 123731968 
       Non-heap memory used = 18532232 
       
    GARBAGE COLLECTION: 
       name = Copy 
       collection count = 15 
       collection time = 47 
       mpool name = Eden Space 
       mpool name = Survivor Space
          
       name = MarkSweepCompact 
          collection count = 0 
          collection time = 0 
          
          mpool name = Eden Space 
          mpool name = Survivor Space 
          mpool name = Tenured Gen 
          mpool name = Perm Gen 
          mpool name = Perm Gen [shared-ro] 
          mpool name = Perm Gen [shared-rw]
    
  • 监控 Tomcat

    为了监控 tomcat,在启动 tomcat 时应设置以下参数 -
    
    set JAVA_OPTS = -Dcom.sun.management.jmxremote 
    Dcom.sun.management.jmxremote.port = 9004\
     
    -Dcom.sun.management.jmxremote.authenticate=false 
    Dcom.sun.management.jmxremote.ssl = false
    
    以下代码使用 JMX 来发现正在运行的 Tomcat 中可用的 MBean,确定哪些是 Web 模块并提取每个 Web 模块的处理时间。
    
    import groovy.swing.SwingBuilder
      
    import javax.management.ObjectName 
    import javax.management.remote.JMXConnectorFactory as JmxFactory 
    import javax.management.remote.JMXServiceURL as JmxUrl 
    import javax.swing.WindowConstants as WC 
     
    import org.jfree.chart.ChartFactory 
    import org.jfree.data.category.DefaultCategoryDataset as Dataset 
    import org.jfree.chart.plot.PlotOrientation as Orientation 
     
    def serverUrl = 'service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi' 
    def server = JmxFactory.connect(new JmxUrl(serverUrl)).MBeanServerConnection 
    def serverInfo = new GroovyMBean(server, 'Catalina:type = Server').serverInfo 
    println "Connected to: $serverInfo" 
     
    def query = new ObjectName('Catalina:*') 
    String[] allNames = server.queryNames(query, null) 
    def modules = allNames.findAll { name -> 
       name.contains('j2eeType=WebModule') 
    }.collect{ new GroovyMBean(server, it) }
      
    println "Found ${modules.size()} web modules. Processing ..." 
    def dataset = new Dataset() 
     
    modules.each { m ->
       println m.name()
       dataset.addValue m.processingTime, 0, m.path 
    }