51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

业务代码故障注入指南,测试必看!

混沌测试代码注入是一种通过向业务代码中注入故障或异常来测试系统稳定性和可靠性的方法 。‌通过模拟实际运行环境中可能出现的各种异常情况,‌如网络延迟、‌服务器负载过高、‌数据不一致等,‌来检验系统的应对能力和恢复速度。‌借此,‌可以有效地发现和解决系统中的潜在问题,‌提高系统的健壮性和可靠性。‌


混沌测试代码注入的实现通常依赖于专门的混沌测试工具,‌如ChaosBlade等。本期文章便带大家了解如何使用ChaosBlade实现业务代码故障注入,提升测试效率~














ChaosBlade简介













ChaosBlade是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具,旨在帮助企业提升分布式系统的容错能力 ,并在企业上云或向云原生系统迁移过程中保障业务连续性

ChaosBlade支持多种故障注入实例,包括但不限于:

  • CPU满载:通过ChaosBlade可以模拟CPU负载高的场景,以测试系统在资源紧张情况下的表现。

  • 内存负载:模拟内存压力,测试系统在高内存负载下的稳定性和性能。

  • 磁盘IO压力:模拟磁盘读写压力,以评估系统在面对磁盘IO瓶颈时的表现。

  • 网络负载:包括网络延迟、丢包等场景,模拟网络故障对系统的影响。

  • JVM故障:针对Java应用,ChaosBlade可以指定类和方法,注入延迟、修改返回值、抛出异常等,以模拟JVM层面的故障。

ChaosBlade可以有效模拟故障类型,帮助开发者和运维人员了解系统的稳定性和容错能力,并促进系统的优化和改进,同时,其丰富的故障模拟类型、灵活的实验定义和实时监控功能,以及简单易用的特点,使得ChaosBlade成为可靠性测试的重要工具。

本文介绍的是ChaosBlade的代码注入,属于JVM故障注入范畴。



代码注入原理













ChaosBlade使用的是阿里自研的Jvm-sandbox,本质上是通过修改字节码来实现故障注入。下面,我们先简单了解下Java的基础知识,便于理解ChaosBlade是如何实现业务代码注入的。

Java程序从编写到执行,大致经历以下步骤:

1、编写文本源代码(.Java结尾文件)。

2、通过编译,Java源代码被编译成字节码(Bytecode)。编译过程由Java编译器完成,生成的字节码文件以.class扩展名保存。此时这些代码就可以被JVM解释了。

3、即时编译(Just-In-Time Compilation,JIT):在运行时,JVM可以使用JIT编译器将字节码转换为本机机器码。这个过程是动态的,针对特定的硬件和操作系统进行优化。



总结来说,Java程序通过JVM运行,JIT编译器将字节码转换为本机代码,这使得Java具有跨平台性,因为JVM提供了一个抽象层,使Java程序能够在不同的操作系统和硬件上运行。本机代码生成和执行是在程序运行时动态发生的,以提高性能。



具体实现













Java从1.5开始提供java.lang.instrument包,为检测Java程序提供API,用于监控、收集性能数据、诊断故障等,主要接口有ClassFileTransformer、Instrumentation。


ClassFileTransformer用于实现类文件的字节码级别转换,Instrumentation用于将ClassFileTransformer接口的具体实现注册JVM,以便ClassFileTransformer生效。Instrumentation是在premain()函数中实现,以在Java主程序启动前启动。




实例:RabbitMQ消费者ACK确认信息超时













接下来,我们通过一个实例来了解如何使用ChaosBlade进行业务代码故障注入。


RabbitMQ消息传送和处理路径(来源于稀土掘金技术社区)


我们来模拟RabbitMQ消费者ACK确认消息超时的场景。

首先,我们找到实现RabbitMQ消费者ACK确认消息的类和方法。

选中容器节点,编译源代码(可以用arthas实时编译源代码)。



接着,使用ChaosBlade模拟方法调用,注入90秒延迟故障。


./blade c jvm delay --time 90000 --pid 8 --classname=kd.bos.mq.demo.DemoConsumer --methodname=onMessage

再次查看代码确认是否注入成功,如下图,已成功注入代码。



使用compare进行对比:



最后,进行场景验证。模拟发送demo的消息。



查看堆栈,可以看到ChaosBlade的代码已经成功注入。



并成功得到,RabbitMQ 在设定的超时时间内未接收到消费者的确认,它会认为这个消息可能没有被成功处理,关闭并重启了一个新的consumer通道。



JVM故障被成功注入,并成功发现了RabbitMQ在ACK消息返回超时的情况下,Channel会关闭导致消费者监听掉线的缺陷。



划重点














混沌测试代码注入是一种通过向业务代码中注入故障或异常来测试系统稳定性和可靠性的方法。‌

ChaosBlade 是一款遵循混沌工程原理和混沌实验模型的实验注入工具,可以有效模拟故障类型,帮助开发者和运维人员了解系统的稳定性和容错能力,并促进系统的优化和改进。

ChaosBlade支持多种故障注入实例,包括但不限于:CPU满载、内存负载、网络负载、JVM故障等。



#往期推荐#

JMeter高阶系列---BeanShell脚本精准提取

想知道JMeter的JSON提取器怎么用?看这里!

Jmeter高阶系列--四步教你玩转Java请求

手把手教你打造Jmeter压测可视化监控平台



点个" "和"在看"👇,给小编一点能量~

赞(6)
未经允许不得转载:工具盒子 » 业务代码故障注入指南,测试必看!