使用Filter统计Java(J2EE)的web程序http请求响应时间

作者:核桃博客|

本文网址:http://www.hetaoblog.com/j2ee-filter-performance-monitor-http-request

本博客所有文章全部原创,欢迎转载,

但必须以超链接形式标明文章原始出处和作者信息及版权声明

在网站性能的相关工作中,一个重要的方面是有一定的监控和日志统计,然后对这些数据进行分析,知道什么时候慢了,慢在哪里,然后才可以进行有针对性的性能优化工作;

这里,80/20准则是非常适用的,我所见过的大部分情况都是约80%页面都是没问题的,但是有约20%的页面的性能较差;

监控http请求的处理时间的方法有很多,这里介绍一种java(j2ee)的web程序中监控/统计http请求处理时间的简便方法:就是利用Filter来统计所有请求的处理时间;

Filter是j2ee的一种过滤器模式,可以在一个filterchain上挂很多个不同的filter,做各种的处理,比如安全、编码等;filter可以指定对应到哪些url,如果指定url-pattern为/*,那么就可以做对所有请求的统计

添加一个Filter名为PerfFilter,在web.xml添加如下代码

<filter>

<display-name>PerfFilter</display-name>

<filter-name>PerfFilter</filter-name>

<filter-class>PerfFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>PerfFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

然后在PerfFilter中有如下代码

publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{

HttpServletRequestreq=(HttpServletRequest)request;

longt1=System.currentTimeMillis();

chain.doFilter(request,response);

longt2=System.currentTimeMillis();

System.out.println(“***request(”+req.getRequestURI()+“)finishedwithtime(ms):”+(t2-t1));

}

这时候,所有的http请求,无论是servlet,jsp还是其他各种框架的实现,比如struts,springmvc,jsf等,都可以被这个Filter统计到,可以方便后续的日志分析工作[实际中通常将System.out换成相关的logger],找到较慢的请求,然后重点该进。

例如,本地访问servlet和jsp,就会在控制台看到如下输出;

***request(/webtest/TestServlet)finishedwithtime(ms):5000

***request(/webtest/jsp1.jsp)finishedwithtime(ms):3000

有必要的话,还可以将请求相关的参数打印出来,因为实际工作中,不少请求的响应时间是和参数密切相关的;

这种做法的好处是有一个单独、统一的性能日志,系统以后添加任何servlet/jsp或者切换框架,都不需要任何改动;

相关推荐