001 package biz.hammurapi.metrics; 002 003 import java.lang.reflect.Method; 004 import java.util.Stack; 005 006 import org.codehaus.aspectwerkz.joinpoint.MethodSignature; 007 import org.codehaus.aspectwerkz.joinpoint.StaticJoinPoint; 008 009 import biz.hammurapi.metrics.MeasurementCategory; 010 import biz.hammurapi.metrics.MeasurementCategoryFactory; 011 012 /** 013 * Metrics collecting aspect. 014 * @author Pavel 015 */ 016 public class MetricsAspect { 017 private static MeasurementCategory mc = MeasurementCategoryFactory 018 .getCategory(MetricsAspect.class); 019 020 /** 021 * Call stack 022 */ 023 private ThreadLocal calls = new ThreadLocal() { 024 025 protected Object initialValue() { 026 return new Stack(); 027 } 028 029 }; 030 031 /** 032 * This method pushes method start time to a thread local stack. 033 * @param joinPoint 034 */ 035 public void before(StaticJoinPoint joinPoint) { 036 ((Stack) calls.get()).push(new Long(System.currentTimeMillis())); 037 } 038 039 /** 040 * This method pops method start time from the thread local stack and reports method duration measurement. 041 * @param joinPoint 042 */ 043 public void after(StaticJoinPoint joinPoint) { 044 Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); 045 Stack tlStack = (Stack) calls.get(); 046 if (!tlStack.isEmpty()) { 047 Long start = (Long) (tlStack).pop(); 048 049 if (start != null) { 050 long now = System.currentTimeMillis(); 051 mc.addMeasurement(method.toString(), now - start.longValue(), now); 052 } 053 } 054 } 055 056 }