亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

使用JMX監控Zookeeper狀態Java API

2024-07-14 08:43:32
字體:
來源:轉載
供稿:網友

一、背景

上一篇通過Java自帶的JConsole來獲取zookeeper狀態。主要有幾個不方便的地方,zk集群一般會部署3或者5臺,在多個JConsole窗口中切換比較麻煩,各個zk服務及歷史數據之間,不能直觀比較。一般會做一個WEB管理頁面來展示集群狀態,設置報警閥值來做報警。

二、JVM平臺提供Mbeans

在Java5.0以上版本,有一組API可以讓Java應用程序和允許的工具監視和管理Java虛擬機(JVM)和虛擬機所在的本機操作系統。該組API在 java.lang.management包。可以通過這些API可以監控local端JVM,同時也可以監控遠端JVM。

通過靜態工廠方法獲取MXBean實例,從本地訪問正在運行的虛擬機的MXBean接口。這些Bean我們從ManagementFactory類中定義的靜態方法獲?。蝗?code style="margin: 3px auto 0px; padding: 2px 4px; outline: none; font-style: inherit; font-weight: inherit; background: rgb(249, 242, 244); width: 640px; line-height: 1.5; clear: both; font-size: 12px; border: 1px solid rgb(204, 204, 204); color: rgb(199, 37, 78); border-radius: 0px; font-family: Menlo, Monaco, Consolas, "Courier New", monospace;">ManagementFactory.getOperatingSystemMXBean();其中不足就是只能獲取本地的JVM狀態。無法獲取遠程的虛擬機數據。

  • ClassLoadingMXBean Java虛擬機的類加載系統
  • CompilationMXBean Java虛擬機的編譯系統
  • MemoryMXBean Java虛擬機的內存系統
  • RuntimeMXBean Java虛擬機的運行時系統
  • OperatingSystemMXBean Java虛擬機在其上運行的操作系統
  • GarbageCollectorMXBean Java虛擬機中的垃圾回收器
  • MemoryManagerMXBean Java虛擬機中的內存管理器
  • MemoryPoolMXBean Java虛擬機中的內存池

三、Zookeeper提供出來的Mbeans

