You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模块,运行时会直接报错。

修复步骤

  1. 先修复服务代码基础问题,头部补充导入依赖:
import datetime
import os
  1. 给服务接口加异常捕获,符合预期的错误返回逻辑:
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']
  1. 调整文件更新线程逻辑,避免自动重建被删除的测试文件:
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)
  1. 修正混沌实验的稳态假设配置,将steady-state-hypothesis下probe的tolerance改为仅接受正常状态码200:
"tolerance": [200]

修改后稳态假设的逻辑就符合预期:正常状态下服务返回200,实验删除文件后如果返回非200状态码,说明稳态被打破,验证了文件丢失会影响服务可用性。
5. 可选配置:在实验配置中增加回滚动作,实验结束后自动将重命名的文件恢复,避免手动重置测试环境。

内容的提问来源于stack exchange,提问作者evanstjabadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:06:05