JMXを使ってZookeeper状態Java APIを監視します。


一、背景
前の記事はJavaが持参したJConsoneでzookeeper状態を取得します。主にいくつかの不便なところがあります。zkクラスタは普通3台か5台配置されます。複数のJConsolieウィンドウでの切り替えが面倒です。各zkサービスと履歴データの間では、直観的に比較することができません。通常はWEB管理ページを作ってクラスタの状態を展示し、アラームしきい値を設定してアラームを発生します。
二、JVMプラットフォームはMeansを提供する。
Java 5.0以上のバージョンでは、Javaアプリケーションと許可されたツール監視とJava仮想マシン(JVM)と仮想マシンがあるマシンオペレーティングシステムのセットがあります。このAPIのセットはjava.lang.managementです。これらのAPIによって、local端JVMを監視することができ、リモートJVMも監視することができる。
MXBenの例を静的工場法で取得し、動作中の仮想マシンのMXBenインターフェースにローカルからアクセスする。これらのBeanはManagement Factoryクラスで定義された静的方法から取得します。ManagementFactory.getOperatingSystemMXBean();のように、足りないのは現地のJVM状態だけです。リモートの仮想マシンデータを取得できませんでした。
  • Class LoadingMXBen Java仮想マシンのクラスローディングシステム
  • CopilationMXBen Java仮想マシンのコンパイルシステム
  • メモリMXBen Java仮想マシンのメモリシステム
  • RuntimeMXBen Java仮想マシンの実行時システム
  • Operating SystemMXBen Java仮想マシンがその上で動作するオペレーティングシステム
  • GarbageCollectoorMXBen Java仮想マシン中のゴミ回収器
  • メモリマネージャ
  • MemoryPoolMXBen Java仮想マシンのメモリプール
  • 三、Zookeeper提供されたMeans
    MXBenエージェントの例を構築し、所定のMBeanServeにプロキシを介して方法を呼び出します。JConsoneが監視できる項目は、APIを通じて全部入手できます。
    具体的なコードは以下の通りです。
    
    import java.io.IOException;
    import java.lang.management.ClassLoadingMXBean;
    import java.lang.management.CompilationMXBean;
    import java.lang.management.ManagementFactory;
    import java.lang.management.OperatingSystemMXBean;
    import java.lang.management.ThreadMXBean;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import javax.management.InstanceNotFoundException;
    import javax.management.IntrospectionException;
    import javax.management.JMX;
    import javax.management.MBeanServerConnection;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.ReflectionException;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    import org.apache.zookeeper.server.ConnectionMXBean;
    import org.apache.zookeeper.server.DataTreeMXBean;
    import org.apache.zookeeper.server.ZooKeeperServerMXBean;
    public class ZkJMXTest {
      static JMXConnector connector;
      /**
       * @param args
       * @throws IOException
       * @throws MalformedObjectNameException
       * @throws InstanceNotFoundException
       * @throws ReflectionException
       * @throws IntrospectionException
       */
      public static void main(String[] args) throws IOException, MalformedObjectNameException,
        InstanceNotFoundException, IntrospectionException, ReflectionException {
        OperatingSystemMXBean osbean = ManagementFactory.getOperatingSystemMXBean();
        System.out.println("    :" + osbean.getArch());//        
        System.out.println("     :" + osbean.getAvailableProcessors());///  
        System.out.println("  :" + osbean.getName());//  
        System.out.println(osbean.getVersion());//      
        ThreadMXBean threadBean=ManagementFactory.getThreadMXBean();
        System.out.println("    :" + threadBean.getThreadCount());//    
        ClassLoadingMXBean classLoadingMXBean = ManagementFactory.getClassLoadingMXBean();
        CompilationMXBean compilationMXBean = ManagementFactory.getCompilationMXBean();
        System.out.println("===========");
        //    MBeanServer      MXBean   
        MBeanServerConnection mbsc = createMBeanServer("192.168.1.100", "9991", "controlRole", "123456");
        //     
        ObjectName os = new ObjectName("java.lang:type=OperatingSystem");
        System.out.println("    :" + getAttribute(mbsc, os, "Arch"));//    
        System.out.println("     :" + getAttribute(mbsc, os, "AvailableProcessors"));//  
        System.out.println("     :" + getAttribute(mbsc, os, "TotalPhysicalMemorySize"));//     
        System.out.println("      :" + getAttribute(mbsc, os, "FreePhysicalMemorySize"));//      
        System.out.println("     :" + getAttribute(mbsc, os, "TotalSwapSpaceSize"));//     
        System.out.println("      :" + getAttribute(mbsc, os, "FreeSwapSpaceSize"));//      
        System.out.println("    :" + getAttribute(mbsc, os, "Name")+ getAttribute(mbsc, os, "Version"));//    
        System.out.println("       :" + getAttribute(mbsc, os, "CommittedVirtualMemorySize"));//       
        System.out.println("  cpu   :" + getAttribute(mbsc, os, "SystemCpuLoad"));//  cpu   
        System.out.println("  cpu   :" + getAttribute(mbsc, os, "ProcessCpuLoad"));//  cpu   
        System.out.println("============");//
        //   
        ObjectName Threading = new ObjectName("java.lang:type=Threading");
        System.out.println("    :" + getAttribute(mbsc, Threading, "ThreadCount"));//     
        System.out.println("      :" + getAttribute(mbsc, Threading, "DaemonThreadCount"));//       
        System.out.println("  :" + getAttribute(mbsc, Threading, "PeakThreadCount"));//   
        System.out.println("       :" + getAttribute(mbsc, Threading, "TotalStartedThreadCount"));//        
        ThreadMXBean threadBean2 = ManagementFactory.newPlatformMXBeanProxy
            (mbsc, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);
        System.out.println("    :" + threadBean2.getThreadCount());//     
        ThreadMXBean threadBean3 = ManagementFactory.getThreadMXBean();
        System.out.println("      :" + threadBean3.getThreadCount());//       
        System.out.println("============");//
        ObjectName Compilation = new ObjectName("java.lang:type=Compilation");
        System.out.println("        :" + getAttribute(mbsc, Compilation, "TotalCompilationTime"));//         
        System.out.println("============");//
        ObjectName ClassLoading = new ObjectName("java.lang:type=ClassLoading");
        System.out.println("      :" + getAttribute(mbsc, ClassLoading, "TotalLoadedClassCount"));//       
        System.out.println("      :" + getAttribute(mbsc, ClassLoading, "LoadedClassCount"));//       
        System.out.println("      :" + getAttribute(mbsc, ClassLoading, "UnloadedClassCount"));//       
        System.out.println("==========================================================");//
        // http://zookeeper.apache.org/doc/r3.4.6/zookeeperJMX.html
        // org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.1,name2=Follower
        ObjectName replica = new ObjectName("org.apache.ZooKeeperService:name0=ReplicatedServer_id1,name1=replica.1");
        System.out.println("replica.1    :" + getAttribute(mbsc, replica, "State"));//     
        mbsc = createMBeanServer("192.168.1.100", "9992", "controlRole", "123456");
        System.out.println("==============     ===========");
        ObjectName dataTreePattern = new ObjectName("org.apache.ZooKeeperService:name0=ReplicatedServer_id?,name1=replica.?,name2=*,name3=InMemoryDataTree");
        Set<ObjectName> dataTreeSets = mbsc.queryNames(dataTreePattern, null);
        Iterator<ObjectName> dataTreeIterator = dataTreeSets.iterator();
        //     
        while (dataTreeIterator.hasNext()) {
          ObjectName dataTreeObjectName = dataTreeIterator.next();
          DataTreeMXBean dataTree = JMX.newMBeanProxy(mbsc, dataTreeObjectName, DataTreeMXBean.class);
          System.out.println("    :" + dataTree.getNodeCount());//     
          System.out.println("Watch  :" + dataTree.getWatchCount());// Watch  
          System.out.println("      :" + dataTree.countEphemerals());// Watch  
          System.out.println("        :" + dataTree.approximateDataSize());//             
          Map<String, String> dataTreeMap = dataTreeObjectName.getKeyPropertyList();
          String replicaId = dataTreeMap.get("name1").replace("replica.", "");
          String role = dataTreeMap.get("name2");// Follower,Leader,Observer,Standalone
          String canonicalName = dataTreeObjectName.getCanonicalName();
          int roleEndIndex = canonicalName.indexOf(",name3");
          ObjectName roleObjectName = new ObjectName(canonicalName.substring(0, roleEndIndex));
          System.out.println("==============zk    ===========");
          ZooKeeperServerMXBean ZooKeeperServer = JMX.newMBeanProxy(mbsc, roleObjectName, ZooKeeperServerMXBean.class);
          System.out.println(role + "  IP   :" + ZooKeeperServer.getClientPort());// IP   
          System.out.println(role + "       :" + ZooKeeperServer.getNumAliveConnections());//    
          System.out.println(role + "       :" + ZooKeeperServer.getOutstandingRequests());//        
          System.out.println(role + "     :" + ZooKeeperServer.getPacketsReceived());//     
          System.out.println(role + "     :" + ZooKeeperServer.getPacketsSent());//     
          System.out.println(role + "     (  ):" + ZooKeeperServer.getAvgRequestLatency());
          System.out.println(role + "     (  ):" + ZooKeeperServer.getMaxRequestLatency());
          System.out.println(role + "      IP        :" + ZooKeeperServer.getMaxClientCnxnsPerHost());
          System.out.println(role + "   Session  (  ):" + ZooKeeperServer.getMaxSessionTimeout());
          System.out.println(role + "     (  ):" + ZooKeeperServer.getTickTime());
          System.out.println(role + "   :" + ZooKeeperServer.getVersion());//   
          //       
    //      ZooKeeperServer.resetLatency(); //  min/avg/max latency statistics
    //      ZooKeeperServer.resetMaxLatency(); //        
    //      ZooKeeperServer.resetStatistics(); //           
          System.out.println("==============          ===========");
          ObjectName connectionPattern = new ObjectName("org.apache.ZooKeeperService:name0=ReplicatedServer_id?,name1=replica.?,name2=*,name3=Connections,*");
          Set<ObjectName> connectionSets = mbsc.queryNames(connectionPattern, null);
          List<ObjectName> connectionList = new ArrayList<ObjectName>(connectionSets.size());
          connectionList.addAll(connectionSets);
          Collections.sort(connectionList);
          for (ObjectName connectionON : connectionList) {
            System.out.println("=========================");
            ConnectionMXBean connectionBean = JMX.newMBeanProxy(mbsc, connectionON, ConnectionMXBean.class);
            System.out.println(" IP+Port:" + connectionBean.getSourceIP());//
            System.out.println(" SessionId:" + connectionBean.getSessionId());//
            System.out.println(" PacketsReceived:" + connectionBean.getPacketsReceived());//     
            System.out.println(" PacketsSent:" + connectionBean.getPacketsSent());//     
            System.out.println(" MinLatency:" + connectionBean.getMinLatency());//
            System.out.println(" AvgLatency:" + connectionBean.getAvgLatency());//
            System.out.println(" MaxLatency:" + connectionBean.getMaxLatency());//
            System.out.println(" StartedTime:" + connectionBean.getStartedTime());//
            System.out.println(" EphemeralNodes:" + connectionBean.getEphemeralNodes().length);//
            System.out.println(" EphemeralNodes:" + Arrays.asList(connectionBean.getEphemeralNodes()));//
            System.out.println(" OutstandingRequests:" + connectionBean.getOutstandingRequests());//
            //connectionBean.resetCounters();
            //connectionBean.terminateConnection();
            //connectionBean.terminateSession();
          }
        }
        // close connection
        if (connector != null) {
          connector.close();
        }
      }
      /**
       *     
       * @param ip
       * @param jmxport
       * @return
       */
      public static MBeanServerConnection createMBeanServer(String ip,
          String jmxport, String userName, String password) {
        try {
          String jmxURL = "service:jmx:rmi:///jndi/rmi://" + ip + ":"
              + jmxport + "/jmxrmi";
          // jmxurl
          JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
          Map<String, String[]> map = new HashMap<String, String[]>();
          String[] credentials = new String[] { userName, password };
          map.put("jmx.remote.credentials", credentials);
          connector = JMXConnectorFactory.connect(serviceURL, map);
          MBeanServerConnection mbsc = connector.getMBeanServerConnection();
          return mbsc;
        } catch (IOException ioe) {
          ioe.printStackTrace();
          System.err.println(ip + ":" + jmxport + "       ");
        }
        return null;
      }
      /**
       *   MBeanServer      [objName] MBean [objAttr]   
       * <p>
       *     : return MBeanServer.getAttribute(ObjectName name, String attribute)
       * @param mbeanServer
       *      - MBeanServer  
       * @param objName
       *      - MBean    
       * @param objAttr
       *      - MBean      
       * @return    
       */
      private static String getAttribute(MBeanServerConnection mbeanServer,
          ObjectName objName, String objAttr) {
        if (mbeanServer == null || objName == null || objAttr == null)
          throw new IllegalArgumentException();
        try {
          return String.valueOf(mbeanServer.getAttribute(objName, objAttr));
        } catch (Exception e) {
          return null;
        }
      }
    }
    締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。