1 . 简单的利用stopWatch对系统方法做监控 .
public static void main(String args[]){ StopWatch stopWatch = new Log4JStopWatch("getMessage()"); new Perf4jStep().getMessage(10000, 1) ; stopWatch.stop(); }
通过上面代码,可以在日志文件中看到
2011-07-29 14:41:55,498 INFO perf4j.TimingLogger - start[1311921714859] time[639] tag[getMessage()]
其中tag[getMessage()]表明监控的方法名 , start[1311921714859]表示执行该方法的开始时间, time[639]表示执行该方法的消耗时间 。这样就能实现一个简单的性能数据采样了 。当然,我并没有采用该方式,因为对系统代码有比较强的侵入性, 必须在每个业务方法内写入类似的代码。 于是 ,我查了下perf4j的官网,找到了更方便好用的第二种途径
2. 利用自带的annonation 结合aop实现对方法的监控
首先对待监控的方法打上@Profiled的标注
@Profiled(tag = "getMessage") public Object getMessage(int n , int sw){ do biz ...
然后,把系统的aop 打开
<!-- 使用annotation定义Asepct --> <aop:aspectj-autoproxy proxy-target-class="true" /> <!-- 配置执行perf4j的Aspect --> <bean id="timingAspect" class="org.perf4j.log4j.aop.TimingAspect" />
最后在log4j的配置文件中定义perf4j的appender 和logger
<logger name="org.perf4j.TimingLogger" additivity="false"> <level value="INFO"/> <appender-ref ref="perf4jFileAppender"/> </logger>
<appender name="perf4jFileAppender" class="org.apache.log4j.FileAppender"> <param name="File" value="logs/perfStats.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p %c{2} - %m%n"/> </layout> </appender>
这样在getMessage方法在被调用时 ,将能够在日志中查到对应的响应时间信息,格式跟第一种方式的类似 。 看到这里, 肯定会有人要问, 这跟我通过切面对要监控的方法做System.currentTimeMillis() 有什么区别吗 ?其实 ,之所以使用perf4j还因为它强大的报表功能 。
1. 它能够通过自身的logPaser对日志做分析,并形成报表, 在命令行输入
java -jar perf4j-0.9.13.jar perfStats.log (默认是以30秒为时间片对日志做分析)那么 ,将会格式化成如下报表
Performance Statistics 20:32:00 - 20:32:30 Tag Avg(ms) Min Max Std Dev Count getMessage 249.4 2 487 151.3 37 Performance Statistics 20:32:30 - 20:33:00 Tag Avg(ms) Min Max Std Dev Count getMessage 120 4 556 151.3 43
另外, perf4j 也能够通过配置类似CoalescingStatistics 的appender来自动解析日志并形成报表(即通过跟log4j的整合, 不需要手工运行生成报表命令,自动形成报表) 。可以注意下 CoalescingStatistics, JmxAttributeStatisticsAppender, GraphingStatisticsAppender 这三个元素 ,可以通过他们可以有很多扩展的功能可以使用(包括tps 报表)
另外, 注意下 。 数据采样如果在线上当日常日志来处理的话, 担心对性能造成一定的影响。 所以 ,将会通过jmx 的形式来控制perf4j的开关。 举个例子 ,当我需要采样时 ,通过jmx 修改perf4j 的logger 的日志级别来达到 。特别指出 , 在JmxAttributeStatisticsAppender中perf4j是支持设置阙值的, 可以设定阙值来决定是否对jmx发送数据。