arjunsvdc24-cyber/incidentops-openenv

GitHub: arjunsvdc24-cyber/incidentops-openenv

这是一个生产级 SRE 故障响应强化学习环境,通过模拟真实的微服务基础设施故障来训练和评估 AI 智能体。

Stars: 0 | Forks: 0

title: IncidentOps emoji: 🚨 colorFrom: red colorTo: yellow sdk: docker app_port: 7860 pinned: true tags: - openenv - sre - incident-response - reinforcement-learning - multi-agent - real-world-simulation - llm-agent # IncidentOps v15.2 生产级 SRE 故障响应 RL 环境 —— 在真实世界的值班场景中训练和评估 AI agent。ML 工程师可用其基准测试 LLM agent 能力,SRE 可用其演练故障处理手册,研究者可用其研究多 agent 协作。 ## Judge 快速上手 **60 秒演示:** ``` docker run -p 7860:7860 ghcr.io/incidentops/incidentops:latest # 打开 http://localhost:7860 ``` **标准任务:** | 任务 | 难度 | 基于规则 | LLM 基准 | 评级 | |------|------------|------------|--------------|-------| | OOM Crash | Easy (2) | 0.382 | — | Poor | | Cascade | Medium (3) | 0.457 | — | Poor | | The Ghost | Hard (5) | 0.436 | — | Poor | | **Mean** | — | 0.425 | — | Poor | 所有分数均可通过 `/baseline` 端点以 seed=42 复现。 **本环境证明:** - 易于解决:查询服务、重启服务 - 需要推理:在操作前进行调查 - 专家级别:关联部署时间线 + 指标 + 日志 ## 为什么选择 IncidentOps? 大多数 RL 环境是游戏。IncidentOps 是**真实工作**: | 方面 | 典型 RL 环境 | IncidentOps | |--------|---------------|-------------| | 领域 | 网格世界、Atari | 15 个服务的生产环境基础设施 | | 动作空间 | 离散按钮 | 11 种 SRE 工具操作 | | 状态 | 完全可观测 | 部分 + 延迟 + 噪声 | | 奖励时机 | 稀疏(仅在结束) | 密集(每一步) | | 失败模式 | 1 种失败方式 | 级联、欺骗、静默 | | 时间压力 | 无 | SLA 截止倒计时 | | 业务风险 | 无 | 收入损失 + 用户影响 | | 基准分数 | N/A | 0.425 (Poor) 基于规则均值 | **15 种故障类型**,从简单到噩梦 —— OOM 崩溃、级联故障、静默数据损坏、DDoS、内存泄漏、僵尸进程、TLS 证书过期、缓存雪崩等。 ## Judge 评审 — 黑客松评分 **真实世界实用性 (30%)** — IncidentOps 填补了 RL/agent 研究中的关键空白:生产级 SRE 调试。没有任何玩具环境能匹配具有业务风险的真实值班场景的复杂性。 **任务与评分器质量 (25%)** — 三个标准任务,难度进展清晰(Easy: 0.382 → Medium: 0.457 → Hard: 0.436 基于规则)。五轴评分评估根本原因、修复正确性、效率、推理链和 SLA 保持情况。 **环境设计 (20%)** — 通过 `reset()`/`step()`/`state()` 实现清晰的状态管理。11 个动作的 SRE 工具空间。每一步都有密集奖励。带有 SLA 截止时间的合适 episode 边界。 **代码质量与规范合规 (15%)** — 符合 OpenEnv 规范 v1.0。31 项验证检查通过。25 个文件中 659 个测试。强制 80% 代码覆盖率。Docker 可部署运行。 **创意与新颖性 (10%)** — 抗暴力破解的欺骗信号。无错误日志的幽灵故障。通过 15 个服务网格传播依赖关系。SLO/SLI 业务指标全面集成。 ## 快速开始 ### Docker(推荐) ``` # 拉取并运行最新镜像 docker run -p 7860:7860 ghcr.io/incidentops/incidentops:latest # 打开浏览器:http://localhost:7860 ``` ### 本地开发 ``` # 1. 安装依赖 pip install -r requirements.txt # 2. 启动服务器 python -m app.main # 3. 访问 http://localhost:7860 查看完整的 React 仪表板 ``` ### 环境变量(可选) ``` # 用于基于 LLM 的 baseline agent (GPT-4o) export OPENAI_API_KEY=sk-... # 用于 HuggingFace 模型访问 export HF_TOKEN=hf_... ``` 该环境在无 API 密钥的情况下完全可用 —— 基于规则的基准始终可用。 ### React Dashboard(开发模式) ``` cd dashboard npm install npm run dev # 仪表板位于 http://localhost:3000,将 API 代理至 :7860 ``` ## 架构 ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ IncidentOps Architecture │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌─────────────────────────────────────────────────┐ │ │ │ Client │ │ FastAPI Backend (port 7860) │ │ │ │ (Browser) │────►│ ┌─────────────┐ ┌─────────────┐ ┌────────────┐ │ │ │ │ or API │ │ │ /reset │ │ /step │ │ /state │ │ │ │ └──────────────┘ │ │ /grader │ │ /baseline │ │ /tasks │ │ │ │ │ └─────────────┘ └─────────────┘ └────────────┘ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ │ │ ┌─────────────────────────┼─────────────────────────┐ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ IncidentEnv (Core RL Environment) │ │ │ │ ┌──────────────┐ ┌──────────────────┐ ┌─────────────────────┐ │ │ │ │ │ Fault │ │ 15-Service │ │ Reward / Grader │ │ │ │ │ │ Injector │──►│ Mesh Topology │──►│ 5-Axis Scoring │ │ │ │ │ └──────────────┘ └──────────────────┘ └─────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ┌──────────────┐ ┌───────────────────┴────────────────────┐ │ │ │ Agent │ │ Service Graph │ │ │ │ System │ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ │ │◄─┤ │ API │◄──►│ User │◄──►│ Auth │ │ │ │ │ Investigator│ │ │Gate │ │Svc │ │Svc │ │ │ │ │ Fixer │ │ └──────┘ └──────┘ └──────┘ │ │ │ │ Analyst │ │ │ │ │ │ │ │ │ Coordinator │ │ ▼ ▼ ▼ │ │ │ │ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ... │ │ │ └──────────────┘ │ │ Pay │ │ Order│ │ Notif│ │ │ │ │ └──────┘ └──────┘ └──────┘ │ │ │ └──────────────────────────────────────┘ │ │ │ │ │ ┌─────────────────────────────────────┴────────────────────────────┐ │ │ │ SQLite Database (async via SQLAlchemy) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ Users │ │ Episodes │ │Leaderboard│ │ Stats │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ └───────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` **Service Mesh 拓扑(15 个服务):** ``` ┌─────────────┐ │ API Gateway│ (entry point) └──────┬──────┘ │ ┌────────────────┼────────────────┐ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ User │◄────►│ Auth │ │ Payment │ (fault target) │ Service │ │ Service │ └────┬─────┘ └────┬─────┘ └──────────┘ │ │ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌────►│ Order │────┐ │ Cache │◄──────────────┤ │ Service │ │ └────┬─────┘ │ └──────────┘ │ │ │ │ │ ▼ ▼ ▼ ▼ ┌──────────┐ ┌──────────────────────────────┐ │Database- │◄───►│ Shared Dependencies │ │ Primary │ │ (notif, rec, ship, search) │ └────┬─────┘ └──────────────────────────────┘ │ ▼ ┌──────────┐ │Database- │ │ Replica │ └──────────┘ ``` ## API 端点(36 个端点) ### 核心 OpenEnv 接口 | 端点 | 方法 | 描述 | |----------|--------|-------------| | `/reset` | POST | 使用 seed 和故障类型为新的 episode 重置环境 | | `/step` | POST | 执行操作,获取 observation + reward + done 标志 | | `/state` | GET | 获取当前环境状态(步数、总奖励) | | `/tasks` | GET | 列出所有 13 个任务及操作 schema | | `/grader` | POST | 使用五轴 SRE 评估对 trajectory 进行评分 | | `/baseline` | POST | 运行基于规则或 LLM 的基准 agent | ### 观测与操作 | 端点 | 方法 | 描述 | |----------|--------|-------------| | `/services` | GET | 列出所有 15 个服务及其当前状态 | | `/actions` | GET | 列出所有 11 种操作类型及其描述 | | `/metadata` | GET | 环境元数据(服务、故障类型等) | | `/schema` | GET | 操作/观测 JSON schema | ### 持久化与排行榜 | 端点 | 方法 | 描述 | |----------|--------|-------------| | `/episodes` | GET | 列出记录的 episodes(分页) | | `/episodes` | POST | 保存 episode(需要认证) | | `/episodes/{id}` | GET | 获取 episode 详情及 trajectory 回放 | | `/leaderboard` | GET | 按分数排名的排行榜 | | `/stats` | GET | 所有 episodes 的汇总统计 | ### 认证 | 端点 | 方法 | 描述 | |----------|--------|-------------| | `/auth/register` | POST | 注册新用户(返回 JWT) | | `/auth/login` | POST | 使用凭据登录(返回 JWT) | | `/me` | GET | 获取当前用户资料(需要 JWT) | ### 多 Agent 系统 | 端点 | 方法 | 描述 | |----------|--------|-------------| | `/agents/episode` | POST | 在场景上运行多 agent 系统 | ### 推理 | 端点 | 方法 | 描述 | |----------|--------|-------------| | `/inference` | POST | 单步推理(兼容 HF Spaces widget) | | `/openai/check` | POST | 验证 OpenAI API 密钥有效性 | | `/mcp` | POST | MCP 协议兼容端点 | ### 运维 | 端点 | 方法 | 描述 | |----------|--------|-------------| | `/health` | GET | 健康检查及系统状态 | | `/ready` | GET | 编排器的就绪探针 | | `/live` | GET | 容器的存活探针 | | `/metrics` | GET | Prometheus 指标(p50/p95/p99) | | `/frontier` | GET | 生成前沿难度场景 | | `/validation` | GET | 运行 31 项测试验证套件 | | `/determinism/check` | GET | 验证确定性可复现性 | | `/configure` | POST | 配置环境参数 | ### 文档 | 端点 | 方法 | 描述 | |----------|--------|-------------| | `/docs` | GET | OpenAPI Swagger 文档 | | `/redoc` | GET | ReDoc 备选文档 | | `/openenv.yaml` | GET | OpenEnv 规范文件 | ### 实时 | 端点 | 方法 | 描述 | |----------|--------|-------------| | `/ws` | WS | 用于实时更新的 WebSocket | ## 任务(13 种故障类型:3 个标准 + 10 个进阶) ### 标准(3 个评分任务) | 任务 | 难度 | 基于规则 | 描述 | |------|------------|-----------|-------------| | OOM Crash | Easy (2) | 0.795 | 需要重启的 payment-service 崩溃 | | Cascade | Medium (3) | 0.811 | 负载下的数据库连接池耗尽 | | The Ghost | Hard (5) | 0.468 | 需要调查的静默部署损坏 | ### 进阶故障(通过 /tasks 端点 — 不评分) | 故障类型 | 难度 | 描述 | |------------|-----------|-------------| | `cert_expiry` | 1-3 | TLS 证书过期 | | `config_drift` | 1-5 | 服务参数配置错误 | | `data_corruption` | 1-5 | 静默数据不一致 | | `slow_downstream` | 1-5 | 来自依赖的延迟级联 | | `thundering_herd` | 1-5 | 缓存雪崩 / DB 过载 | | `zombie_process` | 1-5 | 消耗资源的孤儿进程 | | `version_mismatch` | 1-5 | 不兼容的 API 版本 | | `memory_leak` | 1-5 | 逐渐的内存耗尽 | | `network_partition` | 1-5 | 脑裂服务连通性 | | `ddos` | 1-5 | 分布式流量洪泛 | ## Ghost 任务 **"The Ghost"**(`ghost_corruption`,difficulty=5)模拟静默部署损坏 —— 现实世界故障中最棘手的一类。没有错误日志,没有崩溃,也没有明显的服务故障。Agent 必须将部署历史与指标漂移相关联以确定根本原因。 该任务奖励系统性调查。在没有正确诊断的情况下应用修复的 Agent 将因识别出受影响服务而获得部分分数,但完全正确需要正确识别并修复潜在问题。 ## 观测空间 每一步返回丰富、逼真的数据: ``` step int Current step (0-50) services dict 15 services with status/latency/error_rate/cpu/memory alerts array Severity-coded alerts (info/warning/error/critical) incident_info dict fault_type, difficulty fix_applied bool Whether correct fix was applied observability dict Track what agent has investigated slo_metrics dict Availability %, latency p99, error budget business_impact dict Revenue loss, affected users, severity sla_deadline dict Minutes remaining, urgency level ``` **部分可观测性**:指标滞后 1-3 步。日志包含噪声。Agent 必须主动调查 —— 没有任何信息会自动呈现。 ## 操作空间(11 个操作) | 操作 | 描述 | 目标 | |--------|-------------|--------| | `query_service` | 健康检查 | Service | | `query_metrics` | 延迟、错误率、CPU、内存 | Service | | `query_logs` | 结构化日志(可能包含噪声) | Service | | `query_dependencies` | 上游/下游图 | — | | `query_deployments` | 部署时间线 | — | | `query_memory` | 历史故障相似度搜索 | — | | `restart_service` | 重启 pod | Service | | `scale_service` | 扩缩容副本 | Service | | `rollback_deployment` | 回滚到上一版本 | Service | | `identify_root_cause` | 声明根本原因(触发修复评估) | Service | | `apply_fix` | 通用修复 | Service | ## 奖励信号 每一步的密集奖励(-1.0 到 +2.0 范围): | 组件 | 范围 | 描述 | |-----------|-------|-------------| | 健康改善 | +0 到 +0.5 | 服务健康恢复 | | 延迟改善 | +0 到 +0.3 | p99 延迟降低 | | 正确调查 | +0.05 | 首次查询相关服务 | | 根本原因已识别 | +0.3 | 正确声明服务 | | 正确修复 | +0.5 到 +1.5 | 在正确服务上执行正确操作 | | 最少操作 | +0 到 +0.2 | 高效(步数越少越高) | | **SLA 紧急惩罚** | -0.05 到 -0.1 | 在 SLA 违约区运行 | | 不必要重启 | -0.2 | 重启非根本原因服务 | | 冗余查询 | -0.05 | 重复查询同一服务 | | 随机操作 | -0.02 | 检测到暴力破解模式 | ## 多 Agent 系统 三个专用 agent + 1 个协调器: ``` Investigator ──┐ ├──► Coordinator ──► action Fixer ────────┤ ▲ │ │ Analyst ───────┘ │ (feedback loop) ─────┘ ``` - **Investigator**:通过依赖传播、优先级排序的怀疑分数 - **Fixer**:将故障类型映射到修复操作 - **Analyst**:与故障记忆数据库的模式匹配 - **RL Trainer**:通过 GymnasiumWrapper 的 Stable-Baselines3 PPO/A2C(176 维操作空间) ## 增强评分 五轴评估(每轴 0.0-1.0): | 维度 | 权重 | 评估内容 | |------|--------|-----------| | 根本原因 | 25% | 正确识别的服务 | | 修复正确性 | 25% | 在正确服务上的正确操作 | | 效率 | 20% | 步数 vs. 最优步数 | | 推理链 | 15% 调查顺序、深度 | | SLA 保持 | 15% | 在 SLA 截止时间内解决 | 输出包括: - 最终等级:`excellent` (0.9+) / `good` (0.7+) / `passable` / `poor` / `failed` - 每个维度的改进建议 - 以步数和模拟分钟为单位的 MTTR - 收入节省/损失估计 ## 基准分数 | 任务 | 难度 | 基于规则 | LLM 基准 | 评级 | |------|------------|------------|--------------|-------| | OOM Crash | Easy (2) | 0.382 | — | Poor | | Cascade | Medium (3) | 0.457 | — | Poor | | The Ghost | Hard (5) | 0.436 | — | Poor | | **Mean** | — | 0.425 | — | Poor | 所有分数均可通过 `/baseline` 端点以 seed=42 复现。 ## OpenEnv 合规性 - ✅ 带类型化 schema 的 `openenv.yaml` v1.0 - ✅ `reset()` / `step()` / `state()` 端点 - ✅ 带操作 schema 的 `/tasks` - ✅ 评分 0.0-1.0 的 `/grader` - ✅ 可复现的 `/baseline` - ✅ 严格推理:`[START]` / `[STEP]` / `[END]` - ✅ HuggingFace Spaces 上的 Docker(端口 7860) ## 技术规格 | 指标 | 值 | |--------|-------| | Python | 3.11 | | 框架 | FastAPI v15 + SQLAlchemy (async) | | 测试 | 25 个文件中 659 个测试 | | 覆盖率 | 强制 80% | | 验证 | 31 项检查(全部通过) | | API 端点 | 36 个路由 | | 任务 | 13 种故障类型(3 个标准) | | 前端 | React + Vite + TailwindCSS | | 数据库 | SQLite(生产环境)/ 准备 PostgreSQL | | 认证 | JWT + API 密钥 (bcrypt) | ## 部署 ### HuggingFace Spaces(推荐) **选项 A - Git clone(自动部署):** ``` # 1. 克隆官方 space git clone https://huggingface.co/spaces/incidentops/incidentops cd incidentops # 2. 登录 HF huggingface-cli login # 3. 推送 main 分支 — HF 自动构建 Docker 镜像 git push origin main # Space URL:https://incidentops-incidentops.hf.space ``` **选项 B - 从此仓库(手动推送):** ``` # 1. 从 https://huggingface.co/settings/tokens 获取 HF 写令牌 export HF_TOKEN=hf_... # 2. 运行部署脚本 python scripts/deploy_hf.py --space-id incidentops/incidentops ``` **从此仓库创建新的 HF Space:** 1. 访问 https://huggingface.co/new-space 2. 选择 **Docker** 作为 SDK 3. 将硬件设置为 **CPU basic** 或 **T4 small** 4. 留空 Dockerfile 路径(IncidentOps 使用 `openenv.yaml` 作为 Space 元数据) 5. 本地克隆该 space,复制此仓库的内容,然后 `git push origin main` **Space 环境变量(在 Space 设置中设置):** | 变量 | 是否必需 | 描述 | |----------|----------|-------------| | `OPENAI_API_KEY` | 可选 | 启用 LLM 基准 agent (GPT-4o) | | `HF_TOKEN` | 可选 | 访问私有模型 | | `JWT_SECRET` | 可选 | 自定义 JWT 签名密钥 | ### Docker(本地) ``` docker build -t incidentops:15.1 . docker run -p 7860:7860 \ -e OPENAI_API_KEY=${OPENAI_API_KEY:-} \ incidentops:15.1 ``` **CI/CD:** 每次推送到 `main` 都会触发 GitHub Actions,运行 31 项测试验证套件并部署到 `ghcr.io/incidentops/incidentops:`。 ## 许可证 MIT License
标签:Benchmark, Black Hat, DDoS, DLL 劫持, Docker, Incident Response, LLM Agent, LLM评测, Multi-Agent, NIDS, Reinforcement Learning, RL环境, SLA管理, SRE, 偏差过滤, 内存泄漏, 告警处理, 多智能体, 大语言模型, 安全防御评估, 容器化, 强化学习, 故障响应, 故障诊断, 生产环境模拟, 真实世界模拟, 站点可靠性工程, 级联故障, 网络安全, 请求拦截, 运维自动化, 逆向工具, 隐私保护