混沌實驗(Chaos Experiments)

resilience 從失敗中*復原*(retry、circuit breaker);這是相反的一面 —— 它*製造*受控的失敗, 並檢查穩態假設是否仍成立。仿照 Chaos Toolkit 生命週期:**之前**驗證穩態、執行**方法**(故障活動)、 **之後**再驗證穩態,然後永遠執行**回滾**(LIFO)。它回傳一份 journal。

探針、故障與回滾皆為呼叫端提供的 callable,且時鐘 / RNG / sleep 可注入,因此實驗在測試中以假物件 具決定性地執行 —— 沒有真正的失敗、沒有真正的睡眠。純標準函式庫(random + time);不匯入 PySide6

無頭 API

from je_auto_control import (
    ChaosExperiment, Probe, run_experiment, latency_fault)

experiment = ChaosExperiment(
    title="checkout survives slow payments",
    probes=[Probe("service_up", check_health, tolerance=True),
            Probe("p95_latency", measure_p95, tolerance=[0, 500])],
    method=[latency_fault("payment_delay", delay_s=2.0, rate=0.5)],
    rollbacks=[restore_network])

journal = run_experiment(experiment)
if journal["deviated"]:
    print("假設在故障下被打破:", journal["status"])

Probe 回傳一個值,並以其 tolerance``(字面值、``[low, high] 範圍,或述詞 callable)檢查。 run_experiment 先驗證假設 —— 若失敗,狀態為 failed-before-method 且方法不會執行 —— 接著 套用每個故障、再次驗證(若不再成立則設定 deviated 與狀態 deviated),並在 finally 中 永遠以 LIFO 執行回滾。探針/故障/回滾的錯誤會被捕捉並記錄在 journal,而非讓執行崩潰。 latency_faultexception_fault 是現成的故障工廠,具可注入的 RNG(rate)與 sleep。

執行器命令

AC_run_chaos 接受一份 spec``(物件或 JSON 字串),其探針、方法與回滾皆為**動作清單** —— ``{title, probes:[{name, action:[AC...]}], method:[{name, action:[AC...]}], rollbacks:[[AC...]]} —— 並回傳 journal。當探針的動作執行而無錯誤時,其穩態即成立。同一操作亦以 MCP 工具 ac_run_chaos 以及 Script Builder 中 Flow 分類下的命令提供。