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, 事故管理, 代码推理, 偏差过滤, 决策支持, 可观测性, 开源项目, 强化学习环境, 指标监控, 故障排查, 无后门, 根因分析, 混沌工程, 生产环境模拟, 站点可靠性工程, 系统稳定性, 训练环境, 请求拦截, 运维自动化, 逆向工具, 配置错误