AOP를 이용하면 특정 클래스의 메서드 실행 전후에 Code를 삽입할 수 있다.
사용자 애플리케이션의 비지니스 메서드에 Code를 삽입하여
1. 시작 시간, 종료시간을 측정하면 비지니스 메서드의 응답 시간을 측정할 수 있고
2. JMX를 이용하여 CPU 사용시간을 측정하면 비지니스 메서드의 CPU 사용률을 측정할 수 있다.
3. Thread Local 변수를 이용하면, Transaction이 시작될때부터 끝날때 까지를 측정할 수 있다. (예를 들어 JSP는 JSPServlet : service 메서드에서부터 시작되기 때문에, AOP에서 before advice에 transaction id를 set하게 하고, after advice에서 Trace내용을 flush하게 하면 된다. 그 중간에는 Thread Local에 Trace 정보를 저장하게 한다.)
초간단하게 작성한 AspectJ를 이용한 메서드별 응답시간 측정 프로그램이다.
Aspect J 1.5이상 JVM 1.5이상에서만 동작한다.
AbstractTracerAspect.aj 소스
==
package bcho.aspectj.aspects;
import bcho.aspectj.logger.xml.*;
public abstract aspect AbstractTracerAspect {
abstract pointcut scope();
pointcut targetMethod(): scope() && execution(* *(..));
Object around(): targetMethod(){
long startTime = System.currentTimeMillis();
try{
return proceed();
}finally{
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
Logger.log(thisJoinPoint,startTime,elapsedTime);
}// try
}
}
===
Logger.java 소스
==
package bcho.aspectj.logger.xml;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
public class Logger {
static public void log(JoinPoint point,long startTime,long elapsedTime){
Signature signature;
Object args[];
signature = point.getSignature();
args = point.getArgs();
System.out.println("["+startTime+"|signature] "+signature);
System.out.println("\tElapsed time :"+elapsedTime);
for(int i=0;i<args.length;i++){
System.out.println("\targ["+i+"] :"+args[i]);
}
}
}
==
코드 작성후 ajc로 컴파일 한후에 jar로 묶고 측정할 Application이 있는 디렉토리에 배포
%TRACER_HOME%/aspectjTracer.jar
%TRACER_HOME%/META-INF/aop.xml 을 다음과 같이 작성
==
<aspectj>
<aspects>
<concrete-aspect name="myTracerAspect" extends="bcho.aspectj.aspects.AbstractTracerAspect">
<pointcut name="scope" expression="within(bcho..*) && !within(bcho.aspectj..*) " />
</concrete-aspect>
</aspects>
</aspectj>
==
expression 부분이 Weaving을 할 class에 대한 정의
bcho.* 시작되는 모든 클래스를 profiling하되 bcho.aspectj.* 클래스는 제거하도록 설정함. (XML이기 때문에, &를 &로 정의해야 함)
다음 CLASSPATH에 다음 내용을 추가함
set CLASSPATH=%TRACER_HOME%;%CLASSPATH%
set CLASSPATH=%TRACER_HOME%/aspectjTracer.jar;%CLASSPATH%
java 실행시 다음과 같이 -Xagent 옵션 추가
java -javaagent:%ASPECTJ_HOME%/lib/aspectjweaver.jar {실행할 JAVACLASS}
를 해주면 Runtime에 Weaving이 되면서 메서드 수행 시간을 trace해준다.
자세한 내용은 다 만들면 다시 정리하겠다... ^^
참고 : Thread별 CPU 사용률 측정 방법 http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/ThreadMXBean.html
'성능과 튜닝 > APM (AP 성능 측정)' 카테고리의 다른 글
서버 모니터링 및 APM 솔루션 모음 (0) | 2015.12.01 |
---|---|
Aspect J를 이용한 초간단 APM 만들기 (3) (0) | 2009.03.27 |
Aspect J를 이용한 초간단 APM 만들기 (2) (0) | 2009.03.20 |