欢迎关注 chaosblade 项目,这篇文章将带你快速掌握 chaosblade 工具的使用

下载 chaosblade

获取 chaosblade 最新的 release 包,目前支持的平台是 linux/amd64 和 darwin/64,下载对应平台的包。

下载完成后解压即可,无需编译。

使用 chaosblade

进入解压后的文件夹,可以看到以下内容:

  1. ├── bin
  2. ├── chaos_burncpu
  3. ├── chaos_burnio
  4. ├── chaos_changedns
  5. ├── chaos_delaynetwork
  6. ├── chaos_dropnetwork
  7. ├── chaos_filldisk
  8. ├── chaos_killprocess
  9. ├── chaos_lossnetwork
  10. ├── jvm.spec.yaml
  11. └── tools.jar
  12. ├── blade
  13. └── lib
  14. └── sandbox

其中 blade 是可执行文件,即 chaosblade 工具的 cli,混沌实验执行的工具。执行 ./blade help 可以查看支持命令有哪些:

  1. An easy to use and powerful chaos engineering experiment toolkit
  2. Usage:
  3. blade [command]
  4. Available Commands:
  5. create Create a chaos engineering experiment
  6. destroy Destroy a chaos experiment
  7. help Help about any command
  8. prepare Prepare to experiment
  9. revoke Undo chaos engineering experiment preparation
  10. status Query preparation stage or experiment status
  11. version Print version info
  12. Flags:
  13. -d, --debug Set client to DEBUG mode
  14. -h, --help help for blade
  15. Use "blade [command] --help" for more information about a command.

执行你的第一个混沌实验

我们拿 CPU 满载(CPU 使用率 100%) 演练场景举例(!!注意,在不清楚影响面的情况下,切勿在生产系统机器上执行),执行以下命令实施实验:

  1. ./blade create cpu fullload

执行结果返回:

  1. {"code":200,"success":true,"result":"7c1f7afc281482c8"}

通过 top 命令查看 CPU 使用率

  1. CPU usage: 93.79% user, 6.20% sys, 0.0% idle

此时命令已经生效,停止混沌实验,执行:

  1. ./blade destroy 7c1f7afc281482c8

返回以下结果,表示停止实验成功

  1. {"code":200,"success":true,"result":"command: cpu fullload --debug false --help false"}

再去观察 CPU 情况,CPU 负载已回到正常状态:

  1. CPU usage: 6.36% user, 4.74% sys, 88.88% idle

一次 CPU 满载演练完成。

你的第二个混沌实验

这次实验,我们演练 Dubbo 应用,我们的需求是 consumer 调用 com.alibaba.demo.HelloService 服务下的 hello 接口延迟 3 秒。接下来我们下载所需要的 Dubbo Demo:

dubbo-providerdubbo-consumer

下载完成后,执行以下命令启动应用,注意必须先启动 dubbo-provider,然后再启动 dubbo-consumer:

  1. # 启动 dubbo-provider
  2. nohup java -Djava.net.preferIPv4Stack=true -Dproject.name=dubbo-provider -jar dubbo-provider-1.0-SNAPSHOT.jar > provider.nohup.log 2>&1 &
  3. # 稍等 2 秒,然后启动 dubbo-consumer
  4. nohup java -Dserver.port=8080 -Djava.net.preferIPv4Stack=true -Dproject.name=dubbo-consumer -jar dubbo-consumer-1.0-SNAPSHOT.jar > consumer.nohup.log 2>&1 &

访问 http://localhost:8080/hello?msg=world,返回以下信息,表示启动成功:

  1. {
  2. msg: "Dubbo Service: Hello world"
  3. }

接下来我们要使用 blade 工具进行混沌实验,在执行实验前,我们需要先执行 prepare 命令,挂载所需要的 java agent:

  1. ./blade prepare jvm --process dubbo.consumer

返回以下结果,表示实验准备成功:

  1. {"code":200,"success":true,"result":"e669d57f079a00cc"}

