Singhtanuj387/AI-DevOps-Incident-Response-Simulator

GitHub: Singhtanuj387/AI-DevOps-Incident-Response-Simulator

一个符合OpenEnv标准的AI事故响应训练环境,用于模拟生产环境故障并评估AI代理的运维诊断和修复能力。

Stars: 0 | Forks: 0

# DevOps 事故响应模拟器 一个符合 OpenEnv 标准的 AI 环境,用于模拟真实的生产环境故障。AI 代理充当待命 SRE,使用标准的 `step()` / `reset()` / `state()` API 诊断并解决三种难度级别的六种事故类型。 ## 环境描述 该环境提供了生产基础设施事故的真实模拟。每个任务呈现一个正在降级的系统,代理必须: 1. **诊断** 根本原因,使用可观测性工具(`CHECK_LOGS`, `CHECK_METRICS`) 2. **修复** 使用适当的 DevOps 命令(重启、扩容、回滚等) 3. **遵循最佳实践**(设置警报、呼叫待命人员、快速行动) 该模拟包括真实的指标噪声、降级曲线和级联故障条件,反映了现实世界中的 SRE 挑战。这使其在操作推理方面的 AI 代理训练和评估中具有重要价值。 ## 观察空间 每一步返回一个包含以下字段的 `DevOpsObservation`: | 字段 | 类型 | 范围 | 描述 | |-------|------|-------|-------------| | `step` | int | 0–max_steps | 当前步数 | | `task_name` | str | — | 活动任务标识符 | | `cpu_pct` | float | 0–100 | CPU 使用率百分比 | | `memory_pct` | float | 0–100 | 内存使用率百分比 | | `error_rate` | float | 0.0–1.0 | HTTP 错误率 | | `avg_latency_ms` | float | ≥0 | 平均请求延迟(毫秒) | | `active_pods` | int | ≥0 | 正在运行的 Pod 数量 | | `db_conn_active` | int | ≥0 | 活动数据库连接数 | | `db_conn_max` | int | >0 | 连接池上限 | | `cache_hit_rate` | float | 0.0–1.0 | 缓存命中率 | | `active_services` | List[str] | — | 正在运行的服务列表 | | `degraded_services` | List[str] | — | 已降级的服务列表 | | `recent_logs` | List[str] | — | 最后 5 条模拟日志行 | | `incident_active` | bool | — | 事故是否处于活动状态 | | `incident_type` | str | — | 事故类型(任务名称) | | `time_since_incident_start` | int | ≥0 | 事故开始后的计时 | | `hints` | List[str] | — | 渐进式提示(随时间减弱) | ## 动作空间 代理提交文本命令。解析器具有容错性(不区分大小写,支持别名)。 | 命令 | 目标 | 效果 | 适用任务 | |---------|--------|--------|------------------| | `RESTART_POD ` | 服务名称 | 重启 Pod,重置部分指标 | memory_leak, traffic_spike | | `SCALE_UP ` | 服务名称 | 增加副本,分担负载 | traffic_spike, cache_stampede | | `SCALE_DOWN ` | 服务名称 | 移除副本 | memory_leak | | `ROLLBACK ` | 服务名称 | 回滚到上一个部署版本 | bad_deploy | | `KILL_SLOW_QUERY` | — | 终止死锁/慢速 DB 查询 | db_deadlock | | `DRAIN_NODE ` | 节点名称 | 安全地驱逐节点上的 Pod | node_failure | | `CORDON ` | 节点名称 | 阻止新的 Pod 调度 | node_failure | | `CLEAR_CACHE` | — | 清空缓存,触发重新填充 | cache_stampede | | `CHECK_LOGS [service]` | 可选服务 | 返回诊断日志行 | 全部 | | `CHECK_METRICS [service]` | 可选服务 | 返回结构化指标 | 全部 | | `SET_ALERT ` | 指标名称 | 设置警报阈值 | 全部 | | `PAGE_ONCALL` | — | 呼叫待命工程师 | 全部 | | `NOOP` | — | 无操作(等待) | 全部 | ## 奖励函数 ### 单步信号 当指标改善时,每一步都会发出非零奖励信号: - 内存/CPU/错误率降低 → 正向奖励 - 延迟/连接数降低 → 正向奖励 - 缓存命中率提高 → 正向奖励 ### 里程碑奖励(一次性) | 里程碑 | 奖励 | |-----------|-------| | 在任何修复之前执行诊断操作 | +0.05 | | 正确识别服务/组件 | +0.10 | | 应用了标准修复命令 | +0.15 | | 设置了警报 | +0.05 | | 呼叫了待命人员 | +0.03 | ### 惩罚 | 条件 | 惩罚 | |-----------|---------| | 重复相同的失败操作(第 2 次) | -0.05 | | 重复相同的失败操作(第 3 次及以上) | -0.10 | | Episode 失败(终止条件) | -0.20 到 -0.25 | | 目标错误的服务(每次发生) | -0.10 到 -0.15 | ### 速度奖励 `speed_bonus = 0.15 × max(0, 1 - steps_taken / max_steps)` 如果应用了修复,将在 Episode 结束时应用一次。 ## 任务摘要 | 任务 | 难度 | 最大步数 | 标准修复 | 失败条件 | |------|------------|-----------|---------------|-------------------| | `memory_leak` | 简单 | 10 | `RESTART_POD api-server` | memory_pct ≥ 100% (OOM) | | `traffic_spike` | 简单 | 10 | `SCALE_UP api-server` | CPU ≥ 95% 持续 3 个 tick | | `bad_deploy` | 中等 | 12 | `ROLLBACK payments-service` | error_rate ≥ 0.80 | | `db_deadlock` | 中等 | 12 | `KILL_SLOW_QUERY` | 连接池满持续 2 个 tick | | `node_failure` | 困难 | 15 | `DRAIN_NODE node-2` | CPU ≥ 95% 持续 3 个 tick | | `cache_stampede` | 困难 | 15 | `CLEAR_CACHE` + `SCALE_UP database` | 连接池满持续 2 个 tick | ## 设置说明 ### 前置条件 ``` pip install fastapi uvicorn pydantic requests ``` ### 使用 Docker 运行 ``` cd server && docker build -t devops-incident-env . docker run -p 7860:7860 devops-incident-env ``` ### 不使用 Docker 运行 ``` cd server uvicorn main:app --host 0.0.0.0 --port 7860 ``` ### 验证是否正在运行 ``` curl http://localhost:7860/ # → {"name":"devops-incident-env","version":"1.0.0","status":"running",...} ``` ## 运行推理 ``` export HF_TOKEN=your_huggingface_token export DEVOPS_TASK=all python inference.py ``` ### 环境变量 | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `API_BASE_URL` | `https://router.huggingface.co/v1` | LLM API 端点 | | `MODEL_NAME` | `Qwen/Qwen2.5-72B-Instruct` | 要使用的模型 | | `HF_TOKEN` | — | HuggingFace API token | | `ENV_BASE_URL` | `http://localhost:7860` | 环境服务器 URL | | `DEVOPS_TASK` | `memory_leak` | 任务名称或 `all` | ### 输出格式 ``` [START] task=memory_leak env=devops-incident-env model=Qwen/Qwen2.5-72B-Instruct [STEP] step=1 action=CHECK_LOGS api-server reward=0.05 done=False error=null [STEP] step=2 action=RESTART_POD api-server reward=0.39 done=False error=null ... [END] success=True steps=4 score=0.820 rewards=0.05,0.39,0.02,0.36 ``` ## 基准分数 | 任务 | 模型 | 分数 | 步数 | |------|-------|-------|-------| | memory_leak | Qwen2.5-72B-Instruct | 0.XX | X | | traffic_spike | Qwen2.5-72B-Instruct | 0.XX | X | | bad_deploy | Qwen2.5-72B-Instruct | 0.XX | X | | db_deadlock | Qwen2.5-72B-Instruct | 0.XX | X | | node_failure | Qwen2.5-72B-Instruct | 0.XX | X | | cache_stampede | Qwen2.5-72B-Instruct | 0.XX | X | *(运行 `DEVOPS_TASK=all python inference.py` 后填写)* ## 验证 ### 预验证脚本 ``` # 先启动服务器,然后: bash validate-submission.sh ``` ### OpenEnv 验证 ``` openenv validate ``` 预期输出:所有检查通过,0 个错误。 ### 手动端点测试 ``` # 重置 curl -X POST http://localhost:7860/reset \ -H "Content-Type: application/json" \ -d '{"task": "memory_leak"}' # 步骤 curl -X POST http://localhost:7860/step \ -H "Content-Type: application/json" \ -d '{"command": "CHECK_LOGS api-server"}' # 状态 curl http://localhost:7860/state ``` ## 架构 ``` devops-incident-env/ ├── server/ │ ├── Dockerfile # Container image │ ├── main.py # FastAPI: /reset /step /state │ ├── env.py # OpenEnv interface │ ├── models.py # Pydantic types │ ├── simulation.py # Noise, parser, logs, milestones │ ├── tasks/ │ │ ├── __init__.py # Task registry │ │ ├── base.py # Abstract base task │ │ ├── task1_memory_leak.py │ │ ├── task2_traffic_spike.py │ │ ├── task3_bad_deploy.py │ │ ├── task4_db_deadlock.py │ │ ├── task5_node_failure.py │ │ └── task6_cache_stampede.py │ └── requirements.txt ├── inference.py # Baseline LLM agent ├── openenv.yaml # OpenEnv metadata ├── validate-submission.sh # Pre-validation └── README.md ``` ## 许可证 MIT
标签:AI智能体, API集成, CISA项目, DNS解析, Gym, Python, SRE, 事故管理, 代码推理, 偏差过滤, 决策支持, 可观测性, 开源项目, 强化学习环境, 指标监控, 故障排查, 无后门, 根因分析, 混沌工程, 生产环境模拟, 站点可靠性工程, 系统稳定性, 训练环境, 请求拦截, 运维自动化, 逆向工具, 配置错误