Siddhanthguptaa/Sre_Gym

GitHub: Siddhanthguptaa/Sre_Gym

一个面向生产事故自动化响应的确定性强化学习环境,通过模拟微服务级联故障场景来训练和评测智能体的根因诊断与复盘能力。

Stars: 0 | Forks: 0

## 标题: SRE Gym emoji: "🚨" colorFrom: blue colorTo: green sdk: docker app_port: 8000 pinned: false

🚨 SRE-Gym

一个用于生产事故响应的确定性 RL 环境 — 包含依赖图遍历、级联故障模拟、对抗性干扰项,并且是唯一具备 submit_postmortem 机制且不使用 LLM 评委的 SRE 基准。

## 为什么开发这个项目 每次生产环境故障的结构都如出一辙:一个损坏的服务将性能下降沿着依赖图蔓延,这种级联效应使得每个下游服务看起来都像是根本原因。SRE 的工作不是去重启报警最响的 pod —— 而是遍历依赖图,排除干扰信息,并撰写一份能防止问题再次发生的复盘报告。 现有的 RL 基准测试都没有衡量这一点。大多数基准要么模拟的是孤立的故障,要么使用 LLM 作为评委,这不仅不可复现、成本高昂,还容易被钻空子。SRE-Gym 为你提供: - **真实的 SRE 工作流**:观察 → 调查 → 遍历依赖图 → 诊断根本原因(而非表象) → 修复 → 撰写复盘报告 - **确定性的评分器**:每个分数都可以在微秒级内复现,且无需任何 API 密钥 - **可学习的奖励**:PPO agent 可以获得可量化的提升;该环境被证明是可训练的 ## 多模型排行榜 | Agent | 简单 | 中等 | 困难 | 总体 | |---|:---:|:---:|:---:|:---:| | 🥇 图感知 BFS agent (`agent_graph.py`) | **0.878** | **0.864** | **0.886** | **0.876** | | 🥈 PPO Agent (已训练,30K 步) | 0.643 | — | — | — | | 🤖 gpt-4o-mini | 0.472 | 0.514 | 0.508 | 0.498 | | 🔧 确定性关键词基线 | 0.38 | 0.21 | 0.09 | 0.23 | | 🎲 随机 agent | 0.134 | 0.08 | 0.04 | 0.08 | ## 核心差异化优势 **确定性评分是这里最重要的设计选择。** 大多数 agent 环境严重依赖 LLM 评委。LLM 评委存在以下问题: - 不可复现(相同的输入 → 重新运行得到不同的分数) - 昂贵(每次评估 $0.01–$0.05) - 对 prompt 敏感(改变措辞就会改变得分) - 容易被钻空子(冗长膨胀、模棱两可、堆砌关键词) SRE-Gym 的评分器运行耗时 **< 1ms**,在**输入相同的情况下产生完全相同的分数**,**无需 API 密钥**,并使用**阈值为 0.92 的 SequenceMatcher 模糊匹配** —— 足够严格,堆砌关键词将得零分。 ### 核心机制 - **确定性评分器**:评估环节不使用 LLM。 - **依赖图遍历**:Agent 必须在微服务拓扑结构中导航,而不仅仅是处理文本。 - **`submit_postmortem` 机制**:对事故理解程度的终极测试。 - **干扰项注入**:测试 Agent 隔离因果链的能力。 - **过程化生成**:生成无限的故障场景变体。 - **Gymnasium wrapper + PPO**:与标准 RL 库完全兼容。 - **基于 MTTR 的评分**:模拟真实的 SLA 压力。 - **部分可观察性**:Agent 只能看到它们明确查询的内容。 ## 评分设计依据 每个权重都是经过深思熟虑的,而非随意设定: | 组件 | 简单 | 中等 | 困难 | 原因 | |---|:---:|:---:|:---:|---| | 健康恢复 | 20% | 15% | 10% | 健康度只是一个**症状**,而非目标。20% 的上限迫使 Agent 进行真正的诊断,而不是盲目治疗 | | 正确诊断 | 30% | 30% | 10% | 必须同时指出服务和原因。仅指出服务只能得一半分 = 0 | | 正确修复 | 25% | 15% | 0% | 必须在完全正确的诊断前提下进行 —— 未经诊断的幸运修复 = 0 | | 复盘质量 | 0% | 0% | 80% | 在困难模式下,复盘报告**就是**最终交付物。包括根本原因、受影响的服务、深度和预防措施 | | MTTR 效率 | 25% | 40% | 0% | 中等任务有 SLA 压力。快但错误依然会失败。困难任务没有 MTTR 考核,因为复盘质量本身就是信号 | | 干扰项惩罚 | 0 | −0.40 | −0.20 | 中等难度的惩罚(−0.40)超过了修复奖励(+0.15)—— 追逐干扰信息明显比什么都不做更糟糕 | **在困难任务中**,评分重心从诊断/修复转向复盘质量,这反映了真实 SRE 组织的工作方式:P0 事故要求撰写一份由团队审查的复盘报告。撰写正确的复盘报告需要了解完整的爆炸半径 —— 而不仅仅是根服务。 ## 基线基准测试 | 场景 | 难度 | gpt-4o-mini | 图感知 Agent | |---|:---:|:---:|:---:| | Redis OOM | 简单 | 0.427 | 0.878 | | Postgres 连接池耗尽 | 简单 | 0.429 | 0.880 | | 配置拼写错误 CrashLoop | 简单 | 0.475 | 0.986 | | 磁盘空间不足 | 简单 | 0.557 | 0.766 | | Redis 级联故障 | 中等 | 0.556 | 0.838 | | Auth JWT 漏洞 | 中等 | 0.586 | 0.839 | | 流量激增 | 中等 | 0.325 | 0.941 | | TLS 证书过期 (mTLS) | 中等 | 0.588 | 0.839 | | 配置级联故障 | 困难 | 0.385 | 0.986 | | 网络分区 | 困难 | 0.577 | 0.903 | | 部署回归 | 困难 | 0.497 | 0.753 | | DNS 配置错误 | 困难 | 0.573 | 0.903 | ## Episode 流程 ``` reset(task_id) │ ▼ [OBSERVE] Receive initial alerts + partial topology view │ ▼ [INVESTIGATE] query_logs / query_metrics │ (each query expands the visible dependency graph) ▼ [TRAVERSE] Build directed graph → find topological root of unhealthy subgraph │ (root = unhealthy node with no unhealthy upstream dependency) ▼ [DIAGNOSE] submit_diagnosis(service, cause) ← exact canonical name required │ ▼ [REMEDIATE] apply_remediation(playbook_id) ← root fix triggers cascade recovery │ ▼ [POSTMORTEM] submit_postmortem(root_cause, affected_services, │ timeline_steps, prevention_steps) ▼ [SCORE] Deterministic grader → MTTR bonus → terminal reward ∈ (0.01, 0.99) ``` ## 快速开始 ### Docker(推荐) ``` docker build -t sre-gym -f Dockerfile . docker run -p 8000:8000 sre-gym ``` ### 本地 Python ``` pip install -e ".[dev]" uvicorn server.app:app --host 0.0.0.0 --port 8000 --reload ``` ### 运行确定性基线(无需 API 密钥) ``` python baseline_deterministic.py ``` ### 运行图感知 Agent(BFS 拓扑遍历) ``` python agent_graph.py --verbose python agent_graph.py --task task_hard_2 ``` ### 训练 PPO Agent ``` pip install stable-baselines3 matplotlib scipy tensorboard python train_ppo.py # 100K steps, saves reward_curve.png python train_ppo.py --steps 50000 # faster test run ``` ### 运行 LLM 基线 ``` export API_BASE_URL=https://api.openai.com/v1 export MODEL_NAME=gpt-4o-mini export HF_TOKEN=your_api_key python inference.py ``` ## 观察与动作 API ### 观察空间 | 字段 | 描述 | |---|---| | `alerts` | 活跃的 PagerDuty 风格告警 `[id, service, severity, message]` | | `logs` / `metrics` | 查询到的日志和浮点数指标(随时间演变) | | `dependency_graph` | 微服务拓扑结构中已发现的部分(部分可观察性) | | `incident_state` | 布尔标志:`acknowledged`、`diagnosed`、`remediated`、`resolved` | | `available_playbooks` | Agent 可以应用的 playbook ID 列表 | ### 动作空间 ``` {"action_type": "", "payload": {}} ``` - `query_logs` — 获取指定服务的日志(如果是故障服务则 +0.02) - `query_metrics` — 获取服务的实时指标(如果是故障服务则 +0.02) - `submit_diagnosis` — 识别出根服务及故障模式(必须是精确的规范名称) - `apply_remediation` — 执行修复 playbook(仅在根服务上有效) - `escalate` — 升级给 on-call 团队 - `submit_postmortem` — 提供时间线、根本原因、受影响的服务和预防步骤 - `close_incident` — 提前结束 episode(扣除 50% 的分数) ### Gymnasium 接口(用于 RL 训练) ``` from gym_wrapper import SREGymEnv from stable_baselines3 import PPO env = SREGymEnv("task_easy_1", seed=42) model = PPO("MlpPolicy", env, verbose=1) model.learn(total_timesteps=100_000) ``` ## 架构 ``` sre_gym/ ├── server/ │ ├── app.py — FastAPI + dashboard serving │ ├── sre_environment.py — Core step/reset/state machine │ ├── graders.py — Deterministic scoring (0.92-threshold fuzzy match) │ ├── scenario_generator.py — Procedural scenario generation │ └── static/ │ └── dashboard.html — Live incident command center ├── scenarios/ — 12 curated JSON scenarios ├── models.py — Pydantic Action/Observation/State ├── gym_wrapper.py — Gymnasium env (stable-baselines3 compatible) ├── train_ppo.py — PPO training + reward curve generation ├── agent_graph.py — Graph-aware BFS agent (topology traversal) ├── inference.py — LLM baseline script ├── baseline_deterministic.py — Rule-based baseline (no API keys) ├── client.py — Typed async client ├── openenv.yaml — OpenEnv specification ├── Dockerfile — Multi-stage Docker build └── pyproject.toml — Hatchling build config ``` ### 评分架构 ``` submit_postmortem() │ ├── grade_easy() → health(20%) + diagnosis(30%) + remediation(25%) + MTTR(25%) ├── grade_medium() → health(15%) + diagnosis(30%) + remediation(15%) + MTTR(40%) │ red_herring_penalty(−40%) └── grade_hard() → health(10%) + diagnosis(10%) + postmortem(80%) [root_cause(25%) + affected(15%) + timeline(15%) + prevention(25%)] │ └── compute_mttr_bonus() → score = base×0.80 + efficiency×0.20 (speed cannot compensate for wrong answer) ``` ## 运行测试 ``` pip install -e ".[dev]" pytest tests/ -v python agent_graph.py # integration smoke test python gym_wrapper.py # gymnasium spec check ``` ## 许可证 MIT
标签:AIOps, Python, 强化学习, 强化学习环境, 故障诊断, 无后门, 智能运维, 请求拦截, 逆向工具