運用JMX監控Tomcat

jopen 10年前發布 | 24K 次閱讀 JMX Tomcat 應用服務器

1、先配Tomcat的啟動語句,window下tomcat的bin/catalina.bat(linux為catalina.sh),在頭上注釋部分(.bat為rem、.sh為#)后面加上set JAVA_OPTS=-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true

(linux為JAVA_OPTS=-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true)
2、修改jmx遠程訪問授權。默認為JAVA_HOME/jre/lib/management下jmxremote.access、jmxremote.password(缺省系統提供了個模版jmxremote.password.template改下名就成)

注意:linux下需要該權限,chmod 600 jmxremote.access, chmod 600 jmxremote.password

window下特麻煩,現需要jdk裝在NTFS文件系統下,選中文件,點右鍵“屬性”-〉安全,點“高級”,去掉“從父項繼承....”,彈出窗口中選“刪除”,這樣刪除了所有訪問權限。再選“添加”-〉高級,“立即查找”,選中你的用戶,例administrator,點“確定",“確定"。來到權限窗口,勾選"完全控制",點"確定",OK了。

 

3、用jconsole連接遠程linux服務時, IP地址和port都輸入正確的情況下,仍然是連接失敗 
vi /etc/hosts,將hostname對應的IP改為真實IP

 

4、測試JMX。啟動tomcat,在window“命令行窗口”中輸入netstat -an看下8999端口打開沒有。若沒有,則前面沒配對。若已打開,則可在另一臺機器的“命令行窗口”中輸入jconsole,打開jdk自帶的jmx客戶端。選遠程連接,錄入tomcat所在機器的IP,端口例192.168.10.10:8999,帳號、密碼在jmxremote.password中,如帳號controlRole,密碼R&D(缺省monitorRole只能讀,controlRole能讀寫,jmxremote.access中可配置)。點“連接”。看到圖就行了。

5、關于數據。Mbean屬性頁中給出了相應的數據,Catalina中是tomcat的,java.lang是jvm的。對于加粗的黑體屬性值,需雙擊一下才可看內容

5、關于編程。

public class JMXTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {

           String jmxURL = "service:jmx:rmi:///jndi/rmi://192.168.10.93:8999/jmxrmi";//tomcat jmx url
           JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
           
           Map map = new HashMap();
           String[] credentials = new String[] { "monitorRole" , "QED" };
           map.put("jmx.remote.credentials", credentials);
           JMXConnector connector = JMXConnectorFactory.connect(serviceURL, map);
           MBeanServerConnection  mbsc = connector.getMBeanServerConnection();
           
           //端口最好是動態取得
           ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=http-8080");
           MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName);
           
           String attrName = "currentThreadCount";//tomcat的線程數對應的屬性值
           MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
           System.out.println("currentThreadCount:"+mbsc.getAttribute(threadObjName, attrName));
           
           //heap
           for(int j=0;j <mbsc.getDomains().length;j++){ 
               System.out.println("###########"+mbsc.getDomains()[j]); 
           } 
           Set MBeanset = mbsc.queryMBeans(null, null);
           System.out.println("MBeanset.size() : " + MBeanset.size());
           Iterator MBeansetIterator = MBeanset.iterator();
           while (MBeansetIterator.hasNext()) { 
               ObjectInstance objectInstance = (ObjectInstance)MBeansetIterator.next();
               ObjectName objectName = objectInstance.getObjectName();
               String canonicalName = objectName.getCanonicalName();
               System.out.println("canonicalName : " + canonicalName); 
               if (canonicalName.equals("Catalina:host=localhost,type=Cluster"))      {  
                   // Get details of cluster MBeans
                   System.out.println("Cluster MBeans Details:");
                   System.out.println("========================================="); 
                   //getMBeansDetails(canonicalName);
                   String canonicalKeyPropList = objectName.getCanonicalKeyPropertyListString();
              }
           }
           //------------------------- system ----------------------
           ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
           System.out.println("廠商:"+ (String)mbsc.getAttribute(runtimeObjName, "VmVendor"));
           System.out.println("程序:"+ (String)mbsc.getAttribute(runtimeObjName, "VmName"));
           System.out.println("版本:"+ (String)mbsc.getAttribute(runtimeObjName, "VmVersion"));
           Date starttime=new Date((Long)mbsc.getAttribute(runtimeObjName, "StartTime"));
           SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
           System.out.println("啟動時間:"+df.format(starttime));
           
           Long timespan=(Long)mbsc.getAttribute(runtimeObjName, "Uptime");
           System.out.println("連續工作時間:"+JMXTest.formatTimeSpan(timespan));
           //------------------------ JVM -------------------------
           //堆使用率
           ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
           MemoryUsage heapMemoryUsage =  MemoryUsage.from((CompositeDataSupport)mbsc.getAttribute(heapObjName, "HeapMemoryUsage"));
           long maxMemory = heapMemoryUsage.getMax();//堆最大
           long commitMemory = heapMemoryUsage.getCommitted();//堆當前分配
           long usedMemory = heapMemoryUsage.getUsed();
           System.out.println("heap:"+(double)usedMemory*100/commitMemory+"%");//堆使用率
           
           MemoryUsage nonheapMemoryUsage =  MemoryUsage.from((CompositeDataSupport)mbsc.getAttribute(heapObjName, "NonHeapMemoryUsage"));           
           long noncommitMemory = nonheapMemoryUsage.getCommitted();
           long nonusedMemory = heapMemoryUsage.getUsed();
           System.out.println("nonheap:"+(double)nonusedMemory*100/noncommitMemory+"%");
           
           ObjectName permObjName = new ObjectName("java.lang:type=MemoryPool,name=Perm Gen");
           MemoryUsage permGenUsage =  MemoryUsage.from((CompositeDataSupport)mbsc.getAttribute(permObjName, "Usage"));           
           long committed = permGenUsage.getCommitted();//持久堆大小
           long used = heapMemoryUsage.getUsed();//
           System.out.println("perm gen:"+(double)used*100/committed+"%");//持久堆使用率
           
           //-------------------- Session --------------- 
           ObjectName managerObjName = new ObjectName("Catalina:type=Manager,*");
           Set<ObjectName> s=mbsc.queryNames(managerObjName, null);
           for (ObjectName obj:s){
               System.out.println("應用名:"+obj.getKeyProperty("path"));
               ObjectName objname=new ObjectName(obj.getCanonicalName());
               System.out.println("最大會話數:"+ mbsc.getAttribute( objname, "maxActiveSessions"));
               System.out.println("會話數:"+ mbsc.getAttribute( objname, "activeSessions"));
               System.out.println("活動會話數:"+ mbsc.getAttribute( objname, "sessionCounter"));
           }
           
           //----------------- Thread Pool ----------------
           ObjectName threadpoolObjName = new ObjectName("Catalina:type=ThreadPool,*");
           Set<ObjectName> s2=mbsc.queryNames(threadpoolObjName, null);
           for (ObjectName obj:s2){
               System.out.println("端口名:"+obj.getKeyProperty("name"));
               ObjectName objname=new ObjectName(obj.getCanonicalName());
               System.out.println("最大線程數:"+ mbsc.getAttribute( objname, "maxThreads"));
               System.out.println("當前線程數:"+ mbsc.getAttribute( objname, "currentThreadCount"));
               System.out.println("繁忙線程數:"+ mbsc.getAttribute( objname, "currentThreadsBusy"));
           }
               
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String formatTimeSpan(long span){
        long minseconds = span % 1000;

        span = span /1000;
        long seconds = span % 60;

        span = span / 60;
        long mins = span % 60;

        span = span / 60;
        long hours = span % 24;

        span = span / 24;
        long days = span;
        return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d", days,hours,mins,seconds,minseconds).toString();
    }
}

 