構造MXBean代理實例,通過代理將方法調用轉發到給定的MBeanServe。JConsole能夠監控的項目,通過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;    }  }}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲摸下面视频| 91精品国产高清自在线看超| 亚洲精品一区二三区不卡| 久久久久久久久久av| 亚洲精品视频免费| 日韩免费在线视频| 国产欧美va欧美va香蕉在线| 日韩视频免费在线| 亚洲色图校园春色| 欧美激情精品久久久久久蜜臀| 日韩国产精品一区| 国产成人精品久久二区二区91| 亚洲天堂av在线免费| 欧美国产视频日韩| 国产精品视频自在线| 18性欧美xxxⅹ性满足| 国产午夜精品久久久| 亚洲一区二区自拍| 51精品在线观看| 高清日韩电视剧大全免费播放在线观看| 久久精品久久久久久国产 免费| 中文字幕日韩电影| 久久精品亚洲94久久精品| 久久久午夜视频| 久久久久国产精品免费| 久久综合久久美利坚合众国| 亚洲精品免费在线视频| 国产精品成人观看视频国产奇米| 91在线视频九色| 国产亚洲精品久久久久久| 国产成人精品一区二区| 欧美日韩在线视频一区二区| 亚洲视频在线观看免费| 日本国产欧美一区二区三区| 5278欧美一区二区三区| 亚洲欧美成人一区二区在线电影| 国产精品免费一区| 91探花福利精品国产自产在线| 91极品视频在线| 97久久精品人人澡人人爽缅北| 成人精品一区二区三区| 97色在线观看| 成人免费网站在线| 狠狠色狠狠色综合日日五| 国产香蕉97碰碰久久人人| 亚洲欧美日韩另类| 欧美一区二粉嫩精品国产一线天| 亚洲综合精品一区二区| 在线播放国产一区中文字幕剧情欧美| 欧美第一黄色网| 日韩中文字幕精品视频| 狠狠色狠狠色综合日日小说| 热久久美女精品天天吊色| 91久久精品久久国产性色也91| 伊人青青综合网站| 欧美精品videosex极品1| 欧美大胆在线视频| 久久久91精品| 日韩精品极品视频免费观看| 成人av资源在线播放| 亚洲已满18点击进入在线看片| 亚洲精品久久久久久久久| 国产剧情日韩欧美| 日本成人免费在线| 97超视频免费观看| 96pao国产成视频永久免费| 欧美日韩性视频| 国产精品男人爽免费视频1| 91欧美精品成人综合在线观看| 中文字幕日韩精品在线| 中文字幕av一区二区三区谷原希美| 国产剧情日韩欧美| 91成人国产在线观看| 国产在线精品成人一区二区三区| 成人网在线免费观看| 国产亚洲精品久久久久久| 亚洲欧洲国产精品| 中文字幕日韩精品有码视频| 2019中文字幕在线| 欧美视频中文在线看| 亚洲欧美制服丝袜| 亚洲精品国产精品久久清纯直播| 日本精品免费观看| 欧美丰满少妇xxxxx| 成人高清视频观看www| 欧美福利视频在线观看| 日本国产精品视频| 中文字幕av一区中文字幕天堂| 国产九九精品视频| 91精品91久久久久久| 日韩在线欧美在线| 国产精品久久久久久久天堂| 色爱av美腿丝袜综合粉嫩av| 欧美日韩国产在线看| 日韩在线一区二区三区免费视频| 国产精品精品久久久久久| 国产精品视频资源| 亚洲视频在线看| 久久久精品免费| 久久久综合免费视频| 日韩有码在线电影| 久久视频精品在线| 国产欧美精品xxxx另类| 日韩hd视频在线观看| 欧美日韩亚洲精品一区二区三区| 亚洲欧美精品一区二区| 欧美日韩国产一区中文午夜| 国产精品免费电影| 国产伦精品免费视频| 久久成人精品电影| 亚洲性69xxxbbb| 亚洲性日韩精品一区二区| 国产午夜精品理论片a级探花| 伊人久久综合97精品| 中文字幕av一区二区| www国产亚洲精品久久网站| 欧美香蕉大胸在线视频观看| 国产精品第8页| 97视频在线观看免费高清完整版在线观看| 国产精品国语对白| 欧美午夜电影在线| 91亚洲一区精品| 国产精品视频99| 亚洲爱爱爱爱爱| 一区二区三区无码高清视频| 国产69精品久久久| 色爱av美腿丝袜综合粉嫩av| 亚洲一区二区三区四区视频| 国产日韩在线精品av| 久久青草精品视频免费观看| 亚洲自拍高清视频网站| 91视频8mav| 欧美人交a欧美精品| 国产美女精彩久久| 亚洲人精品午夜在线观看| 亚洲xxxxx| 亚洲欧美在线x视频| 日韩精品在线免费观看| 国产日韩在线免费| 亚洲成人在线网| 国产精品中文字幕在线观看| 黑人巨大精品欧美一区二区免费| 久久影院在线观看| 亚洲伊人久久综合| 国产精品精品久久久久久| 午夜精品久久久99热福利| 国产精品久久在线观看| 成人黄色片在线| 国产91色在线|| 正在播放国产一区| 久久av中文字幕| 26uuu国产精品视频| 国产激情综合五月久久| 日韩视频免费在线观看| 色多多国产成人永久免费网站| 久久视频这里只有精品| 91精品久久久久久久久久另类| 久久激情视频久久| 色婷婷久久av| 97在线视频免费观看| 久久香蕉国产线看观看av| 狠狠久久五月精品中文字幕| 久久久久久久久久久av| 91视频-88av|