跳转至

Audit Agent

Audit Agent 创建和执行可复用的健康检查 Profile。设计一次检查,每天运行 — 每次获得结构化 Markdown 报告。

功能声明

ID 声明 状态
C-NE-32 olav --agent audit "创建 BGP 健康检查" 引导 Profile 创建 🔶 需 LLM
C-NE-33 olav --agent audit "执行 bgp-health 审计" 输出 Markdown 健康报告 🔶 需 LLM
C-NE-34 Designer 在写入 SQL 前验证表名和列名真实存在 ⬜ 待验证
C-NE-35 analyze_thresholds 提供 P50/P90/P95 统计推荐值 🔶 需 LLM

架构

Audit workspace 包含两个子 agent 和一个编排器:

graph TD
    User["olav --agent audit '...'"] --> Orch[Audit Orchestrator]
    Orch -->|"创建 profile"| Designer[Designer Agent]
    Orch -->|"运行审计"| Auditor[Auditor Agent]
    Designer -->|保存| Profile[profiles/*.md]
    Auditor -->|读取| Profile
    Auditor -->|输出| Report[Markdown 报告]
Agent 角色
Designer 创建和修改审计 Profile(SQL 查询 + 阈值)
Auditor 执行 Profile 并渲染健康报告

创建 Profile

olav --agent audit "创建一个 BGP 健康检查 Profile"

Designer 引导你完成:

  1. 检查什么 — 查询哪些表/视图(如 v_bgp_neighbors_auto
  2. Schema 验证 — Designer 在写入任何 SQL 前验证表名和列名存在于 DuckDB
  3. SQL 查询 — 参数化查询,:window 占位符用于时间范围
  4. 阈值 — 可选:使用 analyze_thresholds 从历史数据获取 P50/P90/P95 推荐
  5. 保存 — Profile 以 YAML frontmatter + Markdown 格式写入 profiles/<name>.md

Profile 格式

---
name: bgp-health
version: 1
description: BGP 会话健康检查
schedule: daily
---

## Job: Down Neighbors

```sql
SELECT device_name, neighbor_ip, neighbor_as, state
FROM v_bgp_neighbors_auto
WHERE state != 'Established'
  AND snapshot_id = (SELECT MAX(snapshot_id) FROM netops.parsed_outputs)

severity: high max_findings: 50

---

## 运行审计

```bash
olav --agent audit "执行 bgp-health 审计,时间范围最近 24 小时"

执行是两阶段 Map-Reduce 流水线:

阶段 1:Map(map_engine)

  • 加载 Profile
  • 执行每个 job 的 SQL 查询
  • 收集结果,遵守 max_findings_per_job
  • 输出分段 JSON(每个 job 一个 section)

阶段 2:Render(render_report)

  • LLM 将每个发现渲染为可读 Markdown
  • 关联分析(Correlation Pass)添加执行摘要
  • 最终输出:完整 Markdown 健康报告

报告示例

# BGP 健康报告 — 2026-04-06

## 执行摘要

24 个 BGP 会话中 3 个未处于 Established 状态。
所有受影响会话在设备 R3(AS 65003)上。

## Down Neighbors(严重度:高)

| 设备 | 邻居 IP | 对端 AS | 状态 |
|------|---------|---------|------|
| R3 | 10.0.0.1 | 65001 | Active |
| R3 | 10.0.0.5 | 65002 | Idle |
| R3 | 10.0.0.9 | 65004 | Active |

### 分析

三个会话均来自 R3。可能原因:
- R3 管理面问题(所有对端受影响)
- ACL 阻止 R3 上的 TCP 179
- R3 上行链路物理故障

Designer 工具

工具 用途
database_introspection 列出 DuckDB/LanceDB 表和列
test_map_query 用样本数据试运行 SQL(保存前预览)
analyze_thresholds 数据驱动的 P50/P90/P95 统计阈值推荐
save_profile 验证 YAML schema 并写入 Profile
read_profile 加载已有 Profile 用于编辑
append_jobs 向已有 Profile 追加检查项

Auditor 工具

工具 用途
map_engine 执行所有 Profile job,生成 JSON 结果
render_report LLM 渲染各 section + 关联分析 → Markdown 报告