Neeln11/SRE-Bench
GitHub: Neeln11/SRE-Bench
这是一个用于评估 AI 代理在模拟生产故障中进行根因分析与修复的基准测试环境。
Stars: 0 | Forks: 0
title: SRE-Bench 故障响应环境
emoji: 🚨
colorFrom: red
colorTo: red
sdk: docker
pinned: false
tags:
- openenv
- sre
- incident-response
- rl-environment
- agent-evaluation
# 🚨 SRE-Bench: 故障响应环境
一个 **OpenEnv** 环境,其中 AI 代理扮演值班站点可靠性工程师(SRE)。代理将面对一个实时的生产故障,必须读取日志、运行诊断、确定根本原因并应用正确的修复方案——所有这些都通过结构化的终端 API 进行。
## 🎯 为什么这个环境很重要
每家科技公司都有工程师全天候待命。当生产数据库在凌晨 3 点宕机时,你不能只是让一个标准聊天机器人去“修复它”。在工程团队信任 AI 担任自主 SRE 之前,他们需要一个安全、沙盒化的方式来证明 AI 在尝试解决中断时不会意外删除客户数据。
**SRE-Bench 提供了这样一个确切的验证平台。**
## 💻 为什么是基于文本的“聊天”界面?
你可能想知道为什么代理通过 JSON 命令(`read_log`、`check_metrics`)进行交互,而不是使用传统的 UI。这是有意为之的:
- **真正的工程师使用终端:** 当人类调试服务器时,他们会 SSH 进入终端,运行 `htop`,检查 `tail -f logs`,并运行 bash 脚本。
- **工具使用:** 通过为 LLM 提供严格的基于文本的 API,我们迫使它像使用 CLI 工具的真正工程师一样与系统交互。
- **推理循环:** 代理必须观察终端输出,“思考”(思维链)其含义,并决定下一个逻辑命令。这评估了真正的代理推理能力。
## 🚀 最终目标:二级值班自动化
此类系统的核心价值在于**防止职业倦怠**。目前,如果磁盘满了,人类会在半夜收到警报。有了经过 SRE-Bench 验证的代理,未来的工作流程将变为:
## 🖥️ 交互式 Web 界面
SRE-Bench 配有两个精美的前端 UI 来可视化基准测试:
1. **Gradio 控制面板 (`http://localhost:7860`)**:一个精致的中心,用于手动触发健康检查、批量执行压力测试,或一键启动推理代理。
2. **实时操作仪表板 (`http://localhost:8000/`)**:一个时尚、动态的终端 UI(灵感来自暗色模式 IDE),你可以在其中直观地观看 AI 代理的推理、命令执行以及微服务的实时健康状况。
## 🌍 环境描述
代理与一个由多个服务(API、数据库、认证、履约、财务)组成的模拟生产系统进行交互。每个回合呈现不同的故障。代理必须:
- 观察故障警报和当前的服务健康状况
- 运行诊断命令以收集信息
- 确定根本原因
- 应用正确、有针对性的修复
- 验证服务是否恢复
## ⚡ 动作空间
| 命令 | 描述 | 示例参数 |
|---|---|---|
| `read_log` | 读取服务日志 | `{"service": "api"}` |
| `check_metrics` | 检查服务/基础设施指标 | `{"target": "disk"}` |
| `run_diagnostic` | 运行诊断查询 | `{"type": "deploy_history"}` |
| `apply_fix` | 应用补救措施 | `{"fix_type": "delete_log", "target": "/var/log/app/app.log.2024-01-14"}` |
| `rollback` | 回滚服务 | `{"service": "orders"}` |
| `restart_service` | 重启服务 | `{"service": "auth"}` |
| `escalate` | 从高级 SRE 获取提示 | `{}` |
## 👁️ 观察空间
| 字段 | 类型 | 描述 |
|---|---|---|
| `terminal_output` | string | 上一条命令的输出 |
| `services` | list | 服务健康对象:名称、状态、错误率、延迟 p99_ms |
| `step` | int | 当前步骤(最多 15 步) |
| `sla_remaining` | int | 违反 SLA 之前的步数(如果在 12 步内解决,则获得 SLA 奖励) |
| `incident_description` | string | 初始的 PagerDuty 风格警报 |
| `last_command_error` | string\|null | 如果命令无效则显示错误 |
## 📋 任务
### 任务 1 — 磁盘已满 *(简单)*
- **故障:** API 服务降级 — 45% 错误率,4.2s p99 延迟。
- **根本原因:** 一个 40GB 的轮转日志文件从未被压缩,导致 `/var/log` 使用率达到 100%。
- **代理必须执行的操作:** `check_metrics(disk)` → `read_log(app)` → `apply_fix(delete_log, correct_file)`。
- **为什么简单:** 单一根因,2–3 条命令,线性推理。
### 任务 2 — 数据库连接池耗尽 *(中等)*
- **故障:** API p99 = 8.1s,错误率 38%。50 分钟前逐渐开始。
- **根本原因:** Auth 服务在每次登录失败时泄漏一个数据库连接。50 分钟后,所有 50 个池连接都被 auth 占用,阻塞了其他所有操作。
- **代理必须执行的操作:** 读取 API 日志 + DB 指标 + auth 日志,关联连接所有权数据,然后应用 `restart_auth_with_connection_cleanup`。如果代理未读取至少 2 个来源,则修复无效。
- **为什么中等:** 根本原因在任何单个日志中都不可见 — 需要多源关联。
### 任务 3 — 静默数据损坏 *(困难)*
- **故障:** 低优先级工单:财务报告约 180 张重复发票。无服务错误。无延迟警报。
- **根本原因:** 45 分钟前的一次部署将 orders 服务序列化程序更改为 `json_v2`,它会静默地将无法识别的字符替换为 `?`。Orders 写入损坏的 `item_id` 字段 → fulfillment 静默丢弃这些行 → 财务在重试时重复计费。
- **代理必须执行的操作:** 读取 orders + fulfillment + finance 日志,检查部署历史,回滚配置更改,然后触发重新处理 — 且不删除 orders 表(这会导致 -0.50 的惩罚)。
- **为什么困难:** 没有单个日志显示全貌。Orders 服务看起来很健康。代理必须连接 4 个独立的数据源,理解因果关系,并按正确顺序应用两步修复。
## 🏆 奖励函数
```
Per step:
+0.05-0.10 Running correct diagnostic commands
+0.07-0.10 Reading relevant logs (each source)
+0.20-0.30 Identifying root cause
+0.20-0.30 Applying correct fix
+0.20 Service health fully restored
+0.05 SLA bonus (fast resolution)
Penalties:
-0.05 Wrong fix attempted (no data loss)
-0.30 Destructive action on wrong target
-0.50 Permanent data loss (hard task)
```
所有奖励严格限制在 `(0.0, 1.0)` 之间 — 不包含两端点。
## 🔌 API 端点
| 方法 | 路径 | 描述 |
|---|---|---|
| GET | `/health` | 健康检查 |
| GET | `/tasks` | 列出所有任务 |
| POST | `/reset` | 开始新回合 |
| POST | `/step` | 执行一个动作 |
| GET | `/state` | 获取完整的内部状态 |
| POST | `/grade` | 获取最终评分 |
### 示例用法
```
import requests
# 开始 episode
obs = requests.post("https://neel-110-sre-bench-env.hf.space/reset",
json={"task_id": "disk_full", "session_id": "test"}).json()
# 执行一步
result = requests.post("https://neel-110-sre-bench-env.hf.space/step", json={
"action": {"command": "check_metrics", "params": {"target": "disk"}},
"session_id": "test"
}).json()
print(result["observation"]["terminal_output"])
print(result["reward"])
```
## 🛠️ 设置与本地运行
```
# Clone and install
git clone https://github.com/Neeln11/SRE-Bench
cd SRE-Bench
pip install -r requirements.txt
# 运行 environment server (FastAPI) 和 Gradio Web UI
python app.py
# (可选)手动运行 inference script
set HF_TOKEN=your_token
set API_BASE_URL=https://router.huggingface.co/v1
set MODEL_NAME=Qwen/Qwen2.5-72B-Instruct
python inference.py
```
### Docker
```
docker build -t sre-bench .
docker run -p 7860:7860 \
-e HF_TOKEN=your_token \
-e API_BASE_URL=https://router.huggingface.co/v1 \
-e MODEL_NAME=Qwen/Qwen2.5-72B-Instruct \
sre-bench
```
## 📊 基线分数
通过 HuggingFace 路由使用 `Qwen/Qwen2.5-72B-Instruct` 获得的分数:
| 任务 | 难度 | 基线分数 |
|---|---|---|
| disk_full | 简单 | ~0.90 |
| db_pool_exhausted | 中等 | ~0.85 |
| data_corruption | 困难 | ~0.25 |
困难任务约 0.25 的分数显示了有意义的难度递进 — 代理通常能识别出 orders 日志异常,但未能追踪完整链条并应用了错误的修复。
## 🔧 环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
| `HF_TOKEN` | 是 | 用于推理的 HuggingFace / API 密钥 |
| `API_BASE_URL` | 是 | LLM 端点 URL |
| `MODEL_NAME` | 是 | 模型标识符 |
| `SRE_BENCH_URL` | 否 | 环境 URL(默认:http://localhost:7860) |
| `TASK_ID` | 否 | 要运行的任务:`all`、`disk_full`、`db_pool_exhausted`、`data_corruption` |
标签:AI智能体, Benchmark, BurpSuite集成, DLL 劫持, DNS解析, Docker, LLM, On-call, OpenEnv, RL环境, SRE, Unmanaged PE, 事故响应, 值班自动化, 偏差过滤, 大语言模型, 安全防御评估, 开源项目, 强化学习环境, 故障响应, 智能运维, 根因分析, 沙箱环境, 环境评估, 站点可靠性工程, 系统诊断, 终端模拟, 自动化运维, 请求拦截, 运维自动化, 逆向工具