import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD})
@Retention(RUNTIME)
@Documented
public @interface SlowMethodMonitor {
long thresholdMs() default 200L;
}
import com.shein.ug.pepsi.common.annotation.SlowMethodMonitor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class SlowMethodMonitorAop {
@Pointcut("within(com.xx.xx.xx..*) && @annotation(slowMethodMonitor)")
public void monitorMethods(SlowMethodMonitor slowMethodMonitor) {
}
@Around(value = "monitorMethods(slowMethodMonitor)", argNames = "joinPoint,slowMethodMonitor")
public Object doMonitor(ProceedingJoinPoint joinPoint, SlowMethodMonitor slowMethodMonitor) throws Throwable {
long thresholdMs = slowMethodMonitor.thresholdMs();
long start = System.currentTimeMillis();
try {
return joinPoint.proceed();
} finally {
long elapsedTime = System.currentTimeMillis() - start;
if (elapsedTime >= thresholdMs) {
log.warn("{}#{} 方法执行时间{}ms超出阈值{}ms", joinPoint.getTarget().getClass().getSimpleName(), joinPoint.getSignature().getName(), elapsedTime, thresholdMs);
}
}
}
}