学妹前几天微信上问我,说周末她去参加了某互联网大厂的测试分享会,过程中听到【混沌工程】这个词语被多次提到,所以想找我了解下什么是混沌工程。
时下各互联网大厂推崇的DevOps模式下,混沌工程已经被列为测试右移必做的一个专项测试,因此杨叔也想分享本篇文章让更多的同学掌握这项技能。好了,以下开始进入正文:
二、什么是混沌工程
类似于“故障演练”,通过构造各类异常,验证系统在碰到这些异常时是否有做好对应的监控告警、预案处理,针对性地进行加固,防范,从而避免故障发生时所带来的严重后果。通过对各类异常提前做好监控告警和预案处理,增强系统的健壮性,增强分布式系统的信心。
ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具,帮助企业提升分布式系统的容错能力。
代码git地址:https://github.com/chaosblade-io/chaosblade
三、环境搭建
1. 登录容器或linux服务器终端,下载chaosblade安装包。命令:
wget https://chaosblade.oss-cn-hangzhou.aliyuncs.com/agent/github/0.6.0/chaosblade-0.6.0-linux-amd64.tar.gz
2. 解压安装包,输入命令:
tar zxvf chaosblade-0.6.0-linux-amd64.tar.gz
进入解压后的文件夹,即可直接使用工具:
四、测试指导文档
官方文档介绍:https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/
官方说明和示例压缩包,有需要可以下载使用:https://download.csdn.net/download/baidu_28340727/40703659
五、常用命令介绍
1. 挂载 java agent,执行 java 实验场景必要步骤
ps -ef | grep java(或者你应用的名称)
查找到需要测试的应用的pid:
./blade prepare jvm --pid 1
使用上面命令挂载agent,挂载成功会返回200,此时最好记录下result内的UID,取消挂载时会用到这个UID:
取消挂载使用revoke,使用挂载时返回的UID:
./blade revoke 41814dc1ee3df6a1
2. 构造各类常用异常命令
代码中找到需要进行的方法,假设为:com.xxxx.xxxx.web.xxxxController#method1,则下面命令中classname $1的值:com.xxxx.xxxx.web.xxxxController,methodname $2值:method1
操作项 | 命令内容 |
---|---|
JVM超时(controller层http方法超时) | ./blade create jvm delay --time 2000 --classname=$1 --methodname=$2 --pid 1 |
JVM异常(controller层http方法异常) | ./blade create jvm throwCustomException --classname=$1–methodname=$2 --exception java.lang.Exception --pid 1 |
dubbo类超时 | ./blade create dubbo delay --time $1 --service $2 --methodname $3 --consumer --pid 1 |
dubbo类异常 | ./blade create dubbo throwCustomException --exception java.lang.Exception --service $1 --methodname $2 --consumer --pid 1 |
redis超时 | ./blade c jedis delay --time $1 |
redis异常 | ./blade c jedis throwCustomException --exception java.lang.Exception --exception-message “chaosblade mock Error” |
redis线程池打满 | ./blade c jvm throwCustomException --exception java.lang.Exception --classname org.apache.commons.pool2.impl.GenericObjectPool --methodname borrowObject --pid 1 |
Mybatis超时 | ./blade c jvm delay --time $1 --classname org.apache.ibatis.binding.MapperMethod --methodname execute --pid 1 |
Mybatis异常 | ./blade c jvm throwCustomException --exception java.lang.Exception --classname org.apache.ibatis.binding.MapperMethod --methodname execute --pid 1 |
CPU打满 | ./blade create cpu load |
内存打满 | ./blade c mem load --mode ram --mem-percent 100 |
磁盘空间打满 | ./blade c disk fill --percent 100 |
磁盘读写IO打满 | ./blade create disk burn --read --write |
JVM堆内存OOM | ./blade c jvm oom --area HEAP |
3. 销毁异常
异常构造成功会返回200,同时会有UID,取消异常时会使用到这个UID:
销毁异常使用destory,使用创建异常时返回的UID:
./blade destroy 959d6b44f346f61c
4. 查询异常状态
查询还未取消挂载的UID:
./blade status --type prepare
查询还未销毁的UID:
./blade status --type create
running状态的即为还未取消或销毁的UID
五、注意事项
-
创建异常后,可以通过业务现象、日志等方式去验证异常发生后,系统的表现是否符合预期,系统是否有正常触发告警,是否有针对该接口异常做好预案,预案是否生效等。测试完成后,记得销毁异常,避免影响正常业务测试。
-
举例:假设A系统会调B系统dubbo接口,为了验证当B系统dubbo接口超时或挂掉时,A系统是否有正常触发告警,是否有预案处理,则需要在A系统应用容器中,分别构造B系统dubbo接口方法的接口超时、接口异常两类异常,然后做验证。并且此时只是构造的只是调用方:A调B接口的异常,被调用方:B接口本身并不会异常,所以即使其他系统也有调用B的这个dubbo接口,其他系统业务不会因为A系统在做异常测试而受到影响,依然正常工作。
-
各类硬件异常测试,目的在于测试各种硬件异常情况下,验证服务稳定性、监控告警、流量调度、弹性伸缩等能力。