如何知道整个系统每个方法的执行时间

发布时间:2021-10-19 11:19:56 作者:iii
来源:亿速云 阅读:145

这篇文章主要讲解了“如何知道整个系统每个方法的执行时间”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何知道整个系统每个方法的执行时间”吧!

(一)前言

最近到年底了,上线三个月的系统也已经稳定了。不过项目经理最近感觉系统变慢了,想知道整个系统前端和后端所有方法的执行时间。是的你没有听错,是每个方法。这个需求一提出来就被整蒙了,给每个方法计算执行时间,这不是平白给系统压力吗?

(二)思路

既然提了,先给思路吧。其实很简单,每个方法执行前记录一个时间戳,执行结束后记录一个时间戳,相减就是执行时间。但是去每个方法里改是不现实的,那么多代码,如果去侵入那工作量也太大了,而且如果有一天项目经理又不要这个功能了呢?

一听到这个需求,就应该想到AOP,用了那么久的Spring,IOC、AOP背的滚瓜烂熟,现在就是应用的时候了。

(三)使用AOP记录时间

AOP的概念就不在这里提了,面向切面,无侵入开发,正适合这个需求。而且20行代码可以解决问题。

3.1 引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

3.2 配置切面

首先配置一个切入点,我这里要让切面在TestController这个类中的所有方法上生效

@Slf4j
@Component
@Aspect
@Order(10)
public class LogAspect {

	//配置切入点,即执行的位置
    @Pointcut("execution(* com.javayz.codinguser.controller.TestController.*(..))")
    public void pointCut(){
    }

	//使用环绕通知,在方法的执行前后分别记录一个时间相减
    @Around("pointCut()")
    public Object doLog(ProceedingJoinPoint proceedingJoinPoint){
        long startTime = System.currentTimeMillis();
        Object object=null;
        try {
            object=proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }finally {
            long endTime = System.currentTimeMillis();
            log.info(proceedingJoinPoint.getSignature().toShortString()+"方法执行了:"+(endTime-startTime)+"ms");
        }
        return object;
    }
}

TestController方法是这样的:

@RestController
@RequestMapping("/testApi")
public class TestController {

    @GetMapping("/test1")
    public String testAop(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "testAop";
    }
}

3.3 测试一下

直接调用/testApi/test1,效果出来了

如何知道整个系统每个方法的执行时间

3.4 自定义一个注解

现在已经可以满足项目经理的需求了,如果以后新的代码没有在切入点的范围内,就又不生效了,因此定义一个注解吧,要记录时直接写个注解

@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
public @interface LogAnnotation {
}

配置切入点的时候增加注解

@Pointcut("execution(* com.javayz.codinguser.controller.TestController.*(..)) || @annotation(com.javayz.codinguser.annotation.LogAnnotation)")
public void pointCut(){
}

好了,在需要执行的时候加上这个注解就OK了。

(四)关于记录数据的问题

项目经理还希望可以随时查某个时间的方法执行时间,那就必须存下来这些数据了。

现在这个系统共有4万人使用,如果存入数据库,我在表里定义三个字段:时间、调用人员、调用时间,调用方法,一条数据大约在40字节大小。按四万个人的使用,一天最少也要产生4000万条数据,大约1.5G。数据量倒是没关系,对数据库写入的压力就更大了。

如果存在日志里也一样,日志会变得特别大,而且排查起来不方便。

感谢各位的阅读,以上就是“如何知道整个系统每个方法的执行时间”的内容了,经过本文的学习后,相信大家对如何知道整个系统每个方法的执行时间这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. 每个程序员必须知道的十大机器学习算法
  2. python获取整个页面的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:让Python变快的方案有哪些

下一篇:如何理解Java回调机制

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》