Profiler摘要日志框架

目的

打印系统的性能分析日志,用于分析系统性能

 

一.maven依赖

 

<dependency>
        <groupId>com.duowan.common</groupId>
        <artifactId>duowan-common-log</artifactId>
        <version>1.0.5</version>
</dependency>
<dependency>
        <groupId>com.duowan.common</groupId>
        <artifactId>duowan-common-util</artifactId>
        <version>1.0.8</version>
</dependency>

 

二.配置

 

1.web.xml filter配置

拦截需要性能分析的URL,被拦截的方法启动子任务分析:start(requestURI),release()

        <!-- Profiler性能分析Filter -->
        <filter>
                <filter-name>ProfilerLoggerFilter</filter-name>
                <filter-class>com.duowan.common.log.filter.ProfilerLoggerFilter</filter-class>
        </filter>
        <filter-mapping>
                <filter-name>ProfilerLoggerFilter</filter-name>
                <url-pattern>*.do</url-pattern>
        </filter-mapping>

 顺德

2.spring方法拦截器配置

拦截需要性能分析的方法及类,被拦截的方法启动子任务分析:enter(),release()

        <bean id="profiledAnnotationPointcutAdvisor" class="com.duowan.common.log.aop.ProfiledAnnotationPointcutAdvisor"/>
        
        <!-- 拦截有@Profiled标注的类或者方法 -->
        <bean id="bean" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
                <property name="proxyTargetClass" value="true"/>
                <property name="interceptorNames">
                        <value>profiledAnnotationPointcutAdvisor</value>
                </property>
                <property name="beanNames">
                        <list>
                                <value>userGameServerDao</value>
                                <value>userGameServerService</value>
                        </list>
                </property>
        </bean>

 

三.日志打印结果

 

1. 日志打印位置

 

# DWPROJECTNO是环境变量中的配置,profilerLogDir整个配置可以通过System.properties覆盖
profilerLogDir=/data2/log/${DWPROJECTNO}/

 

2. digest-profiler.log

 

#动作时间,耗时(单位毫秒),动作ID,成功标志(Y为成功,其它为错误),循环执行次数(loopCount),方法执行结果(resultSize),clientIp
2012-10-16 00:06:20.586,0,UserGameServerBatchCallback|userDataBatchUpdater.init|saveUserGameServerList,Y,1,0,
2012-10-16 00:06:20.591,0,UserGameServerBatchCallback|userDataBatchUpdater.init|saveUserGameServerList,Y,1,0,
2012-10-16 00:06:20.613,0,UserGameServerBatchCallback|userDataBatchUpdater.init|saveUserGameServerList,Y,10,0,
2012-10-16 00:06:20.63,1,UserGameServerBatchCallback|userDataBatchUpdater.init|saveUserGameServerList,Y,13,0,
2012-10-16 00:06:20.642,0,UserGameServerBatchCallback|userDataBatchUpdater.init|saveUserGameServerList,Y,2,0,
2012-10-16 00:06:20.659,1,UserGameServerBatchCallback|userDataBatchUpdater.init|saveUserGameServerList,Y,16,0,
2012-10-16 00:06:20.696,0,UserGameServerBatchCallback|userDataBatchUpdater.init|saveUserGameServerList,Y,1,0,

 

3. dump-profiler.log

 

[totalCost:25,555ms (selfCost:25,543ms), all:100% start:0ms ] - UserBatchCallback
+---[totalCost:7ms, parent:0%, all:0%, loopCount:10,000, TPS:1,428,571 start:25,543ms ] - userDataBatchUpdater.init
+---[totalCost:4ms, parent:0%, all:0%, loopCount:10,000, TPS:2,500,000 start:25,550ms ] - UserBatchCallback.loopProcessVisitable
`---[totalCost:1ms, parent:0%, all:0%, loopCount:7,691, TPS:7,691,000 start:25,554ms ] - UserBatchCallback.flush

字段含义

  • totalCost: 当前任务总耗时
  • selfCost: 当前耗时,将子任务耗时拿开
  • parent: 在父任务中所占的耗时比重
  • all: 在整个任务中所占的耗时比重
  • start: 任务开始至现在的开始时间
  • loopCount: 循环变量,用于计算TPS(每秒事务处理量Transaction Per Second)
  • TPS: 每秒事务处理量Transaction Per Second
  • resultSize: 方法执行的结果集大小

 上海

四. API使用

 

1.最简使用

 

切换行号显示
   1 import com.duowan.common.util.Profiler;
   2 
   3 @Test
   4 public void test_simple_loop() {
   5         int loopCount = 1000000000;
   6         Profiler.start("test_simple_loop",loopCount); //开始计时
   7         for(int i = 0; i < loopCount; i++) {
   8                 int a = i * 100;
   9         }
  10         Profiler.release(); //结束计时
  11         
  12         Profiler.printDump(); //打印日志至控制台
  13 }

Profiler.printDump();打印结果

[totalCost:1,750ms, all:100%, loopCount:1,000,000,000, TPS:571,428,571 start:0ms ] - test_simple_loop

 

2. 子任务的性能分析

 

切换行号显示
   1 @Test
   2 public void test_loop() {
   3         int loopCount = 1000000000;
   4         Profiler.start("test_loop_a*100",loopCount); //开始计时
   5         for(int i = 0; i < loopCount; i++) {
   6                 int a = i * 100;
   7         }
   8         
   9         testThrowException();   //调用子任务 
  10         
  11         Profiler.release(); //结束计时
  12         
  13         Profiler.printDump(); //打印日志至控制台
  14         
  15 }
  16 
  17 private void testThrowException() {
  18         int loopCount = 1000000;
  19         Profiler.enter("test_throw_exception",loopCount);  //进入:子任务计时,如果没有Profiler.start() 该方法将不执行计时操作,不会耗费性能
  20         for(int i = 0; i < loopCount; i++) {
  21                 try {
  22                         throw new RuntimeException();
  23                 }catch(Exception e){
  24                 }
  25         }
  26         Profiler.release(); //结束:子任务计时
  27 }

Profiler.printDump();打印结果

[totalCost:4,079ms (selfCost:1,422ms), all:100%, loopCount:1,000,000,000, TPS:703,234,880 start:0ms ] - test_loop_a*100
`---[totalCost:2,657ms, parent:65.1%, all:65.1%, loopCount:1,000,000, TPS:376,364 start:1,422ms ] - test_throw_exception

 

日志打印API

ProfilerLogger.infoDigestLogAndDump();打印结果 通过这个打印可以打印在日志文件中: digest-profiler.log, dump-profiler.log

2012-10-16 00:06:20.586,4079,test_loop_a*100,Y,0,0,
20

转载于:https://www.cnblogs.com/fpqqchao/archive/2013/01/09/2852948.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值