以下介绍在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会自动的将所有的监控相关信息记录到数据库;
其中需要说明的是,如果你监视的结果存储到数据库的话,那么你的日志的表一定要在这里面过滤掉,不然会出现死循环(插入日志 -〉 监控到日志查询信息 -〉 插入日志 。。。。。。)
详细源代码参考:
http://whfframework.googlecode.com/svn/trunk/
分享到:
相关推荐
本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...
拦截器(HandlerInterceptor)用于在请求被实际处理之前和之后执行一些额外的任务,如记录请求日志、性能监控等。在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口并重写其三个方法——`preHandle()`, `...
以下是如何在Java中实现微服务的API文档性能监控的详细步骤和代码示例。 通过使用Spring Boot Actuator、Prometheus和Grafana,可以构建一个全面的监控系统,用于监控微服务的API文档性能。此外,通过Micrometer定义...
在这个"Spring Boot druid 以及相关sql、Spring监控配置demo"中,我们将探讨如何在Spring Boot项目中集成Druid数据源,以及如何配置SQL监控和Spring的监控功能。 首先,让我们了解Druid数据源的核心特性: 1. **高...
Spring Boot的性能监控主要借助于其提供的actuator模块,该模块设计目的是为了简化微服务的监控和管理...通过与JConsole、Spring Boot Admin等工具的结合,可以实现全面、直观的性能监控,提升微服务的稳定性和可靠性。
在Spring框架中,Druid可以被用来作为数据源,提供高效的数据库连接管理和性能监控。 首先,Druid的核心功能是作为数据库连接池。在Java Web应用中,频繁的数据库操作会导致频繁创建和关闭数据库连接,这会消耗大量...
在本场景中,我们使用Interceptor来实现性能监控功能,以追踪每个URL的执行时间。 `PerformanceInterceptor` 类实现了 `HandlerInterceptor` 接口,该接口定义了三个方法:`preHandle`、`postHandle` 和 `...
Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,通过在程序运行时动态地将代码插入到方法调用中,来实现跨切面的关注点,如日志记录、性能监控、事务管理等。而Spring...
在IT行业中,性能监控是确保系统稳定性和效率的...综上所述,"cat性能监控demo资源"将帮助开发者理解如何在Spring MVC环境中使用Cat进行性能监控,通过实践案例学习Cat的功能和使用技巧,从而提升系统的稳定性与效率。
- **性能监控**:记录方法执行时间,分析系统性能瓶颈。 ### 6. 性能对比 JDK动态代理由于基于接口,对非接口类无法处理,而CGLIB则无此限制,但CGLIB的性能相对较低。在实际应用中,应根据具体需求和性能要求选择...
New Relic是一个强大的应用性能管理(APM)工具,它可以帮助开发者监控、诊断和优化Java应用程序的性能。本文将详细介绍New Relic的核心功能,如何在Spring Boot中配置New Relic,以及如何与Vue.js前端集成。 通过使用...
在这个“Spring实现增删改查”的项目中,我们将深入探讨如何利用Spring框架来实现数据库操作的基础功能。 1. **依赖注入(DI)**:在Spring框架中,DI是一种设计模式,它允许对象之间的关系在运行时被外部容器管理...
其中,AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者定义“切面”,这些切面可以封装横切关注点,如日志记录、事务管理、性能监控等。本篇将深入探讨如何在Spring中半...
在 `springBatchDemo` 文件中,通常包含了示例代码,演示如何配置和运行一个简单的Spring Batch作业,涉及到读取数据库中的数据,进行处理,然后写回到数据库。你可以参考这些代码,理解Spring Batch的工作原理和...
### 基于Spring的隧道监控管理系统的设计与实现 #### 技术选型与系统架构 本项目采用了Spring Cloud作为微服务架构的基础框架,并利用Spring Boot简化了开发过程中的配置和依赖管理。为了保证数据的一致性和持久性...
AOP的核心思想是“切面”,它封装了特定的关注点,如日志记录、事务管理、性能监控等。在Spring中,切面是通过定义通知(advises)来实现的,这些通知定义了在何时何地执行特定的行为。Spring支持四种通知类型:前置...
6. **实际应用**:在生产环境中,Spring Boot Admin 可以帮助团队监控多个分布式系统的运行状况,及时发现性能瓶颈或异常,提升运维效率。 7. **健康检查**:Spring Boot Admin 提供了对应用健康状况的检查,包括...
在这个“Spring实现的一个打印机”的项目中,我们可以深入探讨Spring如何帮助实现一个打印机服务,并从中学习Spring的相关知识点。 首先,我们要理解Spring的核心概念——依赖注入(DI)。在传统的Java程序中,对象...