i3geek.com
闫庚哲的个人博客

利用manager-status监控Tomcat应用的java实现

最近在做web应用的监控管理,研究了下tomcat的检测方式,发现除了可以自写外,可以利用其自身带的监控管理子系统,进行高效的采集应用的实时数据。manager应用是tomcat提供的很方便的管理工具,可以通过其监控jvm虚拟机的状态,应用的状态等。其优点是配置简单,代码成熟工作量小,支持不同的版本,但是确定就是灵活性较差。(除了该办法,还可以使用JMX接口开发监控程序,但是需要全部重写代码,开发成本较高)

1、配置管理用户和权限

打开%Tomcat_Home%/conf/目录下的tomcat-user.xml文件,添加用户,并赋予manager权限。

Tomcat 5.x或6.x中<user username="admin" password="tomcat" roles="manager"/>

Tomcat 7.x中<user username="admin" password="tomcat" roles="manager-status"/>

配置好账户后,重启Tomcat,利用设置的用户和密码登陆http://localhost:8080/manager/status?XML=true

就可以查看到tomcat的相关信息了,以及应用的状态

 

其中相关名词解释:

Status-JVM :
Free memory 剩余内存
Total memory 总内存
Max memory 最大内存

Status-HTTP :
Max threads 最大线程数
Current thread count 当前线程数
Current thread busy 当前繁忙线程数
Max processing time 最大处理时间
ms Processing time 最短处理时间
Request count 请求书
Error count 错误数
Bytes received 接收字节
Bytes sent 发送字节

2、java的实现

通常下,浏览器中直接访问http://localhost:8080/manager/status?XML=true就可以查看XML信息了,只是会发现在第一次登陆时候 需要输入用户名和密码。因此我们在用java做登陆时候,需要携带用户名和密码,如:`http://admin:tomcat@localhost:8080/manager/status?XML=true`,但是访问时,仍然会返回401错误,意思是没有通过认证,用户密码不正确。其实在这里,密码是需要进行加密的,我们通过下面的代码进行实现:

	public static String getHtmlContext(String tempurl, String username, String password) throws IOException {
       URL url = null;
       BufferedReader breader = null;
       InputStream is = null;
       StringBuffer resultBuffer = new StringBuffer();
       try {
           url = new URL(tempurl);
           String userPassword = username + ":" + password;
           String encoding = new sun.misc.BASE64Encoder().encode (userPassword.getBytes());//在classpath中添加rt.jar包,在%java_home%/jre/lib/rt.jar

           HttpURLConnection conn = (HttpURLConnection) url.openConnection();
           conn.setRequestProperty("Authorization", "Basic " + encoding);
           is = conn.getInputStream();
           breader = new BufferedReader(new InputStreamReader(is));
           String line = "";
           while ((line = breader.readLine()) != null) {
               resultBuffer.append(line);
           }
       } catch (MalformedURLException e) {
           e.printStackTrace();
       } finally {
           if(breader != null)
               breader.close();
           if(is != null)
               is.close();
       }
       return resultBuffer.toString();
       
       }

获得到的xml:

	<?xml version="1.0" encoding="utf-8"?>
	<?xml-stylesheet type="text/xsl" href="xform.xsl" ?>
	<status>
    	<jvm>
        	<memory free="10966568" total="16318464" max="259522560" />
    	</jvm>
    	<connector name="http-8080">
        	<threadInfo maxThreads="200" currentThreadCount="4" currentThreadsBusy="1" />
        	<requestInfo maxTime="506" processingTime="1064" requestCount="51" errorCount="3" bytesReceived="0" bytesSent="324259" />
        	<workers>
            	<worker stage="S" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="192.168.191.5" virtualHost="192.168.191.1" method="GET" currentUri="/manager/status" currentQueryString="XML=true" protocol="HTTP/1.1" />
            	<worker stage="R" requestProcessingTime="0" requestBytesSent="0" requestBytesRecieved="0" remoteAddr="?" virtualHost="?" method="?" currentUri="?" currentQueryString="?" protocol="?" />
            	<worker stage="R" requestProcessingTime="0" requestBytesSent="0" requestBytesRecieved="0" remoteAddr="?" virtualHost="?" method="?" currentUri="?" currentQueryString="?" protocol="?" />
        	</workers>
    	</connector>
    	<connector name="ajp-8009">
        	<threadInfo maxThreads="200" currentThreadCount="0" currentThreadsBusy="0" />
        	<requestInfo maxTime="0" processingTime="0" requestCount="0" errorCount="0" bytesReceived="0" bytesSent="0" />
        	<workers />
    	</connector>
	</status>

3、xml的解析

读取后的是xml文档,还需要对xml进行解析,解析的方法有很多。这里用dom4j为大家进行展示

    public void test(){
        String result = "";
        Document document = null;//引入org.dom4j包
        try {
            result = status.getHtmlContext("http://192.168.191.1:8080/manager/status?XML=true", "admin", "123456");
            document = DocumentHelper.parseText(result);//将字符串转化为XML的Document
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        //对xml结点的操作
        Element rootElement = document.getRootElement();
        Element element=rootElement.element("jvm");
        element=element.element("memory");
        //对属性的操作
        Attribute attribute=element.attribute("max");
        String text=attribute.getText();  

        System.out.println(text);
    }
赞(1)
未经允许不得转载:爱上极客 » 利用manager-status监控Tomcat应用的java实现
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址