JAMon,Java Application Monitor的缩写,主页上这样介绍:
is a free, simple, high performance, thread safe, Java API that allows developers to easily monitor production applications.
可以用于
- 监控服务器的响应时间
- 跟踪应用里的各种行为,比如数据库访问等等
入门级应用
JAMon提供了一种非侵入的方式,只要配置一个filter,将原有请求都先经过这个filter。第一步先下载相关的jar包,放到对应的目录,然后在web.xml里加一段filter的配置
<filter>
<filter-name>JAMonFilter</filter-name>
<filter-class>com.jamonapi.JAMonFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>JAMonFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
然后重启应用,这样JAMon就开始记录应用里各请求的响应情况了,JAMon还提供了页面展示监控到的记录,将下载下来的jamon.war里的文件放到对应目录,然后在web.xml配置jsp的访问路径,如
<!– jamon begin –>
<servlet>
<servlet-name>jamonadmin</servlet-name>
<jsp-file>/jamonadmin.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>menu</servlet-name>
<jsp-file>/menu.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>exceptions</servlet-name>
<jsp-file>/exceptions.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>sql</servlet-name>
<jsp-file>/sql.jsp</jsp-file>
</servlet>
<servlet>
<servlet-name>query</servlet-name>
<jsp-file>/query.jsp</jsp-file>
</servlet>
<!– jamon end –>
重启应用后,访问jamonadmin.jsp,就可看到展示页面,包含各请求的请求次数、响应时间(最大、最小、平均)等信息。对于刚上线的应用,使用此方法监控,可快速发现性能瓶颈。当然,也可以继承这个filter,在里面加入另外想做的事情。
监控每个方法的执行时间
在上面已经可以监控每个请求的情况,但是,有些时候需要粒度更小的监控,比如每个方法的执行时间和次数,找到执行次数最多和时间最长的方法,先优化,应该可以极大地提供整体的响应速度。幸运的是,Spring框架里已经提供了一个Interceptor:JamonPerformanceMonitorInterceptor,可以很好地和JAMon整合,配置也很简单,将想监控的service implementation加入到这个Interceptor,重启后在上面的展示页面就能看到各方法的执行次数和执行时间了。
JamonPerformanceMonitorInterceptor有个缺点,就是必须配置log4j里的level为trace,这点让人不爽,于是有牛人修改了下,具体见Jamon*Interceptor: decoupling monitoring from tracing,不知道最新的Spring有没有修改。
还有个问题是,我在使用中发现,如果需要监控的service implementation之间存在循环引用的话,应用是起不来的,当然,从工程的角度来讲,循环引用是不合理设计导致的,本就不应该出现,可有些时候难免会出现循环引用。后来采用引入第三个service implementation来将原两个循环引用的service解开,这个是治标不治本的办法,呵呵。
这个监控也只是在应用刚上线时比较好,当应用稳定后就不需要了,以免增加额外的开销。
统计系统行为
对于一个稍大点的应用,都需要数据给决策者提供决策的依据,比如一个游戏,那么整个系统里玩家的行为统计和分析将给游戏进一步的运营方向提供清晰的数据支撑,而不是乱无目的地猜测玩家可能喜欢什么。
在JAMon的future directions说要将统计数据持久化,目前JAMon的所有数据都在内存里,只要重启就消失了。这点不太好,历史数据可以用于对比,另外一个是如果应用部署在多个服务器上,那么只能看每台服务器的数据,却不能看总的数据。遗憾的是JAMon自从发布2.7版本后就停止更新了。
对于这个,我在JAMon的基础上做了持久化的工作,支持多节点,提供展示页面,原理很简单,每隔一段时间将统计数据回写到数据库即可。
参考
- JAMon