当前位置: 首页 > 工具软件 > ChaosBlade > 使用案例 >

ChaosBlade进行混沌实验操作

潘凯
2023-12-01

ChaosBlade-box 简介

ChaosBlade 是阿里开源的混沌工程品牌,包含 chaosblade 工具和 chaosblade-box 平台等项目。ChaosBlade 按照混沌工程的思想,将故障抽象成了一个个实验,并按照科学实验的方法对其过程进行组织。chaosblade 工具支持了大量的故障场景和丰富的命令参数,能够很方便地对常见故障场景进行实验
参考:
https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/blade-create

(一)配置ChaosBlade

1.下载release文件

curl https://chaosblade.oss-cn-hangzhou.aliyuncs.com/agent/github/1.2.0/chaosblade-1.2.0-linux-amd64.tar.gz -o chaosblade-1.2.0-linux-amd64.tar.gz

2. 解压缩

tar -zxvf chaosblade-1.2.0-linux-amd64.tar.gz && rm chaosblade-1.2.0-linux-amd64.tar.gz

3. 给当前会话新增blade命令,下文都将使用该命令

 alias blade="/xxxx/chaosblade-1.2.0/blade"

(二)JVM 实验室准备

可以参考 https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/blade-prepare-jvm
1.获取服务的进程号:

ps -aux | grep xxx服务名

2.挂载java agent

 -j 参数为服务下的 Java 目录(一般为 /home/work/bin/service-name/java )
--pid 参数为上一步得到的进程号
blade prepare jvm -j /home/work/bin/service-name/java/ --pid 32676
{"code":200,"success":true,"result":"5ee14b7d133333d"}

返回code为200则说明挂载成功,请记录result对应的实验对象id:5ee14b7d133333d,之后会用于实验卸载

挂载成功后,就可以进行实验了。但是一定要注意,所有的实验都结束后,一定要将 agent 卸载掉详见(四) 结束jvm实验。 agent 挂载成功后可以进行任意多次第 1,2, 3, 中描述的实验,各个实验也可以同时进行,但要在卸载 agent 之前将每个创建成功的实验都销毁掉。

(三)注入

1.注入方法延时

--time 为延时时长,单位为毫秒
--classname 为该方法所在的类的
--methodename 为该方法的方法名
--pid 为之前挂载好 agent 的进程号
1) 对一个方法注入8秒的延时
blade create jvm delay --time 8000 --classname=com...类名--methodname=方法名 --pid 32676
{"code":200,"success":true,"result":"d0e4be6ee34eab76"}
返回code为200则说明注入成功
2) 销毁该实验,撤销注入的延时,参数d0e4be6ee34eab76是步骤1)中返回的实验对象Id
blade destroy d0e4be6ee34eab76
{"code":200,"success":true,"result":{"target":"jvm","action":"delay","flags":{"classname":"com...类名","methodname":"方法名","pid":"32676","time":"8000"}}}
返回code为200则说明成功销毁了实验

具体参考:https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/blade-create-jvm/blade-create-jvm-delay

2.修改方法返回值

chaosblade 可直接修改方法的返回为指定值,更多参数见 blade create jvm return
https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/blade-create-jvm/blade-create-jvm-return

1) 修改方法的返回值,将该方法的所有调用返回值都修改为false
方法的返回值类型需要是基本类型,value参数值的类型需要和方法返回值类型相匹配,value可以为null,这种情况下不遵从上述约束
--value 指定方法的固定返回值
blade create jvm return --value false --classname com.xxx.类名 --methodname 方法名--pid 32676
{"code":200,"success":true,"result":"b847f4d9f8f1cb1f"}
2) 销毁该实验
blade d b847f4d9f8f1cb1f

3.抛出自定义异常

blade create jvm throwCustomException 可以让对特定方法的调用直接抛出一个异常
详见:https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/blade-create-jvm/blade-create-jvm-throwcustomexception

1)让一个方法抛出自定义的异常
--exception 参数为要抛出异常的全限定名,必须继承 java.lang.Exception 或java.lang.Exception 本身
--exception-mesage 参数为异常所带的自定义信息
blade create jvm throwCustomException --exception java.lang.Exception --exception-message 自定义异常 --classname com...类名 --methodname 方法名--pid 32676
{"code":200,"success":true,"result":"06fc1ce09c721f90"}
2) 销毁该实验
blade d 06fc1ce09c721f90

(四)结束JVM实验

JVM 实验结束后,需要卸载之前加载到目标进程上的 agent。请在卸载 agent 前确认已将所有实验都撤销完毕,以免影响线上业务。
如果忘了加载 agent 时返回的实验对象 id,可以通过 status 命令查看

blade status --type prepare

{
        "code": 200,
        "success": true,
        "result": [
                {
                        "Uid": "5ee14b7d18d895fd",
                        "ProgramType": "jvm",
                        "Process": "",
                        "Port": "17758",
                        "Pid": "32676",
                        "Status": "Running",
                        "Error": "",
                        "CreateTime": "2021-06-09T15:31:32.449179887+08:00",
                        "UpdateTime": "2021-06-09T15:31:45.729185574+08:00"
                }
          ]
}
  1. 卸载 agent,参数 5ee14b7d18d895fd 为之前 prepare 命令返回的实验对象 Id
blade r 5ee14b7d18d895fd
 类似资料: