您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

JaCoCo 助您毁灭线上僵尸代码

时间:2023-08-14 16:07:56  来源:京东云开发者  作者:

一。现状・问题

 

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

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

二。分析原因

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

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

三。采取措施

问产品经理哪些能下线?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 分析代码

打开 idea -> run -> show coverage data 选择对应的 exec 文件即可获取服务端的代码覆盖情况。

绿色覆盖(活跃代码)

红色未覆盖(僵尸代码)

Reference

  1. JaCoCo - Documentatio
  2. javaagent 使用指南 - rickiyang - 博客园 (cnblogs.com
  3. 使用 Jacoco 统计服务端代码覆盖情况实践 - M104 - 博客园 (cnblogs.com
  4. Diving Into Bytecode Manipulation: Creating an Audit Log With ASM and Javassist | New Reli

五。效能提升

5.1 需求交付效率提升

5.1.1 缩短需求交付周期

因为僵尸代码删除,减少开发需求的范围,降低老代码认知成本,降低测试回归成本。

需求交付周期整体呈缩短趋势!2023/1 月落地实践,之前需求交付周期约 15 天,之后约 12 天。

5.1.2 降低开发阶段停留时长

僵尸代码大量存在,研发认知需求改动点负荷很高,需要耗费大量时间成本。

2023/1 月落地后,开发阶段时长缩短到 4 天 以下(由 4.54 缩短至 3.11,缩短约 31%),呈明显缩短趋势!

5.2 人效提升

5.2.1 降低研发认知负荷

删除无用僵尸代码,圈复杂度会大幅度降低,重复代码块也会降低,则研发认知负荷也会随之降低!

平均系统重复代码块数从 31 下降至 27 左右,降低了系统维护成本!

5.2.2 提升人均需求吞吐量

因为减少人力认知成本,缩小需求范围,所以会直接提升需求的吞吐量!

自从 2023/1 月落地实践后,人均需求的吞吐量也大幅度提升,从之前 1.5 提升到 2.5 左右。

5.3 过程质量提升

5.3.1 减少自动化 bug 数

由于存量僵尸代码减少,则整体回滚用例和场景变得精简,黄金流程也不会被僵尸代码干扰,则自动化 bug 数也有明显下降趋势

随着 2023 年 1 月以来的不断实践,自动化发现的 bug 数也逐月递减,从 11 个 / 月 -> 9 个 / 月 -> 6 个 / 月 -> 5 个 / 月。

5.3.2 提升单测覆盖率

自从 2023 年 1 月落地实践后,随着删除掉大量僵尸代码,整体代码总量在减少,无效代码被无情下线,同时提升了单测代码覆盖率,呈上升趋势单测行覆盖率从 51.33% -> 52.28%,提升系统质量!

 

六。简要总结

  • 随着需求不断迭代交付,业务代码必然不断累积,运维成本不断升高,如果线上无用功能的代码一直残留,对研发来说是巨大的累赘!对于此类代码约定俗成为 “僵尸代码”
  • 赶快利用 jacoco 探针深入分析系统的一行行代码,看到线上功能运行最真实的一面,参照代码的覆盖情况,针对性下线和删除僵尸代码,让系统瘦身,让研发减负!
作者:京东物流 周奕儒
来源:京东云开发者社区 自猿其说 Tech


Tags:JaCoCo   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
JaCoCo 助您毁灭线上僵尸代码
一。现状・问题 随着需求不断迭代,业务系统的业务代码突飞猛进,在你自豪于自己的代码量产出很高时,有没有回头看看线上真正的客户使用量又有多少呢?~ 费事费力耗费大量人力成本~...【详细内容】
2023-08-14  Search: JaCoCo  点击:(158)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条