在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

easy-trace - 用于跟踪应用中所有方法的执行,可以用于调试,也可以用于收集性能数据 ...

2017-2-7 13:41| 发布者: zhangjf| 查看: 471| 评论: 0

摘要: easy-trace 用于跟踪应用中所有方法的执行,可以用于调试,也可以用于收集性能数据等(需扩展) 原理 通过java.lang.instrument提供的premain拦截Class的字节码, 通过javassist对字节码进行修改,在需要的方法中插 ...
easy-trace

用于跟踪应用中所有方法的执行,可以用于调试,也可以用于收集性能数据等(需扩展)

原理

通过java.lang.instrument提供的premain拦截Class的字节码, 通过javassist对字节码进行修改,在需要的方法中插入trace点。 目前支持的trace点:1、before (static)method execute; 2、after (static)method execute; 3、after constructor execute。 为了尽量减少依赖,该项目只依赖javassist 3.20.0-GA版本,该版本支持java8。

目前主要有三个trace的实现类:

ConsoleTraceRecord:trace信息打印到控制台,默认的方式

FileTraceRecord: trace信息写入到同一个文件,路径为./logs/trace.log

FilePerThreadTraceRecord: 每个线程记录自己的trace信息,路径为./log/trace_{thread_name}.log

使用方式

1、将easy-trace和javassist的包加入的你class path;

2、在源码目录(如src/main/resources)下增加easy-trace.xml文件,并根据你要分析的应用进行配置;

3、启动应用时:java -javaagent:{easy trace jar path}easy-trace-0.0.1-SNAPSHOT.jar -jar {your jar}。

注意:该版本目前主要用来查看执行路径,方便源码分析,如果需要收集性能数据需要进行扩展。

配置文件说明
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <!-- 类和方法的过滤配置 -->
  4. <class-methods>
  5. <!-- 排除的系统类 -->
  6. <exclude-system-class>
  7. </exclude-system-class>
  8. <!-- 包括的系统类,优先级高于exclude-system-class -->
  9. <include-system-class>
  10. </include-system-class>
  11. <!-- 排除的用户类,优先级高于include-user-class -->
  12. <exclude-user-class>
  13. </exclude-user-class>
  14. <!-- 包含的用户类 -->
  15. <include-user-class>
  16. <class-method>
  17. <class-regex>^io/netty/</class-regex>
  18. <!-- 不配置则所有方法都可以 -->
  19. <method-regex></method-regex>
  20. <!-- 不配置表示所有点都关注,半角逗号分隔,可以配置的范围: CONSTRUCTOR,METHOD_BEFORE,METHOD_AFTER,STATIC_BEFORE,STATIC_AFTER -->
  21. <interst>ONSTRUCTOR,METHOD_BEFORE,METHOD_AFTER,STATIC_BEFORE,STATIC_AFTER</interst>
  22. <!-- 可以将生产的class输出到该目录下,用反编译工具查看: 如D:code -->
  23. <wirte-file></wirte-file>
  24. </class-method>
  25. </include-user-class>
  26. </class-methods>
  27. <!-- trace记录类 -->
  28. <trace-records>
  29. <!-- 不配置默认为ConsoleTraceRecord,可以根据情况配置 -->
  30. <record-class>com.yam.trace.core.trace.record.ConsoleTraceRecord</record-class>
  31. <record-class>com.yam.trace.core.trace.record.FileTraceRecord</record-class>
  32. <!-- 第二种配置方式,默认的消息格式化类是StringMessageFormatter -->
  33. <record-class-info>
  34. <record-class>com.yam.trace.core.trace.record.FilePerThreadTraceRecord</record-class>
  35. <message-formatter-class>com.yam.trace.core.formatter.StringMessageFormatter</message-formatter-class>
  36. </record-class-info>
  37. </trace-records>
  38. <message-filters>
  39. <!-- 检测消息的合法性,只能配一项,默认为DefaultMessageCheck -->
  40. <message-check>com.yam.trace.core.intercept.DefaultMessageCheck</message-check>
  41. <!-- 后面的几个配置可以配置多项,内容为正则表达式,exclude优先级高于include -->
  42. <include-thread-name></include-thread-name>
  43. <exclude-thread-name></exclude-thread-name>
  44. <include-message></include-message>
  45. <exclude-message></exclude-message>
  46. </message-filters>
  47. </configuration>
复制代码
输出示例

以下是netty MpscLinkedQueue类的poll方法执行流程:

  1. 2016-01-02 17:10:24.024 nioEventLoopGroup-0-0 ----------------------->begin io.netty.util.internal.MpscLinkedQueue.poll ()Ljava/lang/Object;
  2. 2016-01-02 17:10:24.024 nioEventLoopGroup-0-0 ------------------------->begin io.netty.util.internal.MpscLinkedQueue.peekNode ()Lio/netty/util/internal/MpscLinkedQueueNode;
  3. 2016-01-02 17:10:24.024 nioEventLoopGroup-0-0 --------------------------->begin io.netty.util.internal.MpscLinkedQueue.headRef ()Lio/netty/util/internal/MpscLinkedQueueNode;
  4. 2016-01-02 17:10:24.024 nioEventLoopGroup-0-0 --------------------------->end io.netty.util.internal.MpscLinkedQueue.headRef ()Lio/netty/util/internal/MpscLinkedQueueNode; return io.netty.util.internal.MpscLinkedQueue$DefaultNode
  5. 2016-01-02 17:10:24.024 nioEventLoopGroup-0-0 --------------------------->begin io.netty.util.internal.MpscLinkedQueue$DefaultNode.next ()Lio/netty/util/internal/MpscLinkedQueueNode;
  6. 2016-01-02 17:10:24.024 nioEventLoopGroup-0-0 --------------------------->end io.netty.util.internal.MpscLinkedQueue$DefaultNode.next ()Lio/netty/util/internal/MpscLinkedQueueNode; return null
  7. 2016-01-02 17:10:24.024 nioEventLoopGroup-0-0 --------------------------->begin io.netty.util.internal.MpscLinkedQueue.tailRef ()Lio/netty/util/internal/MpscLinkedQueueNode;
  8. 2016-01-02 17:10:24.024 nioEventLoopGroup-0-0 --------------------------->end io.netty.util.internal.MpscLinkedQueue.tailRef ()Lio/netty/util/internal/MpscLinkedQueueNode; return io.netty.util.internal.MpscLinkedQueue$DefaultNode
  9. 2016-01-02 17:10:24.024 nioEventLoopGroup-0-0 ------------------------->end io.netty.util.internal.MpscLinkedQueue.peekNode ()Lio/netty/util/internal/MpscLinkedQueueNode; return null
  10. 2016-01-02 17:10:24.024 nioEventLoopGroup-0-0 ----------------------->end io.netty.util.internal.MpscLinkedQueue.poll ()Ljava/lang/Object; return null
复制代码


项目地址:
https://github.com/youaremoon/easy-trace

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-9 11:09

Copyright 2015-2025 djqfx

返回顶部