`
ahuaxuan
  • 浏览: 633537 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

优化程序之前,可用Jamon来监测你的Spring应用

阅读更多
/**
*作者:张荣华(ahuaxuan)
*2007-8-15
*转载请注明出处及作者
*/

前两天在看Spring内置的拦截器的时候,发现了一个之前没有注意的类:org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor,好奇心促使我上网查了一下这个jamon。大概看了一下之后发现这个玩意还真挺好用的而且挺重要的,而且现在国内对它的介绍也很少,所以写了一篇文章和大家分享。

一,Jamon简介:
Jamon的全名是:Java Application Monitor。它是一个小巧的,免费的,高性能的,线程安全的性能监测工具。它可以用来测定系统的性能瓶颈,也可以用来监视用户和应用程序之间的交互情况。 Jamon主要是用来检测jee的应用程序。它最新的版本是2.1,可以用在1.4以上的jdk上。

二,将jamon导入到你的应用程序中去
首先下载jamon的开发包,见我的附件,同时你也可以去Sourceforge上自己下载。Sourceforge的下载地址为http://jamonapi.sourceforge.net。解压之后可以得到一个jar包和一个war包。jar包是自己会用到的,而war包是一个例子(不要小看这个例子,待会也要把它导入到项目中)。把war包之间丢到服务器上,访问:localhost:8080/jamon就可以看到这个例子了,这个例子是一个简单的性能监控系统。

接着把例子中的所有的包都导入到项目中,并把war包中的jsp和images还有css都考到项目中,比如新建一个目录叫monitor(它和WEB-INF是同级目录)。

三,正确配置自己的应用
我们在性能监测的时候最监测的就是页面的访问率和类中方法的访问率。所以在这一部分主要讲解一下如何监测自己的页面和类中方法的访问。

1, 检测自己的页面访问率
首先我们需要在web.xml中添加一个filter,这个filter就是用来判断哪些页面需要被监视的,如下所示:
<filter>
		<filter-name>JAMonFilter</filter-name>
		<filter-class>com.easywebwork.filter.EasyPageMonFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>JAMonFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
接下来我们看看这个filter的写法:
/**
 * @author 张荣华(ahuaxuan)
 *
 * @since 2007-8-13
 */
public class PageMonFilter extends JAMonFilter{

	private static final long serialVersionUID = 5746197114960908454L;

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
	     Monitor allPages = MonitorFactory.start(new MonKeyImp("org.easywebwork.allPages",getURI(request),"ms."));
	     //这里就是我们要监视的所有的页面的配置
		 Monitor monitor = MonitorFactory.start(getURI(request));
		 //这里就是我们要监视的某个页面的配置
	     try {
	      filterChain.doFilter(request, response);
	     } finally {
	      monitor.stop();
	      allPages.stop();
	     }
	   }

	   protected String getURI(ServletRequest request) {
	     if (request instanceof HttpServletRequest) {
	       return ((HttpServletRequest) request).getRequestURI();
	     } 	else {
	       return "Not an HttpServletRequest";
	     }
	   }

	   private FilterConfig filterConfig = null;
	   
}}

这个类看上去很简单,其实也挺简单的,就是得到uri,然后把它注册到MonitorFactory类中。这样只要我们去访问刚才创建的monitor目录下的jsp就可以看到性能监测页面了。

2, ,接下来我们看看在使用spring的情况下如何监测一个bean的方法调用。Spring也提供了对Jamon的支持(spring支持的东西还真多啊),也就是文章开头提出的那个拦截器,为了给我们的bean加上拦截器,我们在spring的applicationcontext配置文件中加入如下语句:
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="beanNames">
			<list>
				<value>userService</value>				
			</list>
		</property>
		<property name="interceptorNames">
			<list>
				<value>jamonInterceptor</value>
			</list>
		</property>
	</bean>
	
	<bean id="jamonInterceptor" class="org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor">
</bean>

上面这个是典型的spring的aop的配置,如果对spring的aop配置不了解的可以去看一下spring中文文档,当然如果不想了解的话即使直接把这段配置拷到自己的项目中也是可以直接使用的。

还有一个步骤就是在你的log4j.properties中加入这句代码:
log4j.logger.org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor = TRACE

如果没有这一行,那么这个拦截器是不会把方法调用的信息向MonitorFactory注册的。

只需要这些步骤,userservice中的方法在调用的时候就可以被拦截,然后将其注册到MonitorFactory中去了。

所有的配置完成之后我们来看一下效果吧:
http://www.iteye.com/topics/download/b2bac96e-6c18-4340-b7e0-f84c7bb6adca从这个图上我们可以看到,所有页面被访问的次数,UserService中的getAllUsers被调用的次数,最右边的是访问时间。这只是整个图的一部分,当然这个页面中也包括每一个页面被访问的次数和第一次访问的时间等等。下载附件运行,就可以看到所有的页面了。

三,总结
根据以上的步骤,我们就可以监测我们的程序了,应用程序中哪些页面被访问的多,哪些页面被访问的少,哪些方法被访问的多,哪些方法被访问的少,以及访问高峰期集中在什么时间等等,有了这些参数,我们更可以有针对性的对应用程序进行优化了,比如说某个页面访问比较频繁,我就可以用ehcache或oscache给这个页面做一个缓存。如果某个方法的访问比较频繁那就看看这个方法能否进一步优化,是需要异步,还是需要缓存,还是需要其他等等,总之有了jamon可以给我们带来更多的便捷,既可以让我们知道我们的客户的行为,也可以让我们知道我们开发的程序的“能力”。

其实本文提供的只是对页面和方法调用的监控,但是jamon可以提供更多功能,比如说sql语句的监控等等,这就需要我们共同去发掘了。

附件中包括了一个easywebwork的例子,我把jamon导入到这个例子工程中去,大家可以直接下载运行观看效果。Easywebwork是一个旨在减少webwork2.2.x系列的xml配置文件的项目,
如果对这个主题感兴趣请到
http://www.iteye.com/topic/91614
http://www.iteye.com/topic/93814
参加讨论。






  
  
  • JamonSample.rar (3.7 MB)
  • 描述: 由于上传文件大小有限制,所以需要同学们自己添加一下jar包: spring,common-logging,log4j,common-collections activation, common-lang
  • 下载次数: 879
  • 描述: 监控页面
  • 大小: 37.4 KB
  • lib.rar (3.3 MB)
  • 描述: 第二组包包括 spring,common-logging,log4j,common-collections activation, common-lang
  • 下载次数: 526
分享到:
评论
14 楼 seamankwok 2007-11-22  
iamjxc 写道
奇怪, 为什么例子能够运行,但是拷贝到项目里就报错呢?
以menu.jsp为例, 下面的代码中报错:
// Enable/Disable jamon as a whole and the proxy capability.  ResultSets will be disabled by default.
if ("Enable Monitoring!".equals(enableAll)) {
MonitorFactory.enable();
MonProxyFactory.enableAll(true);
MonProxyFactory.enableResultSet(false);

}

说是下面的函数不存在:
MonitorFactory.enable();
还有很多方法不存在.

打开MonitorFactory类,也没有看到enable方法.



把例子下面的WEB-INF/lib/*.jar放到你的项目里就OK了
13 楼 ahuaxuan 2007-09-05  
cherami 写道
引用
jamon的用途很大的,监测页面的访问可以得到两个结果,主要的一个不是用来对比性能,而是观察哪些页面比较受用户欢迎,通过这个监测结果我们可以分析用户的行为,通过它我们就知道用户需要什么样的东西,什么样的东西比较受欢迎,这样能使我们的东西更加符合用户的需要,做到这一点money就来了


呵呵,那么简单money就来了啊。


呵呵,我觉得你没有明白我说的意思,我并没有说money能很简单的就来了,相反,我觉得很难,因为寻找市场是很困难的,尤其对我们程序员来说。

因为即使你看到用户的访问记录你能知道用户的需求吗,你好像觉得分析用户的需求是一件很简单的事情,所以money能来得很简单,问题是分析用户需求是一件很简单得事情吗,假设中国有2亿网民,你能分析出其中1千万得需求,你的money就来了,说白了就是市场,用户的需求不就是市场吗,分析市场如果很容易,那程序员都发了。所以即使看到监测结果你能知道别人需要什么吗?看到几个图表你能知道市场在哪里吗,如果你知道,然后去做这个需求,这个市场,那么你的money就来了。


cherami 写道

我的意思是真正的分析性能瓶颈,优化程序,有页面访问性能不是关键,关键的是方法的性能,这样才能找到真正的瓶颈所在

真正分析性能瓶颈也不能只靠这个,事实上程序员都回利用综合手段,loadrunner,jmeter,等等其他监控工具应该综合时候,只有这个才能事半功倍,我好像也没有说页面访问性能是关键吧。而且jamon也是可以监控方法的调用次数的。
12 楼 cherami 2007-09-05  
引用
jamon的用途很大的,监测页面的访问可以得到两个结果,主要的一个不是用来对比性能,而是观察哪些页面比较受用户欢迎,通过这个监测结果我们可以分析用户的行为,通过它我们就知道用户需要什么样的东西,什么样的东西比较受欢迎,这样能使我们的东西更加符合用户的需要,做到这一点money就来了


呵呵,那么简单money就来了啊。

分析什么页面受欢迎非常的简单,一个方法是分析访问日志,一个方法是加Filter,就不说多如牛毛的站点统计工具了(google分析等)

我的意思是真正的分析性能瓶颈,优化程序,有页面访问性能不是关键,关键的是方法的性能,这样才能找到真正的瓶颈所在
11 楼 flash 2007-09-05  
ahuaxuan 写道
cherami 写道
呵呵,性能监测一家是一家的方法。
光监测页面访问的性能好像作用不大,还是不知道瓶颈在哪里。

jamon的用途很大的,监测页面的访问可以得到两个结果,主要的一个不是用来对比性能,而是观察哪些页面比较受用户欢迎,通过这个监测结果我们可以分析用户的行为,通过它我们就知道用户需要什么样的东西,什么样的东西比较受欢迎,这样能使我们的东西更加符合用户的需要,做到这一点money就来了

确实如化。虽然没用过。
10 楼 ahuaxuan 2007-09-04  
cherami 写道
呵呵,性能监测一家是一家的方法。
光监测页面访问的性能好像作用不大,还是不知道瓶颈在哪里。

jamon的用途很大的,监测页面的访问可以得到两个结果,主要的一个不是用来对比性能,而是观察哪些页面比较受用户欢迎,通过这个监测结果我们可以分析用户的行为,通过它我们就知道用户需要什么样的东西,什么样的东西比较受欢迎,这样能使我们的东西更加符合用户的需要,做到这一点money就来了
9 楼 cherami 2007-09-04  
呵呵,性能监测一家是一家的方法。
光监测页面访问的性能好像作用不大,还是不知道瓶颈在哪里。
8 楼 X.D.Hua 2007-08-31  
Mark,有空再找楼主请教
7 楼 strongkill 2007-08-29  
我還是使用log4j好了.
6 楼 javaeye289 2007-08-29  
why?那么多的资料啊?
5 楼 hamburg 2007-08-28  
如果是存在内存中,访问量大的时候肯定会出现问题,
如果能存到库中的话还是不错的。
4 楼 ahuaxuan 2007-08-28  
Rod 写道
我有个疑问,我还没研究源码,那些数据,运行的次数什么的,是保存到哪里你?

数据默认情况下貌似是保存到内存中,但是可以保存到数据库中,
http://jamonapi.sourceforge.net/
这个是它的文档,大家有兴趣来讨论讨论,之前发这个贴的时候讨论的人不多,我就以为大家对这个性能监控这方面不是很感兴趣,或者也说明它用途不是很大,所以我也没有跟进了。

galaxystar 写道
之前看了jdk6的instrumentation , 不知道有没有好的实现, 用它来侦测系统性能的.

那是不是意味着instrumentation也是一个规范了?还是说jdk6已经实现了?

iamjxc 写道
奇怪, 为什么例子能够运行,但是拷贝到项目里就报错呢?
以menu.jsp为例, 下面的代码中报错:
// Enable/Disable jamon as a whole and the proxy capability.  ResultSets will be disabled by default.
if ("Enable Monitoring!".equals(enableAll)) {
MonitorFactory.enable();
MonProxyFactory.enableAll(true);
MonProxyFactory.enableResultSet(false);

}

说是下面的函数不存在:
MonitorFactory.enable();
还有很多方法不存在.

打开MonitorFactory类,也没有看到enable方法.


你的问题找到了吗,是不是项目配置有问题啊
3 楼 galaxystar 2007-08-27  
之前看了jdk6的instrumentation , 不知道有没有好的实现, 用它来侦测系统性能的.
2 楼 Rod 2007-08-27  
我有个疑问,我还没研究源码,那些数据,运行的次数什么的,是保存到哪里你?
1 楼 iamjxc 2007-08-27  
奇怪, 为什么例子能够运行,但是拷贝到项目里就报错呢?
以menu.jsp为例, 下面的代码中报错:
// Enable/Disable jamon as a whole and the proxy capability.  ResultSets will be disabled by default.
if ("Enable Monitoring!".equals(enableAll)) {
MonitorFactory.enable();
MonProxyFactory.enableAll(true);
MonProxyFactory.enableResultSet(false);

}

说是下面的函数不存在:
MonitorFactory.enable();
还有很多方法不存在.

打开MonitorFactory类,也没有看到enable方法.

相关推荐

    jamon-runtime-2.3.1-API文档-中文版.zip

    赠送jar包:jamon-runtime-2.3.1.jar; 赠送原API文档:jamon-runtime-2.3.1-javadoc.jar; 赠送源代码:jamon-runtime-2.3.1-sources.jar; 赠送Maven依赖信息文件:jamon-runtime-2.3.1.pom; 包含翻译后的API文档...

    jamon-2.7.jar

    还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 jamon-2.7.jar

    jamon-runtime-2.3.1-API文档-中英对照版.zip

    赠送jar包:jamon-runtime-2.3.1.jar; 赠送原API文档:jamon-runtime-2.3.1-javadoc.jar; 赠送源代码:jamon-runtime-2.3.1-sources.jar; 赠送Maven依赖信息文件:jamon-runtime-2.3.1.pom; 包含翻译后的API文档...

    jamon-runtime-2.4.1-API文档-中文版.zip

    赠送jar包:jamon-runtime-2.4.1.jar; 赠送原API文档:jamon-runtime-2.4.1-javadoc.jar; 赠送源代码:jamon-runtime-2.4.1-sources.jar; 赠送Maven依赖信息文件:jamon-runtime-2.4.1.pom; 包含翻译后的API文档...

    jamon-runtime-2.4.1-API文档-中英对照版.zip

    赠送jar包:jamon-runtime-2.4.1.jar; 赠送原API文档:jamon-runtime-2.4.1-javadoc.jar; 赠送源代码:jamon-runtime-2.4.1-sources.jar; 赠送Maven依赖信息文件:jamon-runtime-2.4.1.pom; 包含翻译后的API文档...

    JAMon.jar..

    JAMon.jar..............

    jamon-dist-2013.12.28.zip

    hbase源码调试的时候,需要用它生成hbase-server模块的jamon模版代码,其官网需要翻墙

    jamon-sample.zip

    jamon-sample.zip

    jamon-2.3.jar

    开发时使用的jar包,为您的使用提供更多的包!

    jamon-runtime-2.4.0.jar

    Hbase源码编译时使用到得包.谢谢使用

    jamon-maven-plugin-2.4.2.zip

    Gravatar4Java.zip,生成gravatar url的小库。生成gravatar url的小库

    jamon-2.81.jar

    JAMon核心 com.jamonapi/jamon/2.81/jamon-2.81.jar

    jamon-2.80.jar

    JAMon核心 com.jamonapi/jamon/2.80/jamon-2.80.jar

    jamon:常用配置文件解析器

    Jamon 是一个出色的配置文件解析器,可与您的应用程序一起使用。 配置文件可能如下所示: ip =127.0.0.1 port =123 address =${ip}:${port} base =www.myaddr.com [defaults] user =gabriel email =ga@stripetree...

    jamon-2.0.jar

    JAMon核心 com.jamonapi/jamon/2.0/jamon-2.0.jar

    jamonapi.chm

    詹姆斯介绍 ...JAMon可用于确定应用程序性能瓶颈,用户/应用程序交互和应用程序可扩展性。JAMON收集摘要统计信息,如命中,执行时间(总计,平均值,最小值,最大值,标准差)和同时应用程序请求。

    JamonDemo:Jamon 的演示 - 开源类型安全模板引擎

    火腿演示Jamon 的演示 - 开源类型安全模板引擎Jamon 是一个开源模板引擎,可确保类型安全。 Jamon 所做的是基于 Jamon 模板生成 Java 类,Java 编译器将帮助确保我们将正确的 Java 类型传递给模板。 我在这个演示中...

    maven-jamon-plugin-2.2.2.0.jar

    maven-jamon-plugin-2.2.2.0.jar

    maven-jamon-plugin-2.2.1.0.jar

    maven-jamon-plugin-2.2.1.0.jar

    maven-jamon-plugin-2.2.0.0.jar

    maven-jamon-plugin-2.2.0.0.jar

Global site tag (gtag.js) - Google Analytics