CollTomcatWithJMX.java 10.8 KB
package com.sitech.ismp.coll.centercoll;


import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

import org.apache.log4j.Logger;

import com.sitech.ismp.coll.CollBase;
import com.sitech.ismp.coll.basic.TblATO_KPIDETAIL;

public class CollTomcatWithJMX extends CollBase {

	private final String PRE_UNITID = "10-12-13"; // Tomcat的标识
	private final String PRE_UNITID_PM = PRE_UNITID+"-11"; // 性能指标
	private final String PRE_UNITID_CM = PRE_UNITID+"-10"; // 配置指标
	private final String PRE_UNITID_FM = PRE_UNITID+"-12"; // 状态指标
	String hostName = "";
	MBeanServerConnection  mbsc = null;
	JMXConnector connector = null;
	public void init(HashMap params) {
		
		String collIp = (String) params.get("collIp");
		String jmxPort = (String) params.get("jmxPort");
		System.out.println("collIP="+collIp);
		System.out.println("jmxPort="+jmxPort);
		
        String jmxURL = "service:jmx:rmi:///jndi/rmi://"+collIp+":"+jmxPort+"/jmxrmi";//tomcat jmx url   
        try{
        	
    		//System.out.println("connect jmx sevice");
        	System.out.println("jmxURL="+jmxURL);
        	JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);   
	        Map map = new HashMap();   
	        String[] credentials = new String[] { "monitorRole" , "QED" };   
	        map.put("jmx.remote.credentials", credentials);   
	        connector = JMXConnectorFactory.connect(serviceURL, map);   
	        mbsc = connector.getMBeanServerConnection();
	        // 获取主机名称
	        ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");   
	        hostName = (String)mbsc.getAttribute(runtimeObjName, "Name");
	        int pos = hostName.indexOf("@", 0);
	        hostName = hostName.substring(pos+1, hostName.length());

        } catch (Exception e) {   
        	logger.error(e);  
        	e.printStackTrace();
        }  
	}
	/**
	 * 采集内存使用指标
	 * @param params
	 * @return
	 */
	
	public Vector getMemory(HashMap params) {
		logger.info("begin getMemory");
		// 保存采集结果,并返回值
		CollBase collResult = new CollBase();
		try {
//			init(params);
//			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(); //当前使用的
//			double heapUsage = (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();//   
//			double permUsage = (double)used*100/committed;//持久堆使用率   
//			
//
//			//当前内存堆使用比率
//			collResult.addKPI(this.PRE_UNITID_PM + ":" + hostName + "-memory",
//					"PM-00-04-003-01", String.valueOf(heapUsage));
//			//允许支配的内存堆
//			collResult.addKPI(this.PRE_UNITID_PM + ":" + hostName + "-memory",
//					"CM-00-04-003-02", String.valueOf(maxMemory));
//			
//
//			collResult.addKPI(this.PRE_UNITID_PM + ":" + hostName + "-memory",
//					"PM-00-04-004-01", String.valueOf(usedMemory));
//
//			collResult.addKPI(this.PRE_UNITID_PM + ":" + hostName + "-memory",
//					"PM-00-04-004-02", String.valueOf(committed));
//
//			collResult.addKPI(this.PRE_UNITID_PM + ":" + hostName + "-memory",
//					"PM-00-04-004-03", String.valueOf(used));
//
//			collResult.addKPI(this.PRE_UNITID_PM + ":" + hostName + "-memory",
//					"PM-00-04-004-04", String.valueOf(permUsage));

		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try{
				connector.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return collResult.getKPISet();
	}	
	/**
	 * 采集会话指标
	 * @param params
	 * @return
	 */
	public Vector getSession(HashMap params) {
		logger.info("begin getSession");
		// 保存采集结果,并返回值
		CollBase collResult = new CollBase();
		try {
			init(params);
			/*
			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"));   
			}   
			
			collResult.addKPI(memory_PRE_UNITID + ":" + hostName + "-session",
					"CM-00-01-001-22", "");
			*/

		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try{
				connector.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return collResult.getKPISet();
	}	
	/**
	 * 采集运行指标
	 * @param params
	 * @return
	 */
	public Vector getRuntime(HashMap params) {
		logger.info("begin getRuntime");
		// 保存采集结果,并返回值
		CollBase collResult = new CollBase();
		try {
			init(params);
			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 runTime= new Date(((Long)mbsc.getAttribute(runtimeObjName, "StartTime")).longValue());   
			SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   
			
			
			//启动时间
			String startTime = df.format(runTime);
			//连续工作时间
			Long timespan=(Long)mbsc.getAttribute(runtimeObjName, "Uptime");   
			String upTime =String.valueOf(timespan.longValue());  
			
			collResult.addKPI(this.PRE_UNITID_FM + ":" + hostName + "-runtime","FM-00-04-004-01", startTime);
			collResult.addKPI(this.PRE_UNITID_FM + ":" + hostName + "-runtime","FM-00-04-004-02", upTime);

		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try{
				connector.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return collResult.getKPISet();
	}	
	public Vector getThreadPool(HashMap params) {
		logger.info("begin getThreadPool");
		// 保存采集结果,并返回值
		CollBase collResult = new CollBase();
		String httPort = (String) params.get("httPort"); 
		try {
			init(params);
			ObjectName threadpoolObjName = new ObjectName("Catalina:type=ThreadPool,name=http-"+httPort); 
			//最大线程数
			String maxThreads = ((Integer)mbsc.getAttribute( threadpoolObjName, "maxThreads")).toString();  
			//当前线程数
			String currentThreadCount =((Integer)mbsc.getAttribute( threadpoolObjName, "currentThreadCount")).toString();   
			//繁忙线程数
			String currentThreadsBusy = ((Integer)mbsc.getAttribute( threadpoolObjName, "currentThreadsBusy")).toString();
			//最小空闲线程数
			String minSpareThreads = ((Integer)mbsc.getAttribute( threadpoolObjName, "minSpareThreads")).toString();
			//最大空闲线程数
			String maxSpareThreads = ((Integer)mbsc.getAttribute( threadpoolObjName, "maxSpareThreads")).toString();  
		 
			//
			collResult.addKPI(this.PRE_UNITID_PM + ":" + hostName + "-thread",
					"PM-00-04-004-05", maxThreads);
			collResult.addKPI(this.PRE_UNITID_PM + ":" + hostName + "-thread",
					"PM-00-04-004-06", currentThreadCount);
			collResult.addKPI(this.PRE_UNITID_PM + ":" + hostName + "-thread",
					"PM-00-04-004-07", currentThreadsBusy);
			collResult.addKPI(this.PRE_UNITID_PM + ":" + hostName + "-thread",
					"PM-00-04-004-08", minSpareThreads);
			collResult.addKPI(this.PRE_UNITID_PM + ":" + hostName + "-thread",
					"PM-00-04-004-09", maxSpareThreads);


		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try{
				connector.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return collResult.getKPISet();
	}	
    /*
	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();   
    } */	
    /**  
     * @param args  
     */  
    public static void main(String[] args) {   
        try {   
        	
    		HashMap params = new HashMap();
    		//params.put("collIp", "172.20.203.203");
    		//params.put("collIp", "192.168.6.250");
    		params.put("collIp", "192.168.111.10");
    		//params.put("collIp", "192.168.3.254");
    		String ss="local.domain";
    		
    		ss=ss.replaceAll("\\.", "_");
    		
    		params.put("jmxPort", "8999");
    		params.put("httPort", "8080");
    		System.out.println("begin................");
    		CollTomcatWithJMX coll = new CollTomcatWithJMX();
    		//Vector lst1 = coll.getMemory(params);
    		//Vector lst = coll.getThreadPool(params);
    		Vector lst = coll.getRuntime(params);
    		
    		System.out.println("lst.size() is " + lst.size());
    		for (int i = 0; i < lst.size(); i++) {
    			TblATO_KPIDETAIL kpidetail = (TblATO_KPIDETAIL) lst.get(i);
    			System.out.println(kpidetail.UNIT_ID + "|" + kpidetail.KPI_ID + "|"
    					+ kpidetail.CLL_TIME + "|" + kpidetail.KPI_VALUE);
    		}     
//    		for (int i = 0; i < lst1.size(); i++) {
//    			TblATO_KPIDETAIL kpidetail = (TblATO_KPIDETAIL) lst1.get(i);
//    			System.out.println(kpidetail.UNIT_ID + "|" + kpidetail.KPI_ID + "|"
//    					+ kpidetail.CLL_TIME + "|" + kpidetail.KPI_VALUE);
//    		}  
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
}