设为首页 加入收藏

TOP

JaCoCo助您毁灭线上僵尸代码(一)
2023-08-26 21:11:07 】 浏览:39
Tags:JaCoCo

一. 现状·问题

随着需求不断迭代,业务系统的业务代码突飞猛进,在你自豪于自己的代码量产出很高时,有没有回头看看线上真正的客户使用又有多少呢?

费事费力耗费大量人力成本上线的功能,可能一年没人使用,如果不进行适当的下线,就会增加系统维护成本,此时就需要计划删除无用代码。但是我们怎么知道真实线上的一行行代码层面,是否真实在使用,或者真实没人用,怎么可以放心删除下线功能呢!

二. 分析原因

实际上多数业务系统都会存在这个通病:线上僵尸代码

  • 可能是前期产品对业务场景没有分析到位
  • 可能是研发期间需求功能偏离了正确方向
  • 可能是上线后因外界因素使客户业务量下降
  • ······

三. 采取措施

问产品经理哪些能下线?NO 没人敢承诺

观测 UMP接口是否有流量?NO 只知道接口维度,有流量的接口难道所有代码都有用么

使用jacoco(Java Code Coverage)进行线上代码分析,对系统做瘦身。

Jacoco本质上是一个测试覆盖率工具,通过ASM字节码增强技术在源代码中加入探针从而获取代码覆盖率。Jacoco主要是通过Jave agent在main函数执行之前通过指定方法在执行的代码中加入探针来记录代码是否被执行过。

Java agent是Java提供的一个启动参数,有别于代理方式的动态增强和annotation processor的编译时增强,该参数通过指定路径的jar包中的premain方法将在main方法执行之前被调用增强源代码,通过实现该方法我们可以对加载的Class文件进行修改源代码增强,使用此技术的还有大部分APM工具。

https://www.jacoco.org/jacoco/trunk/doc/index.html

四. 实践步骤

4.1 依赖jacoco.ant

在工程内的pom中引入jar依赖

<dependency>
    <groupId>org.jacoco</groupId>
    <artifactId>org.jacoco.ant</artifactId>
    <version>0.8.3</version>
</dependency>
<dependency>
     <groupId>org.apache.ant</groupId>
     <artifactId>ant</artifactId>
     <version>1.9.9</version>
 </dependency>



4.2 赋能Rest请求

添加一个url地址,通过ant执行dump task用于Dump Coverage文件,避免使用配置文件且同时需要运维同事帮忙操作的问题。

@RestController
@RequestMapping("/coverage")
public class CoverageController {

    @PostMapping("dump")
    @NoCheckMenuPermission
    public Result<Boolean> dumpCoverageFile() {
        DumpTask dumpTask = new DumpTask();
        // dump文件地址
        dumpTask.setDestfile(new File("/export/Data/coverage/code-cover.exec"));
        // 多次dump追加形式
        dumpTask.setAppend(true);
        // 选一个空闲接口即可
        dumpTask.setPort(8840);
        // 默认本机
        dumpTask.setAddress("127.0.0.1");
        dumpTask.execute();
        return Result.succeed(true);
    }
}



4.3 嵌入jacocoagent

由于jacoco需要在服务端由jacocoagent增强的jar包,为了避免需要麻烦运维同事,通过maven依赖我们可以发现org.jacoco.agent这个jar包中包含由jacocoagent这个包,所以通过在部署的启动脚本添加以下命令即可通过解压的方式获得该jar包!

java启动参数添加如下:存在多个javaagent时比如pfinder之类在其后添加即可。

#decompress file 解压依赖,获得jacocoagent.jar包,避免需要联系运维上传包
jar -xvf $BASEDIR/lib/org.jacoco.agent-0.8.3.jar



-javaagent:$BASEDIR/bin/jacocoagent.jar=includes=com.jdwl.*,output=tcpserver,port=8840,address=127.0.0.1 -Xverify:none



premain方法中我们可以通过Instrumention的addTransformer添加ClassFileTransformer接口的实现类,该接口中仅有一个方法如下,通过实现ClassTransformer我们可以定义自己的代码增强方法。可以使用ASM,亦可以使用javasist等高级类库。

相关实践:Diving Into Bytecode Manipulation: Creating an Audit Log With ASM and Javassist | New Reli

4.4 JDOS资源预留

资源预留/export目录自定义处理

  • 增加配置脚本 /home/admin/clean_export.sh(脚本默认内容上增加了 && $9 != "coverage"

输出的文件路径为/export/Data/coverage/code-cover.exec

#! /bin/bash

ls -lh /export | awk 'NR >1 {print}' | awk '{if ($9 != "Data") print $9}' | xargs -i /bin/rm -rf /export/{} > /dev/null 2>&1
ls -lh /export/Data | awk 'NR >1 {print}' | awk '{if ($9 != "jdos.jd.com" && $9 != "coverage") print $9}' | xargs -i /bin/rm -rf /export/Data/{} > /dev/null 2>&1



4.5 下载cover文件

/export/Data/coverage/code-cover.exec

登录堡垒机终端

 cd /export/Data/coverage

jdos下载文件

 curl -s up.bastion.jd.com/file/up | bash

4.6

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇你们的优雅停机真的优雅吗? 下一篇再见,Navicat!阿里推出一款数据..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目