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

club.zhcs.apm.APMInterceptor Maven / Gradle / Ivy

package club.zhcs.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.aspectj.lang.reflect.MethodSignature;
import org.nutz.lang.Stopwatch;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.scheduling.annotation.Async;

import club.zhcs.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) {
        MethodSignature joinPointObject = (MethodSignature) joinPoint.getSignature();
        Method method = joinPointObject.getMethod();

        boolean flag = method.isAnnotationPresent(APM.class);
        if (flag) {
            return method.getAnnotation(APM.class);
        } else {
            APM classAnnotation = AnnotationUtils.findAnnotation(joinPointObject.getMethod().getDeclaringClass(), APM.class);
            if (classAnnotation != null) {
                return classAnnotation;
            } else {
                return null;
            }
        }
    }

    @Around("@within(club.zhcs.apm.APM)|| @annotation(club.zhcs.apm.APM)")
    public Object filter(ProceedingJoinPoint point) throws Throwable {
        APM log = getApm(point);
        Object[] args = point.getArgs();
        Object obj = null;
        long duration = 0;
        boolean exception = false;
        try {
            Stopwatch stopwatch = Stopwatch.beginNano();
            obj = point.proceed();
            stopwatch.stop();
            duration = stopwatch.getDuration();
        }
        catch (Throwable e) {
            exception = true;
            throw e;
        }
        finally {
            log(appender.collect(urlProvider.provide(), collector.collector(), log, args, obj, duration, exception));
        }
        return obj;
    }

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

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy