以下介绍在Spring中如何实现简单的性能监控,监控每一个Spring管理的方法调用过程中花费的时间,并把相关信息记录到日志数据库中;
根据以上的问题,我们首先想到的应该就是Spring提供的AOP了,确实是用AOP可以很容易的解决这个问题;
参考如下步骤:
1 创建MethodBeforeAdvice,记录方法执行的开始时间,如下
package whf.framework.aop;
import java.lang.reflect.Method;
import whf.framework.service.Service;
public class MethodBeforeAdvice implements org.springframework.aop.MethodBeforeAdvice {
public static ThreadLocal<Long> threadLocal = new ThreadLocal<Long>();
public void before(Method method, Object[] args, Object target)
throws Throwable {
if(target instanceof Service){
threadLocal.set(System.currentTimeMillis());
}
}
}
2 创建MethodAfterAdvice,将监控的信息记录到数据库
package whf.framework.aop;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
import whf.framework.config.ApplicationConfig;
import whf.framework.log.Log;
import whf.framework.log.LogFactory;
import whf.framework.log.entity.Logable;
import whf.framework.log.util.LoggerUtils;
import whf.framework.meta.Metaable;
import whf.framework.security.entity.User;
import whf.framework.service.Service;
import whf.framework.util.StringUtils;
import whf.framework.util.ThreadContext;
public class MethodAfterAdvice implements AfterReturningAdvice {
private static Log log = LogFactory.getLog(MethodAfterAdvice.class);
public void afterReturning(Object object, Method method, Object[] args,
Object target) throws Throwable {
if(target instanceof Service){
long consumeTime = System.currentTimeMillis() - MethodBeforeAdvice.threadLocal.get();
User user = ThreadContext.getUserInUserContext();
String sessionId = ThreadContext.getSessionId();
String department = user ==null? null:user.getDept() == null?null: user.getDept().getCode();
String operator = user == null?"anonymous":user.getName()+"("+user.getUsername()+")";
String ip = ThreadContext.getUserContext() != null? ThreadContext.getUserContext().getRemoteIpAddress(): null;
if(ApplicationConfig.getInstance().isServiceMonitoring() &&
!(target instanceof Logable) && !(target instanceof Metaable)) {
String params = StringUtils.toString(args);
whf.framework.log.entity.Log logEntity = new whf.framework.log.entity.Log(department, operator,
target.getClass().getSuperclass().getName(), "SERVICE INVOKE", method.getName(), params,
sessionId, ip, consumeTime, null);
LoggerUtils.log(logEntity);
}
if(object != null)
log.debug("Method:" + consumeTime + " -\t" + operator + " - \t" + target.getClass().getName() +":"+object.getClass().getName()+"->"+method.getName());
else
log.debug("Method:" + consumeTime + " -\t" + operator + " - \t" + target.getClass().getName()+"->"+method.getName());
}
}
}
3 增加配置,将监控配置到Spring中
<bean id="methodBeforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<bean class="whf.framework.aop.MethodBeforeAdvice" />
</property>
<property name="mappedName">
<value>*</value>
</property>
</bean>
<bean id="methodAfterAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice">
<bean class="whf.framework.aop.MethodAfterAdvice" />
</property>
<property name="mappedName">
<value>*</value>
</property>
</bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="proxyTargetClass">
<value>true</value>
</property>
<property name="beanNames">
<value>*Service</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
<value>methodBeforeAdvisor</value>
<value>methodAfterAdvisor</value>
</list>
</property>
</bean>
完成了,现在Spring会自动的将所有的监控相关信息记录到数据库;
其中需要说明的是,如果你监视的结果存储到数据库的话,那么你的日志的表一定要在这里面过滤掉,不然会出现死循环(插入日志 -〉 监控到日志查询信息 -〉 插入日志 。。。。。。)
From:
http://chengyoyo2006.blog.163.com/blog/static/845173482008105105651809/
分享到:
相关推荐
NULL 博文链接:https://donlianli.iteye.com/blog/1900885
本篇文章主要介绍了Spring MVC Interceptor 实现性能监控的功能代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
基于微服务springboot架构开发,是轻量高性能的分布式监控系统,核心采集指标包括:**cpu使用率,cpu温度,内存使用率,磁盘容量,磁盘IO,硬盘SMART健康状态,系统负载,连接数量,网卡流量,硬件系统信息等。...
Druid数据库连接池,监控数据库访问性能,详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 数据库密码加密。 2、持久层 ====== mybatis持久化,PageHelper分页。Transtraction注解Jta事务。 3、...
代码实现简单,易于维护:使用 Spring AOP 可以将耗时监测的逻辑与业务逻辑进行解耦,避免业务逻辑代码的冗余和代码维护难度的提高。 2. 安全性高:使用 Spring AOP 进行方法耗时监测,可以在不修改业务逻辑代码的...
Sql监控 采用 druid 监控数据库访问性能 技术栈 基础框架:Spring Boot 2.1.0.RELEASE 持久层框架:Spring boot Jpa 安全框架:Spring Security 缓存框架:Redis 日志打印:logback+log4jdbc 接口文档 swagger2 ...
目前开源世界中暂没有一个比较成熟的zookeeper-monitor,公司内部的各个zookeeper运行也都是无监控,无报表状态。于是开始zookeeper监控这块工作。 目前zookeeper-monitor能做哪些事情,讲到这个,首先来看看哪些...
│ 15 应用性能监控:通过 SkyWalking 实施链路追踪.mp4 │ 16 分布式事务:Alibaba Seata 如何实现分布式事务.mp4 │ 17 消息队列:基于 RocketMQ 实现服务异步通信.mp4 │ 18 综合应用:Seata 分布式事务实战...
Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者...这篇文章主要介绍了基于spring-boot和docker-java实现对docker容器的动态管理和监控 ,需要的朋友可以参考下
性能监控:监控整个系统的性能,SQL监控,SQL防火墙,URL监控,SPRING监控,SESSION监控等 10. 接口测试:POST or GET 方式检测系统接口,参数加密,json返回结果,计算服务器响应时间 11. 发送邮件:单发,群发...
一个生产管理ERP系统。主要包括:计划进度、设备管理、工艺监控、物料监控、...Druid(数据源配置 sql防注入 sql性能监控) 统一的异常处理 JSP JSTL JavaScript kindeditor富文本编辑器,处理图片上传和富文本编辑
监控与日志:系统使用监控工具和日志系统,如Spring Cloud Sleuth、Zipkin、ELK Stack等,实现对系统运行状态、性能和日志的监控和分析。 水平扩展与弹性伸缩:系统支持水平扩展和弹性伸缩,通过增加服务实例和负载...
基于Spring Boot在线远程考试系统的设计与实现是一个面向教育机构和企业培训的应用程序,旨在提供一个稳定、高效且易于使用的在线考试平台。该系统利用了Spring Boot框架的众多优点,包括自动配置、独立运行以及内嵌...
2. 负载均衡:Spring Cloud支持负载均衡的能力,通过集成Ribbon和Feign等组件,可以实现对服务的自动负载均衡,提高系统的可用性和性能。 3. 服务调用和熔断:Spring Cloud通过集成Ribbon和Hystrix等组件,提供了...
本文系统基于 Spring Cloud 框架,由用户服务、题库服务、竞赛服务、教学服务、程序评测服务、博客服务和监控报警服务组成,皆在解决传统程序评测需手动评判的问题。用户可登录本系统提交评测源码,系统评测服务自动...
基于AQS实现高性能连接池。 提供failover和failfast两种高可用策略。 支持同步和异步回调两种机制。 提供接口方法请求时间、tps等监控信息。 提供和自定义服务端过载保护策略。 jmh基准测试结果 运行基准测试步骤: ...
它利用Spring Boot的快速开发特性,结合了试题管理、考试创建、考生管理、实时监控、自动评分和成绩分析等功能,旨在提供一个高效、可靠且用户友好的工具,以帮助实现在线考试的管理和监控。 以下是该在线远程考试...
性能监控:监控整个系统的性能,SQL监控,SQL防火墙,URL监控,SPRING监控,SESSION监控等 10. 接口测试:POST or GET 方式检测系统接口,参数加密,json返回结果,计算服务器响应时间 11. 发送邮件:单发,群发...
基于 java aio 实现的低延迟、高性能百万级 mqtt client 组件和 mqtt broker 服务。支持 MQTT v3.1、v3.1.1 以及 v5.0 协议。 支持 websocket mqtt 子协议(支持 mqtt.js)。 支持 http rest api, 支持 MQTT client...
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的...