nutcas3/runbook-agent
GitHub: nutcas3/runbook-agent
AI 驱动的事件响应 agent,将运维 runbook 转为可执行安全状态机,通过 Gemini 诊断事件并在人工批准后执行恢复操作。
Stars: 0 | Forks: 0
# runbook-agent
一个由 AI 驱动的事件响应 agent,它能将 runbook 转换为可执行且安全的状态机。你无需在凌晨两点从 Markdown 文件中复制粘贴命令,该 agent 会使用 Gemini 诊断事件,提出恢复操作建议,并在获得人工批准后执行它。
## 功能介绍
1. 通过 webhook 接收警报 (`POST /api/alerts`)
2. 从 YAML 加载结构化的 runbook(诊断步骤 + 恢复操作)
3. 使用 Gemini 结合只读工具(`kubectl`、`curl`、`redis-cli`、Prometheus)**诊断事件**
4. **形成结构化假设**(根本原因、置信度、风险等级)
5. **检查安全关卡** —— 拒绝禁止的操作;高风险操作将暂停等待人工批准
6. **执行恢复** —— 仅在工程师通过 dashboard 批准后执行
7. **记录所有内容** —— 记录到审计跟踪中(默认使用 SQLite)
## 架构
```
cmd/server HTTP server (alerts, approvals, audit)
internal/agent Gemini agent with read-only diagnostic tools
internal/runbook YAML parser, executor, and Agent interface
internal/model Shared types (Hypothesis) — cycle-free
internal/approval Human-in-the-loop gate
internal/audit SQLite audit store
internal/safe Safety enforcer (read-only + approval lists)
```
## 安全模型
该 agent 在诊断期间**仅进行读取**。它不能:
- 执行非白名单命令
- 未经明确批准修改状态
- 绕过安全执行器
恢复操作会与 runbook 的 `safe_state` 进行核对:
```
safe_state:
read_only:
- delete_database
requires_approval:
- restart_service
```
## 快速开始
### 前置条件
- Go 1.26+
- `GOOGLE_API_KEY` 环境变量(用于 Gemini)
- 已配置的 `kubectl`(可选,用于 K8s 诊断)
### 运行
```
go run ./cmd/server
```
服务器监听 `:8080`。
### 触发 runbook
```
curl -X POST http://localhost:8080/api/alerts \
-H "Content-Type: application/json" \
-d '{
"alert": "PaymentGatewayErrorRate",
"severity": "critical",
"runbook": "payment-gateway-failure",
"telemetry": "error_rate: 45%, p99_latency: 2.3s"
}'
```
### 端点
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| `POST` | `/api/alerts` | 接收警报 webhook |
| `GET` | `/api/approvals` | 列出待处理的批准 |
| `POST` | `/api/approvals/:id/approve` | 批准操作 |
| `POST` | `/api/approvals/:id/reject` | 拒绝操作 |
| `GET` | `/api/incidents/:id/history` | 审计跟踪 |
| `GET` | `/health` | 存活探针 |
## Runbook 格式
```
name: payment-gateway-failure
version: "1.0"
severity: critical
mttr_target: 5m
triggers:
- alert: PaymentGatewayErrorRate
threshold: "> 10%"
duration: 2m
safe_state:
read_only:
- delete_database
requires_approval:
- restart_service
diagnostic_steps:
- step: 1
name: Check pod status
command: kubectl get pods -n payments
ai_interpret: Look for CrashLoopBackOff or high restart counts
recovery_actions:
- condition: stripe_down
action: restart_service
requires_approval: true
command: kubectl rollout restart deployment/payment-gateway -n payments
rollback_command: kubectl rollout undo deployment/payment-gateway -n payments
```
## 项目结构
| 包 | 职责 |
|---------|---------------|
| `internal/agent` | Gemini agent、诊断工具、假设生成 |
| `internal/runbook` | YAML 解析、runbook 执行引擎、`Agent` 接口 |
| `internal/model` | 共享数据类型(避免循环导入) |
| `internal/approval` | 人工批准队列和阻塞请求 |
| `internal/audit` | 基于 SQLite 的事件日志 |
| `internal/safe` | 安全策略执行 |
## 设计决策
- **Agent 仅进行读取** —— 所有写操作均在安全检查后于执行器中进行
- **接口驱动** —— `runbook.Agent` 将执行器与具体的 Gemini agent 解耦
- **Model 包** —— `internal/model` 打破了 `agent ↔ runbook` 的循环导入
- **Genkit v1.10** —— 使用 `ai.ToolContext`、`ai.WithConfig` 和 `genkit.GenerateData` API
标签:AI智能体, EVTX分析, Go, Pandas, Ruby工具, 搜索引擎查询, 故障响应, 日志审计, 状态机, 自定义请求头, 运维自动化