真要搞混沌实验得用chaostoolkit或chaos-mesh;chaospy是不确定性量化工具,与混沌工程无关。

实验前必须确认 chaospy 不是你要用的库
Python 里叫 chaospy 的包是概率分布和不确定性量化工具,跟混沌工程完全无关——它不注入故障、不操作进程、不干扰网络。真要搞混沌实验,得用 chaos-mesh(K8s 原生)或 chaostoolkit(通用框架),前者需 Kubernetes 环境,后者靠插件驱动,本地 Python 服务也能跑。
常见错误现象:pip install chaospy && import chaospy 后发现根本找不到 start_experiment 或 kill_process 这类函数;或者文档里全是 PolynomialChaosExpansion,跟“杀掉 Redis 实例”毫无关系。
- 使用场景:你手头是 Flask/FastAPI 服务,想模拟数据库超时、HTTP 调用失败、CPU 打满等真实扰动
- 推荐起步路径:先装
chaostoolkit(pip install chaostoolkit),再选一个执行器插件,比如chaostoolkit-python(本地代码注入)、chaostoolkit-kubernetes(容器环境) - 注意兼容性:
chaostoolkit本身不直接操作系统,所有动作靠插件实现;没装对应插件时,chaos run xxx.json会报错Unknown activity type: 'python'
chaostoolkit 实验定义里最常写错的三个字段
实验用 JSON/YAML 描述,但三个字段稍有偏差就导致实验静默失败或行为错乱:
-
type必须是action或probe,写成attack或fault就被忽略(无报错,只是跳过) -
provider.type决定执行方式:填python表示调本地函数,填process表示起子进程,填错成shell或漏写,chaos run会卡住或返回空结果 -
provider.module和provider.func必须指向可导入的 Python 模块路径,比如mylib.network+induce_latency;路径错一位、函数不存在、没加__init__.py,都会抛ModuleNotFoundError且堆栈藏在 debug 日志里(默认不显示)
本地 Python 服务注入故障时,chaostoolkit-python 的限制很实在
它不能热修改正在运行的进程内存,也不能拦截已建立的 socket 连接——它只做一件事:在指定时间点,调用你写的 Python 函数。
立即学习“Python免费学习笔记(深入)”;
主要特性: 1、支持多种语言 BEES支持多种语言,后台添加自动生成,可为每种语言分配网站风格。 2、功能强大灵活 BEES除内置的文章、产品等模型外,还可以自定义生成其它模型,满足不同的需求 3、自定义表单系统 BEES可自定义表单系统,后台按需要生成,将生成的标签加到模板中便可使用。 4、模板制作方便 采用MVC设计模式实现了程序与模板完全分离,分别适合美工和程序员使用。 5、用户体验好 前台
所以别指望它“自动让 requests.get() 随机超时”,你得自己写个封装函数,比如:
def fail_http_call(duration: float = 5.0):
import time
time.sleep(duration) # 模拟阻塞
raise Exception("simulated network failure")
然后在实验文件里引用它。这意味着:
- 所有故障逻辑必须提前编码,无法对第三方库黑盒打补丁
- 若想影响某个特定 HTTP 请求,得在业务代码里把调用点改成可插拔接口(比如通过配置切换正常函数 / 故障函数)
- 性能影响:每次故障注入都是一次新 Python 函数调用,开销小,但不适合毫秒级高频扰动(如每 10ms 切一次 DB 连接状态)
生产环境跑混沌实验前,chaos run 必须加 --dry 和 --no-validation 之外的检查项
--dry 只验证语法,--no-validation 关闭拓扑检查——但真正上线前还得手动盯三件事:
- 确认
provider.secrets里所有密钥变量(如kubeconfig_path)在目标机器上真实存在且可读,否则 K8s 插件会在执行中段静默退出 - 检查
tolerance字段是否合理:比如 probe 返回{"status": "ok"},但 tolerance 写成200(期待 HTTP 状态码),就会误判为失败 - 所有
rollbacks动作必须幂等:重复执行不能引发新问题,例如 “删临时文件” 操作得加if os.path.exists(...),否则第二次回滚可能报错中断
最容易被忽略的是 rollback 的执行时机——它只在实验主流程出错或被中断时触发,正常结束不会跑。如果故障本身需要清理(比如开了监听端口),得把清理逻辑写进 action 的 pauses.after 或单独设 cleanup probe。