另外實例:

public ConcurrentHashMap<String, Object> parseJMS(String tempid, ConcurrentHashMap<String, Object> paraMap) {
        MBeanServerConnection mbsc = null;
        try {
            mbsc = connector.getMBeanServerConnection();
            // ------------------------- system ----------------------
            ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
            TabularDataSupport system = (TabularDataSupport) mbsc.getAttribute(runtimeObjName, "SystemProperties");
            //JVM版本
            paraMap.put(tempid + "_JVMVERSION", mbsc.getAttribute(runtimeObjName, "VmVersion"));
            //JVM廠商
            paraMap.put(tempid + "_JVMMANUFACTURER", mbsc.getAttribute(runtimeObjName, "VmVendor"));
            //系統結構
            paraMap.put(tempid + "_SYSTEMSTRUCTURE", system.get(new Object[] {"os.arch"}).get("value"));
            //操作系統
            paraMap.put(tempid + "_OPERATIONSYSTEM", system.get(new Object[] {"os.name"}).get("value"));
            //操作系統版本
            paraMap.put(tempid + "_OPERATIONSYSTEMVERSION", system.get(new Object[] {"os.version"}).get("value"));
            //Tomcat版本
            String t_version = (String) system.get(new Object[] {"org.apache.catalina.startup.TldConfig.jarsToSkip"}).get("value");
            paraMap.put(tempid + "_TOMCATVERSION", t_version == null ? "" : t_version.substring(0, t_version.indexOf("-")));
            //鏈接Tomcat服務器的響應時間 -------------


            ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
            MemoryUsage heapMemoryUsage =  MemoryUsage.from((CompositeDataSupport)mbsc.getAttribute(heapObjName, "HeapMemoryUsage"));
            //JVM已用內存
            paraMap.put(tempid + "_JVMUSERDMEMORY", heapMemoryUsage.getUsed());
            //JVM可用內存
            paraMap.put(tempid + "_JVMAVAILABLEMEMORY", heapMemoryUsage.getCommitted() - heapMemoryUsage.getUsed());
            //JVM內存總數
            paraMap.put(tempid + "_JVMTOTALMEMORY", heapMemoryUsage.getCommitted());
             
          //----------------- GlobalRequestProcessor ----------------
           ObjectName requestProcessor = new ObjectName("Catalina:type=GlobalRequestProcessor,*");
           Set<ObjectName> s2 = mbsc.queryNames(requestProcessor, null);
           long bytesSents = 0;
           long bytesReceiveds = 0;
           Integer errorCounts = 0;
           Integer requestCounts = 0;
           long processingTimes = 0;
           long maxTimes = 0;
           for (ObjectName obj : s2) {
               ObjectName objname = new ObjectName(obj.getCanonicalName());
               long bytesSent = (long) mbsc.getAttribute( objname, "bytesSent");
               long bytesReceived = (long) mbsc.getAttribute( objname, "bytesReceived");
               Integer errorCount = (Integer) mbsc.getAttribute( objname, "errorCount");
               Integer requestCount = (Integer) mbsc.getAttribute( objname, "requestCount");
               long processingTime = (long) mbsc.getAttribute( objname, "processingTime");
               long maxTime = (long) mbsc.getAttribute( objname, "maxTime");
               bytesSents += bytesSent;
               bytesReceiveds += bytesReceived;
               errorCounts += errorCount;
               requestCounts += requestCount;
               processingTimes += processingTime;
               maxTimes += maxTime;
           }
           //發送字節
           paraMap.put(tempid + "_SENDBYTE", bytesSents);
           //接收字節
           paraMap.put(tempid + "_RECIEVEDBYTE", bytesReceiveds);
           //錯誤個數
           paraMap.put(tempid + "_ERRORNUMBER", errorCounts);
           //請求個數
           paraMap.put(tempid + "_REQUESTNUMBER", requestCounts);
           //處理時間
           paraMap.put(tempid + "_TREATMENTTIME", processingTimes);
           //最大處理時間
           paraMap.put(tempid + "_MAXTREATMENTTIME", maxTimes);
          
           //----------------- Thread Pool ----------------
           ObjectName threadpoolObjName = new ObjectName("Catalina:type=ThreadPool,*");
           Set<ObjectName> tp = mbsc.queryNames(threadpoolObjName, null);
           int currentThreadsBusys = 0;
           int maxThreadss = 0;
           for (ObjectName obj : tp) {
               ObjectName objname = new ObjectName(obj.getCanonicalName());
               int currentThreadsBusy = (int) mbsc.getAttribute( objname, "currentThreadsBusy");
               int maxThreads = (int) mbsc.getAttribute( objname, "maxThreads");
               currentThreadsBusys += currentThreadsBusy;
               maxThreadss += maxThreads;
           }
           //當前忙碌線程數
           paraMap.put(tempid + "_CURRENTBUSYTHREADSNUMBER", currentThreadsBusys);
           //最大線程數
           paraMap.put(tempid + "_MAXTHREADSNUMBER", maxThreadss);
           
           //----------------- RequestProcessor ----------------
           ObjectName requestProcessor1 = new ObjectName("Catalina:type=RequestProcessor,*");
           Set<ObjectName> rp = mbsc.queryNames(requestProcessor1, null);
           long requestProcessingTimes = 0;
           int portCount = 0;
           for (ObjectName obj : rp) {
               portCount++;
               ObjectName objname = new ObjectName(obj.getCanonicalName());
               long requestProcessingTime = (long) mbsc.getAttribute(objname, "requestProcessingTime");
               requestProcessingTimes += requestProcessingTime;
           }
           //端口平均響應時間
           paraMap.put(tempid + "_AVERAGERESPONSETIME", portCount == 0 ? requestProcessingTimes : Math.round(requestProcessingTimes/portCount));
           
           
           
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MalformedObjectNameException e) {
            e.printStackTrace();
        } catch (AttributeNotFoundException e) {
            e.printStackTrace();
        } catch (InstanceNotFoundException e) {
            e.printStackTrace();
        } catch (MBeanException e) {
            e.printStackTrace();
        } catch (ReflectionException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } 
        return paraMap;
    }
 
    public static void main(String[] args) {
        DoJob job = new DoJob();
        String tempid = "MW_WS_TOMCAT_AGENT";
        job.connector = TomcatUtil.getJMXOfTomcat("service:jmx:rmi:///jndi/rmi://191.168.2.31:8999/jmxrmi", "", "");
        ConcurrentHashMap<String, Object> paraMap = new ConcurrentHashMap<String, Object>();
        paraMap = job.parseJMS(tempid, paraMap);
        Iterator<String> it = paraMap.keySet().iterator();
        while(it.hasNext()) {
            String key = it.next();
            System.out.println(key + " : " + paraMap.get(key));
        }
    }

 來自;:http://my.oschina.net/xuqiang/blog/294613

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!