本文主要介绍利用JAMon监控java程序,本文中所用的应用服务器为jboss,对于其他服务器,配置类似。
从Sourceforge上下载JAMon,解压之后是一个jar包和一个war包。将jar包拷贝到lib目录下,war包布署到deploy目录下。
一、页面监控
对于页面监控主要修改你所监控的war包中的web.xml文件,增加一个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提供的这个filter不一定满足需求,我们可以自己写一个filter。
二、java方法的监控
JAMon是通过在要监控的代码前后加上start()和stop方法来实现的,如下:
...
Monitor monitor = MonitorFactory.start( " myMonitor " );
...Your Code...
monitor.stop();
因此我们可以借助aspectj来实现对java方法的监控,代码如下:
ApiAspect.aj
// com.mycompany.*.*包下的所有类的所有public方法
public pointcut apiExecution():
execution(public * com.mycompany.*.*.*(..)) ;
before():apiExecution(){
// start()方法
MonitorManageFactory.getMonitor(thisJoinPoint.toString().substring(
thisJoinPoint.toString().indexOf(" ") + 1));
}
after() returning():apiExecution(){
// stop()方法
MonitorManageFactory.getMonitor(
thisJoinPoint.toString().substring(
thisJoinPoint.toString().indexOf(" ") + 1)).stop();
}
}
MonitorManageFactory.java
import java.util.List;
import com.jamonapi.Monitor;
import com.jamonapi.MonitorFactory;
public class MonitorManageFactory {
private static List<Monitor> monitorPoll = new ArrayList<Monitor>();
public static Monitor getMonitor(String label) {
for (Monitor monitor : monitorPoll) {
if (label.equals(monitor.getLabel())) {
return monitor;
}
}
Monitor monitor = MonitorFactory.start(label);
monitorPoll.add(monitor);
return monitor;
}
}
aop.xml
< aspectj >
< aspects >
< aspect name ="ApiAspect" />
</ aspects >
</ aspectj >
aop.xml要放在META-INF文件夹下,将编译之后的文件和META-INF文件夹拷贝到被监控的war包或jar包中。war中的目录为WEB-INF/classes,jar包为根目录。
最后就是修改应用服务器的启动,在run.bat中加入set JAVA_OPTS=-javaagent:%ASPECTJ_HOME%/aspectjweaver.jar %JAVA_OPTS%
其中ASPECTJ_HOME为aspectjweaver.jar所在的目录的环境变量。
启动jboss,通过访问/jamon就可以看到监控的信息了。