Chaos toolkit执行os.rename未重命名原文件,实验结果不符合预期求助
问题根因与解决方案
根因分析
- 服务后台
update_file线程每秒会以w模式打开./example.dat写入时间,w模式的特性是目标文件不存在时会自动创建新文件。混沌实验执行rename操作将原文件重命名为./example.dat.old后,最多1秒,update_file线程下一次写入时就会自动在原路径新建一个空的./example.dat,你看到的原路径文件已经不是重命名前的原始文件,才会产生「未执行重命名反而新建目标文件」的错觉。 - 稳态假设配置不符合预期。你当前的probe容忍值设置为
[200,503],无论服务是否能正常读取文件,只要返回这两个状态码都会被判定为符合稳态,因此实验直接返回成功。同时你的服务读取文件时没有捕获异常,文件不存在时会直接抛出未处理异常,默认返回500状态码,也不符合你预期的503判定逻辑。 - 服务代码存在基础笔误,使用了
datetime.now()但未导入datetime模块,运行时会直接报错。
修复步骤
- 先修复服务代码基础问题,头部补充导入依赖:
import datetime import os
- 给服务接口加异常捕获,符合预期的错误返回逻辑:
def simple_app(environ, start_response): """A simple WSGI application. This application just writes the current time to the response. """ try: with open(EXAMPLE_FILE, 'r') as f: content = f.read().encode('utf-8') status = '200 OK' headers = [('Content-type', 'text/plain; charset=utf-8')] start_response(status, headers) return [content] except FileNotFoundError: status = '503 Service Unavailable' headers = [('Content-type', 'text/plain; charset=utf-8')] start_response(status, headers) return [b'example.dat not found']
- 调整文件更新线程逻辑,避免自动重建被删除的测试文件:
def update_file(): """Write the current time to the file every second.""" print('Updating file...') while True: # 仅文件存在时更新,不存在时不自动创建 if os.path.exists(EXAMPLE_FILE): with open(EXAMPLE_FILE, 'w') as f: f.write(datetime.now().isoformat()) time.sleep(1)
- 修正混沌实验的稳态假设配置,将
steady-state-hypothesis下probe的tolerance改为仅接受正常状态码200:
"tolerance": [200]
修改后稳态假设的逻辑就符合预期:正常状态下服务返回200,实验删除文件后如果返回非200状态码,说明稳态被打破,验证了文件丢失会影响服务可用性。
5. 可选配置:在实验配置中增加回滚动作,实验结束后自动将重命名的文件恢复,避免手动重置测试环境。
内容的提问来源于stack exchange,提问作者evanstjabadi
相关产品推荐
相关产品推荐

