`
sha851092391
  • 浏览: 72438 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用Spring AOP进行性能监控

阅读更多

 

如果你正在使用Spring管理/访问资源(Dao/Service),那么你可能也需要添加一些基础的性能监控。在Spring AOP的帮助下这将变成一个简单的任务,不需要任何现有代码的变化,只是一些简单的配置。

第一步,你首先的将spring-aop、aspectj和cglib库导入,如果你使用maven管理你的项目依赖的话,很简单加上如下依赖关系就可以了。

01 <dependency>
02     <groupId>org.aspectj</groupId>
03     <artifactId>aspectjweaver</artifactId>
04     <version>1.5.4</version>
05 </dependency>
06 <dependency>
07     <groupId>cglib</groupId>
08     <artifactId>cglib-nodep</artifactId>
09     <version>2.2</version>
10 </dependency>
11 <dependency>
12   <groupId>org.springframework</groupId>
13   <artifactId>spring-aop</artifactId>
14   <version>2.5.6</version>
15 </dependency>

 

 

接下来,指明你需要监视的内容,并把AOP配好。通常,仅仅需要在现有的SpringXML配置文件中增加一个横切点。这个配置将会将位于包"com.mycompany.services"下的所有方法的响应时间记录下来。注:这些类必须使用Spring context初始化,否则AOP将不会被执行。

1 <bean id="performanceMonitor"
2           class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor" />
3
4 <aop:config>
5     <aop:pointcut id="allServiceMethods" expression="execution(* com.mycompany.services.*.*(..))"/>
6     <aop:advisor pointcut-ref="allServiceMethods" advice-ref="performanceMonitor" order="2"/>
7 </aop:config>

 

 

接下来,需要配置好日志系统,例如log4j。

1 <logger name="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"additivity="false">
2     <level value="TRACE"/>
3     <appender-ref ref="STDOUT"/>
4 </logger>

 

 

ok了,现在我们运行一下程序你会发现下面的日志输出:

1 TRACE PerformanceMonitorInterceptor  - StopWatch 'PerfTestService.processRequest': running time(millis) = 1322
2 TRACE PerformanceMonitorInterceptor  - StopWatch 'PerfTestService.processRequest': running time(millis) = 98
3 TRACE PerformanceMonitorInterceptor  - StopWatch 'PerfTestService.processRequest': running time(millis) = 1764

 

 

这些是大量的一些原始数据,但不幸的是这些东西对我们几乎没用,每一个方法调用都会有记录,而且缺乏一些其他信息。所以,除非你打算写一些日志分析程序、或者使用第三方软件,否则的话,我想你应该在日志被记录前做出一些处理。

一个简单的办法就是在这之间写一个简单的拦截器类来替代Spring给我们提供的默认的类(PerformanceMonitorInterceptor)。下面的一个例子,这个例子提供了一些有用的信息(最后一个、平均、最大的响应时间),另外当一个方法的响应时间超出指定的时间后给出警告。

默认的,每当十个方法调用的时候,做一次记录,在任何方法响应时间超过1000ms的时候给出警告。

01 public class PerfInterceptor implements MethodInterceptor {
02
03      Logger logger = LoggerFactory.getLogger(PerfInterceptor.class.getName());
04     private static ConcurrentHashMap<String, MethodStats> methodStats = newConcurrentHashMap<String, MethodStats>();
05     private static long statLogFrequency = 10;
06     private static long methodWarningThreshold = 1000;
07     
08     public Object invoke(MethodInvocation method) throws Throwable {
09         long start = System.currentTimeMillis();
10         try {
11             return method.proceed();
12         }
13         finally {
14             updateStats(method.getMethod().getName(),(System.currentTimeMillis() - start));
15         }
16     }
17
18     private void updateStats(String methodName, long elapsedTime) {
19         MethodStats stats = methodStats.get(methodName);
20         if(stats == null) {
21             stats = new MethodStats(methodName);
22             methodStats.put(methodName,stats);
23         }
24         stats.count++;
25         stats.totalTime += elapsedTime;
26         if(elapsedTime > stats.maxTime) {
27             stats.maxTime = elapsedTime;
28         }
29         
30         if(elapsedTime > methodWarningThreshold) {
31             logger.warn("method warning: " + methodName + "(), cnt = " + stats.count + ", lastTime = " + elapsedTime + ", maxTime = " + stats.maxTime);
32         }
33         
34         if(stats.count % statLogFrequency == 0) {
35             long avgTime = stats.totalTime / stats.count;
36             long runningAvg = (stats.totalTime-stats.lastTotalTime) / statLogFrequency;
37             logger.debug("method: " + methodName + "(), cnt = " + stats.count + ", lastTime = "+ elapsedTime + ", avgTime = " + avgTime + ", runningAvg = " + runningAvg + ", maxTime = " + stats.maxTime);
38             
39             //reset the last total time
40             stats.lastTotalTime = stats.totalTime;  
41         }
42     }
43     
44     class MethodStats {
45         public String methodName;
46         public long count;
47         public long totalTime;
48         public long lastTotalTime;
49         public long maxTime;
50         
51         public MethodStats(String methodName) {
52             this.methodName = methodName;
53         }
54     }
55 }

 

 

现在,你只需要将你的Spring配置文件中做相关修改,将这个类应用进去,再运行程序,你将会看到如下的统计信息。

1 WARN  PerfInterceptor - method warning: processRequest(), cnt = 10, lastTime = 1072, maxTime = 1937
2 TRACE PerfInterceptor - method: processRequest(), cnt = 10, lastTime = 1072, avgTime = 1243, runningAvg = 1243, maxTime = 1937
3 WARN  PerfInterceptor - method warning: processRequest(), cnt = 20, lastTime = 1466, maxTime = 1937
4 TRACE PerfInterceptor - method: processRequest(), cnt = 20, lastTime = 1466, avgTime = 1067, runningAvg = 892, maxTime = 1937

 

 

正如你看到的一样,这些统计数据可以在不修改任何现有的Java代码的情况下,提供有关class/method性能的有价值的反馈,而根据这个日志,你可以很轻松的找出程序中的瓶颈。

 

转载于:http://my.oschina.net/jack230230/blog/65987

分享到:
评论
1 楼 yakoo5 2015-05-04  
methodStats.put(methodName,stats) -> methodStats.putIfAbsent(methodName, stats)

相关推荐

    Spring aop 性能监控器

    NULL 博文链接:https://donlianli.iteye.com/blog/1900885

    Java利用spring aop进行监测方法执行耗时

    使用 Spring AOP 进行方法耗时监测的好处有以下几点: 1. 代码实现简单,易于维护:使用 Spring AOP 可以将耗时监测的逻辑与业务逻辑进行解耦,避免业务逻辑代码的冗余和代码维护难度的提高。 2. 安全性高:使用 ...

    Spring Boot Aspect 切面 AOP 拦截器 Interceptor 监控control请求耗时

    常用拦截 拦截器HandlerInterceptor 拦截器MethodInterceptor 添加依赖 创建启动类 创建拦截器类 创建控制器 监控control请求耗时,提高性能

    利用Spring AOP记录方法的执行时间

    给大家介绍的是spring的aop来实现方法级的执行时间的记录监控,以此来评估方法的性能以及针对性的对已存在的方法进行优化。对于监控,我们比较关注监控的可靠性和性能,准确,高效,这才能在不影响整体性能的情况下...

    spring-boot mybaits spring security redis整合

    Druid数据库连接池,监控数据库访问性能,详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 数据库密码加密。 2、持久层 ====== mybatis持久化,PageHelper分页。Transtraction注解Jta事务。 3、...

    基于SpringBoot2+Jpa+SpringSecurity+redis+Vue的前后端分离系统

    Sql监控 采用 druid 监控数据库访问性能 技术栈 基础框架:Spring Boot 2.1.0.RELEASE 持久层框架:Spring boot Jpa 安全框架:Spring Security 缓存框架:Redis 日志打印:logback+log4jdbc 接口文档 swagger2 ...

    J2EE spring mvc mybatis bootstrap HTML5 后台框架 控制台 mysql版本_spring3.0

    性能监控:监控整个系统的性能,SQL监控,SQL防火墙,URL监控,SPRING监控,SESSION监控等 10. 接口测试:POST or GET 方式检测系统接口,参数加密,json返回结果,计算服务器响应时间 11. 发送邮件:单发,群发...

    JAVA中spring介绍及心得.docx

    Spring是一个开源的Java应用框架,它为企业级Java应用... - AOP允许将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,例如日志记录、性能监控、事务管理等。 - Spring框架通过AOP支持将切面逻辑与业务逻

    基于SSM框架的生产管理ERP系统源码+数据库+项目文档,含计划进度、设备管理、工艺监控、物料监控、人员监控、质量监控、系统管理

    一个生产管理ERP系统。主要包括:计划进度、设备管理、工艺监控、物料监控、...Druid(数据源配置 sql防注入 sql性能监控) 统一的异常处理 JSP JSTL JavaScript kindeditor富文本编辑器,处理图片上传和富文本编辑

    Spring面试题

    在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。 我用开启在线信用帐户的用例作为起点。对于该实现,...

    2023java面试题大全及答案大厂面试经典问题

    监控方法运行时间 (监控性能)。 权限控制,数据权限等。 缓存优化(第一次调用查询数据库,将查询结果放入内存对象,第二次调用,直接从内存对象返回,不需要查询数据库)。 事务管理(调用方法前开启事务, 调用...

    J2EE spring mvc mybatis bootstrap HTML5 后台框架 控制台 oracle版本_spring3.0

    性能监控:监控整个系统的性能,SQL监控,SQL防火墙,URL监控,SPRING监控,SESSION监控等 10. 接口测试:POST or GET 方式检测系统接口,参数加密,json返回结果,计算服务器响应时间 11. 发送邮件:单发,群发...

    Java高级工程师简历模板18k+

    基本资料 教育背景 求职意向 专业技能 项目经验 工作经历 自我评价 ◆专业技能 1.具有扎实的Java基础,对面向对象编程有深刻的理解,...6.熟练掌握SSM等框架使用,熟悉spring IOC ,springAop springs事物核心

    spring-boot mybaits shiro redis整合

    Druid数据库连接池,监控数据库访问性能,详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 数据库密码加密。 2、持久层 ====== mybatis持久化,PageHelper分页。Transtraction注解Jta事务。 3、...

    spring-boot-microservice-template:Spring Boot微服务模板,基于持续交付的思想,用于快速交付可持续交付的微服务

    Spring Boot MicroService模板技术栈代码规范配置管理测试... 单元测试 组件测试 api测试 测试覆盖率 合同测试 整合测试 性能测试 测试覆盖率应用层 DDD策略 DIP(弹簧容器) AOP(SpringAOP) ORM(mybatis) Asnyc

    java面试题

    spring使用AOP面向切面的思想进行事务管理的。 spring和Hibernate继承后,定义事务管理特性的时候查询为什么要定义为read-only? 答:因为添加、删除和更新都涉及到了数据库的修改,而查询并未涉及到数据库修改,...

    java ssm开发的生产管理ERP系统

    这是一个生产管理ERP系统。依托科技计划重点项目“制造装备...- [Druid(数据源配置 sql防注入 sql性能监控)] - 统一的异常处理 - JSP JSTL JavaScript - kindeditor富文本编辑器,处理图片上传和富文本编辑&lt;!--more--&gt;

    JAVA制造装备物联及生产管理(ERP)系统源码

    Druid(数据源配置 sql防注入 sql性能监控) 统一的异常处理 JSP JSTL JavaScript kindeditor富文本编辑器,处理图片上传和富文本编辑 项目框架: 后台框架:spring+ springMVC + shiro + MyBatis + ...

Global site tag (gtag.js) - Google Analytics