ChaosBlade 是阿里开源的混沌工程品牌,包含 chaosblade 工具和 chaosblade-box 平台等项目。ChaosBlade 按照混沌工程的思想,将故障抽象成了一个个实验,并按照科学实验的方法对其过程进行组织。chaosblade 工具支持了大量的故障场景和丰富的命令参数,能够很方便地对常见故障场景进行实验
参考:
https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/blade-create
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
tar -zxvf chaosblade-1.2.0-linux-amd64.tar.gz && rm chaosblade-1.2.0-linux-amd64.tar.gz
alias blade="/xxxx/chaosblade-1.2.0/blade"
可以参考 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,之后会用于实验卸载
--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
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
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 实验结束后,需要卸载之前加载到目标进程上的 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"
}
]
}
blade r 5ee14b7d18d895fd