`
javawhf
  • 浏览: 7201 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Spring中实现简单的性能监控

阅读更多
以下介绍在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 性能监控器

    本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...

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

    拦截器(HandlerInterceptor)用于在请求被实际处理之前和之后执行一些额外的任务,如记录请求日志、性能监控等。在Spring Boot中,我们可以通过实现`HandlerInterceptor`接口并重写其三个方法——`preHandle()`, `...

    如何在Java中实现微服务的API文档性能监控

    以下是如何在Java中实现微服务的API文档性能监控的详细步骤和代码示例。 通过使用Spring Boot Actuator、Prometheus和Grafana,可以构建一个全面的监控系统,用于监控微服务的API文档性能。此外,通过Micrometer定义...

    Spring Boot druid 以及相关sql、Spring监控配置demo

    在这个"Spring Boot druid 以及相关sql、Spring监控配置demo"中,我们将探讨如何在Spring Boot项目中集成Druid数据源,以及如何配置SQL监控和Spring的监控功能。 首先,让我们了解Druid数据源的核心特性: 1. **高...

    后端框架:Spring Boot性能优化与监控详解

    内容概要:本文详细介绍了Spring Boot应用的性能优化与监控策略,涵盖启动时间、内存使用、数据库访问、网络I/O等多个层面。主要内容包括减少依赖、懒加载、配置优化、数据库连接池调优、异步编程、缓存策略、微服务...

    Spring Boot 做性能监控的方法.docx

    Spring Boot的性能监控主要借助于其提供的actuator模块,该模块设计目的是为了简化微服务的监控和管理...通过与JConsole、Spring Boot Admin等工具的结合,可以实现全面、直观的性能监控,提升微服务的稳定性和可靠性。

    druid示例(spring监控,数据库监控,web监控)

    在Spring框架中,Druid可以被用来作为数据源,提供高效的数据库连接管理和性能监控。 首先,Druid的核心功能是作为数据库连接池。在Java Web应用中,频繁的数据库操作会导致频繁创建和关闭数据库连接,这会消耗大量...

    Spring MVC Interceptor 实现性能监控的功能代码

    在本场景中,我们使用Interceptor来实现性能监控功能,以追踪每个URL的执行时间。 `PerformanceInterceptor` 类实现了 `HandlerInterceptor` 接口,该接口定义了三个方法:`preHandle`、`postHandle` 和 `...

    springAop与spring定时器

    Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,通过在程序运行时动态地将代码插入到方法调用中,来实现跨切面的关注点,如日志记录、性能监控、事务管理等。而Spring...

    cat性能监控demo资源

    在IT行业中,性能监控是确保系统稳定性和效率的...综上所述,"cat性能监控demo资源"将帮助开发者理解如何在Spring MVC环境中使用Cat进行性能监控,通过实践案例学习Cat的功能和使用技巧,从而提升系统的稳定性与效率。

    Spring AOP实现机制

    - **性能监控**:记录方法执行时间,分析系统性能瓶颈。 ### 6. 性能对比 JDK动态代理由于基于接口,对非接口类无法处理,而CGLIB则无此限制,但CGLIB的性能相对较低。在实际应用中,应根据具体需求和性能要求选择...

    Java性能监控的瑞士军刀:New Relic在Spring Boot与Vue.js集成中的应用

    New Relic是一个强大的应用性能管理(APM)工具,它可以帮助开发者监控、诊断和优化Java应用程序的性能。本文将详细介绍New Relic的核心功能,如何在Spring Boot中配置New Relic,以及如何与Vue.js前端集成。 通过使用...

    Spring实现增删改查

    在这个“Spring实现增删改查”的项目中,我们将深入探讨如何利用Spring框架来实现数据库操作的基础功能。 1. **依赖注入(DI)**:在Spring框架中,DI是一种设计模式,它允许对象之间的关系在运行时被外部容器管理...

    JavaEE spring半自动实现AOP代理

    其中,AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者定义“切面”,这些切面可以封装横切关注点,如日志记录、事务管理、性能监控等。本篇将深入探讨如何在Spring中半...

    spring Batch实现数据库大数据量读写

    在 `springBatchDemo` 文件中,通常包含了示例代码,演示如何配置和运行一个简单的Spring Batch作业,涉及到读取数据库中的数据,进行处理,然后写回到数据库。你可以参考这些代码,理解Spring Batch的工作原理和...

    基于Spring的隧道监控管理系统的设计与实现

    ### 基于Spring的隧道监控管理系统的设计与实现 #### 技术选型与系统架构 本项目采用了Spring Cloud作为微服务架构的基础框架,并利用Spring Boot简化了开发过程中的配置和依赖管理。为了保证数据的一致性和持久性...

    初探spring aop内部实现 java

    AOP的核心思想是“切面”,它封装了特定的关注点,如日志记录、事务管理、性能监控等。在Spring中,切面是通过定义通知(advises)来实现的,这些通知定义了在何时何地执行特定的行为。Spring支持四种通知类型:前置...

    spring boot admin demo 源码 java 服务器 监控

    6. **实际应用**:在生产环境中,Spring Boot Admin 可以帮助团队监控多个分布式系统的运行状况,及时发现性能瓶颈或异常,提升运维效率。 7. **健康检查**:Spring Boot Admin 提供了对应用健康状况的检查,包括...

Global site tag (gtag.js) - Google Analytics