我们开始实施混沌实验,我们的需求是 consumer 调用 com.alibaba.demo.HelloService 服务下的 hello 接口延迟 3 秒。我们执行 ./blade create dubbo delay -h 命令查看 dubbo 调用延迟的命令用法:

  1. Usage:
  2. blade create dubbo delay
  3. Flags:
  4. --appname string The consumer or provider application name
  5. --consumer To tag consumer role experiment.
  6. -h, --help help for delay
  7. --methodname string The method name in service interface
  8. --offset string delay offset for the time
  9. --process string Application process name
  10. --provider To tag provider experiment
  11. --service string The service interface
  12. --time string delay time (required)
  13. --version string the service version
  14. Global Flags:
  15. -d, --debug Set client to DEBUG mode

调用 com.alibaba.demo.HelloService 服务下的 hello 接口延迟 3 秒,我们执行以下命令:

  1. ./blade create dubbo delay --time 3000 --service com.alibaba.demo.HelloService --methodname hello --consumer --process dubbo.consumer

返回以下结果,表示执行成功;访问 http://localhost:8080/hello?msg=world 验证是否延迟 3 秒

  1. {"code":200,"success":true,"result":"ec695fee1e458fc6"}

对实施实验的命令进行解析:

  • —time: 3000,表示延迟 3000 ms;单位是 ms
  • —service: com.alibaba.demo.HelloService, 表示调用的服务
  • —methodname: hello,表示服务接口方法
  • —consumer: 表示演练的是 dubbo consumer
  • —process: dubbo.consumer,表示对哪个应用进程实施混沌实验
    停止当前延迟的混沌实验,再次访问 url 验证是否恢复正常:
  1. ./blade destroy ec695fee1e458fc6

不尽兴的话,我们再实施调用刚才那个服务抛异常,执行 ./blade create dubbo throwCustomException -h 命令查看帮助:

  1. Throw custom exception with --exception option
  2. Usage:
  3. blade create dubbo throwCustomException
  4. Aliases:
  5. throwCustomException, tce
  6. Flags:
  7. --appname string The consumer or provider application name
  8. --consumer To tag consumer role experiment.
  9. --exception string Exception class inherit java.lang.Exception (required)
  10. -h, --help help for throwCustomException
  11. --methodname string The method name in service interface
  12. --process string Application process name
  13. --provider To tag provider experiment
  14. --service string The service interface
  15. --version string the service version
  16. Global Flags:
  17. -d, --debug Set client to DEBUG mode

和刚才延迟命令参数差不多,因为相同的参数是演练 dubbo 所需要的,不同的是没有了 —time,多了个 —exception 参数。我们模拟调用刚才的服务抛 java.lang.Exception 异常:

  1. ./blade create dubbo throwCustomException --exception java.lang.Exception --service com.alibaba.demo.HelloService --methodname hello --consumer --process dubbo.consumer

返回以下结果,访问 http://localhost:8080/hello?msg=world 验证是否异常

  1. {"code":200,"success":true,"result":"09dd96f4c062df69"}

停止此次试验,再次访问请求,验证是否恢复:

  1. ./blade destroy 09dd96f4c062df69

最后,我们撤销刚才的实验准备,即卸载 Java Agent:

  1. ./blade revoke e669d57f079a00cc

如果找不到之前执行 prepare 返回的 UID 的话,执行 ./blade status —type prepare 命令查询:

  1. {
  2. "code": 200,
  3. "success": true,
  4. "result": [
  5. {
  6. "Uid": "e669d57f079a00cc",
  7. "ProgramType": "jvm",
  8. "Process": "dubbo.consumer",
  9. "Port": "59688",
  10. "Status": "Running",
  11. "Error": "",
  12. "CreateTime": "2019-03-29T16:19:37.284579975+08:00",
  13. "UpdateTime": "2019-03-29T17:05:14.183382945+08:00"
  14. }
  15. ]
  16. }

FAQ

如何获取最新版本

chaosblade 每次发布,相关的 changelog 和新版的包都会同步到 RELEASE ,可在此地址下载。

Windows 平台是否有支持计划

暂无支持计划,不过欢迎大家提相关支持的 issue,社区会根据大家的需求来决定是否支持。

执行 blade 命令报错: exec format error 或 cannot execute binary file

是由于 chaosblade 包和运行的平台不兼容造成的,请提 ISSUE来告知我们,issue 中标注下载的 chaosblade 包版本和操作系统版本信息。