All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.chinare.axe.apm.APMInterceptor Maven / Gradle / Ivy

The newest version!
package com.chinare.axe.apm;

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.nutz.lang.Stopwatch;
import org.nutz.lang.Times;
import org.springframework.scheduling.annotation.Async;

import com.chinare.axe.apm.APMAppender.APMLog;

/**
 * @author kerbores
 *
 */
@Aspect
public class APMInterceptor {

	APMAppender appender;

	UserCollector collector;

	URLProvider urlProvider;

	/**
	 * 
	 * @param appender    信息处理器
	 * @param collector   用户收集器
	 * @param urlProvider url 提供者
	 */
	public APMInterceptor(APMAppender appender, UserCollector collector, URLProvider urlProvider) {
		super();
		this.appender = appender;
		this.collector = collector;
		this.urlProvider = urlProvider;
	}

	public APM getApm(JoinPoint joinPoint) throws ClassNotFoundException {
		String targetName = joinPoint.getTarget().getClass().getName();
		String methodName = joinPoint.getSignature().getName();
		Object[] arguments = joinPoint.getArgs();
		Class targetClass = Class.forName(targetName);
		Method[] methods = targetClass.getMethods();
		APM target = null;
		for (Method method : methods) {
			if (method.getName().equals(methodName)) {
				Class[] clazzs = method.getParameterTypes();
				if (clazzs.length == arguments.length) {
					target = method.getAnnotation(APM.class);
					break;
				}
			}
		}
		return target;
	}

	@Around("@annotation(com.chinare.axe.apm.APM)")
	public Object filter(ProceedingJoinPoint point) throws Throwable {
		APM log = getApm(point);
		String user = collector.collector();
		APMLog apmLog = new APMLog();
		apmLog.setUser(user);
		apmLog.setTag(log.value());
		apmLog.setActionTime(Times.now());
		apmLog.setArgs(point.getArgs());
		if (urlProvider != null) {
			apmLog.setUrl(urlProvider.provide());
		}
		Object obj = null;
		try {
			Stopwatch stopwatch = Stopwatch.beginNano();
			obj = point.proceed();
			stopwatch.stop();
			apmLog.setActionDuration(stopwatch.getDuration());
			apmLog.setRetuenObj(obj);
		} catch (Throwable e) {
			apmLog.setException(true);
			throw e;
		} finally {
			log(apmLog);
		}
		return obj;
	}

	@Async
	public void log(APMLog log) {
		appender.append(log);
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy