# inspire-java-callgraph **Repository Path**: inspiration666/inspire-java-callgraph ## Basic Information - **Project Name**: inspire-java-callgraph - **Description**: 一期:一个打印函数调用栈和函数调用耗时的工具 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-04-13 - **Last Updated**: 2024-06-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # inspire-java-callgraph(ijc) ## 一、打包与部署 > mvn clean package -DskipTests ```cmd java -javaagent:D:\dev_file\Git_file\inspire-java-callgraph\target\ijc-1.0.jar=includes=com.inspire.*;com.cmbc.*;com.tesla.*,excludes=com.inspire.springboot.domain.*,moudleName=springbootDemo,filterMethod=";",timeout=500 -jar springboot222.jar ``` ## 二、配置项使用说明 1. 配置`includes`来查看指定包下的调用堆栈 > ```cmd > -javaagent:D:\dev_file\ijc-1.0.jar=includes=com.openai.*;com.meta.* > ``` 2. 配置`excludes`以过滤实体对象 以过滤实体类为例: > ```cmd > -javaagent:D:\dev_file\ijc-1.0.jar=includes=com.openai.*;com.meta.*,excludes=com.openai.entity.*;com.meta.entity.* > ``` 3. 配置`moudleName`以指定模块名,堆栈文件会生成在以模块名命名的文件夹下 > ```cmd > -javaagent:D:\dev_file\ijc-1.0.jar=includes=com.openai.*;com.meta.*,excludes=com.openai.domain;com.meta.*,moudleName=opai > ``` 4. 配置`filterMethod`以指定所有类的哪些函数不打印函数调用堆栈 以过滤构造函数和静态块为例: > ```cmd > -javaagent:D:\dev_file\ijc-1.0.jar=includes=com.openai.*;com.meta.*,excludes=com.openai.domain;com.meta.*,moudleName=opai,filterMethod=";" > ``` 注意:配置项后面的value值可以带也可以不带双引号,但如果含有特殊字符,如 < 等,则必须带双引号 5. 配置`timeout`标记超时请求,单位ms 比如:标记耗时大于500ms的请求 > ```cmd > java -javaagent:D:\dev_file\Git_file\inspire-java-callgraph\target\ijc-1.0.jar=includes=com.inspire.*;com.cmbc.*;com.tesla.*,excludes=com.inspire.springboot.domain.*,moudleName=springbootDemo,filterMethod=";",timeout=500 -jar springboot222.jar > ``` ## 三、功能说明 1. 动态分析函数调用堆栈,且调用堆栈做了缩进处理,调用关系一目了然 - 打印每次调用堆栈的开始时间 - 打印函数调用耗时 - 打印函数在当前堆栈出现的次数 ![1681994029727](site/images/1681994029727.png) 2. 标记异常调用栈 ![1681994265900](site/images/1681994265900.png) 3. 支持并发请求调用 4. 标记超时请求 比如:超过200ms的请求做标记。配置`timeout=200` ![1682054109168](site/images/1682054109168.png) ## 历史版本 ### 20230413 - 支持打印函数调用栈和耗时 ### 20230414 - 支持并发请求(多线程请求) ### 20230415 - 只展示有用的调用信息,像一些构造、get、set方法可以忽略 > 解决方式:通过代码来过滤构造函数和静态语句块,通过配置excludes来过滤掉实体类所在包 - 处理业务异常时,深度和顺序没有清零的问题 - 分析出异常栈 ### 20230417 - push时增加一个函数id参数(支持多类加载器环境下调用栈的计算) - 一个函数连续被调用计算调用次数(只在第一次出现时打印) ### 20230418 - 重写`getCommonSuperClass`(解决TomcatWebProjJdk8案例中`HelloServlet`类和`EsgResponse`类无法增强问题) - 并发请求测试通过 ### 20230420 - `includes`和`excludes`模式匹配 - 通过配置`moudleName`来区分不同模块的函数调用记录 - 通过配置`filterMethod`以指定所有类的哪些函数不打印调用堆栈 - 记录调用堆栈开始时间 ### 20230421 - 配置`timeout`标记超时请求,单位ms ### 20230424 - 去掉javassist依赖 ## 即将更新 - 父子线程认为其是一个调用栈(ThreadLocalMap) - asm增强并发容器,以支持多线程的标识符传递 - 性能监控(监控每次请求结束性能的变化,也就是监控外层函数) - 打向容器的Api可通过添加Headers来标记请求信息,暂定将做支持的容器列表如下: - tomcat - 测试linux环境各配置项功能支持情况