feat: 完善堡垒机与 Agent 智能运维能力
- 支持 Windows Agent 构建、安装脚本和统一上报协议 - 增强 RDP 剪贴板、虚拟盘和文件传输能力 - 新增 AIOps 上下文工具、告警 RCA trace 落库和回放接口 - 重构 docs 模块文档并补充终端、堡垒机、监控、AI Agent 设计
This commit is contained in:
1 parent
a9513c2056
commit
e0d652d211
169 files changed
+12192
-9116
No files matched your search
@@ -0,0 +1,339 @@
|
||||
# AIOps 客户端 Agent 实现规格
|
||||
|
||||
> 更新:2026-07-05
|
||||
> 目标:让另一个项目仅阅读本文档,也能实现一个轻量主机采集 Agent 和后端接收链路。
|
||||
> 范围:Linux 主机指标采集、HTTP 上报、后端入库、任务轮询、安装升级、验收标准。
|
||||
|
||||
---
|
||||
|
||||
## 1. 最小可用闭环
|
||||
|
||||
```text
|
||||
Agent
|
||||
├── collect CPU / memory / disk
|
||||
├── build report JSON
|
||||
└── POST /api/v1/agent/report
|
||||
|
||||
Backend
|
||||
├── validate token
|
||||
├── insert agent_reports
|
||||
├── update asset_servers latest metrics
|
||||
└── return { code: 200 }
|
||||
|
||||
Frontend
|
||||
└── query latest metrics and render host monitor
|
||||
```
|
||||
|
||||
第一版必须完成:
|
||||
|
||||
| 能力 | 验收 |
|
||||
|------|------|
|
||||
| Agent 能启动 | `version` 和 `output` 正常 |
|
||||
| 指标能上报 | 后端收到并入库 |
|
||||
| 资产能关联 | hostname/IP 匹配到资产,未匹配时可自动注册 |
|
||||
| 前端能展示 | 主机监控页面看到实时指标 |
|
||||
| 离线能识别 | 超过阈值无上报后标记 offline |
|
||||
|
||||
---
|
||||
|
||||
## 2. Agent 命令行契约
|
||||
|
||||
```bash
|
||||
aiops-agent version
|
||||
aiops-agent output -top-n 5
|
||||
aiops-agent -server http://aiops.example.com -token <TOKEN> -hostname <HOST> -interval 30
|
||||
```
|
||||
|
||||
参数:
|
||||
|
||||
| 参数 | 默认 | 说明 |
|
||||
|------|------|------|
|
||||
| `-server` | 空 | 后端地址,run 模式必填 |
|
||||
| `-token` | 空 | Agent 鉴权 token |
|
||||
| `-hostname` | `os.Hostname()` | 主机标识,建议与资产 hostname 一致 |
|
||||
| `-interval` | `10` | 采集间隔,生产建议 30-60 秒 |
|
||||
| `-top-n` | `3` | 进程 TOP 数量 |
|
||||
|
||||
要求:
|
||||
|
||||
- `interval < 5` 应拒绝启动,避免高频上报压垮后端。
|
||||
- 启动时加入随机 jitter,防止大量 Agent 同时上报。
|
||||
- `output` 模式不需要 `server/token`,用于安装排障。
|
||||
|
||||
---
|
||||
|
||||
## 3. 上报协议
|
||||
|
||||
### 3.1 请求
|
||||
|
||||
```http
|
||||
POST /api/v1/agent/report
|
||||
Authorization: Bearer <token>
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
核心 JSON:
|
||||
|
||||
```json
|
||||
{
|
||||
"hostname": "app-01",
|
||||
"ip": "10.0.0.11",
|
||||
"timestamp": "2026-07-05T10:00:00Z",
|
||||
"agent_version": "v2.1.0",
|
||||
"cpu": {
|
||||
"usage_percent": 12.3,
|
||||
"iowait": 0.4,
|
||||
"core_count": 8,
|
||||
"load1": 0.8,
|
||||
"load5": 0.7,
|
||||
"load15": 0.6
|
||||
},
|
||||
"memory": {
|
||||
"total_gb": 31.4,
|
||||
"used_gb": 12.0,
|
||||
"available_gb": 18.2,
|
||||
"cached_gb": 4.1,
|
||||
"swap_used_gb": 0.0,
|
||||
"usage_percent": 38.2
|
||||
},
|
||||
"disks": [
|
||||
{
|
||||
"mount": "/",
|
||||
"device": "/dev/vda1",
|
||||
"total_gb": 100,
|
||||
"used_gb": 42,
|
||||
"usage_percent": 42,
|
||||
"inode_usage_pct": 11
|
||||
}
|
||||
],
|
||||
"ports": [
|
||||
{ "port": 8080, "protocol": "tcp", "process": "aiops", "pid": 1234 }
|
||||
],
|
||||
"network": {},
|
||||
"disk_io": {},
|
||||
"process_top": [],
|
||||
"fd": {},
|
||||
"context_switches": {},
|
||||
"heartbeat": {
|
||||
"version": "v2.1.0",
|
||||
"uptime_sec": 3600,
|
||||
"self_rss_mb": 18.5,
|
||||
"report_seq": 100
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3.2 响应
|
||||
|
||||
```json
|
||||
{ "code": 200, "message": "ok" }
|
||||
```
|
||||
|
||||
错误:
|
||||
|
||||
| HTTP | 场景 |
|
||||
|------|------|
|
||||
| 400 | JSON 格式错误或必填字段缺失 |
|
||||
| 401 | token 无效 |
|
||||
| 500 | 入库失败 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 采集器规格
|
||||
|
||||
| 采集器 | Linux 来源 | 输出 |
|
||||
|--------|------------|------|
|
||||
| CPU | `/proc/stat`, `/proc/loadavg` | 使用率、IOWait、核心数、Load |
|
||||
| Memory | `/proc/meminfo` | total/used/available/cached/swap |
|
||||
| Disk | `statfs`, mount table | 挂载点容量、inode |
|
||||
| Disk IO | `/proc/diskstats` | read/write bps、IOPS |
|
||||
| Network | `/proc/net/dev`, `/proc/net/tcp*` | rx/tx、TCP 状态 |
|
||||
| Port | `/proc/net/tcp*` + `/proc/<pid>/fd` | 监听端口和进程 |
|
||||
| ProcessTop | `/proc/<pid>/stat`, `status`, `cmdline` | top N 进程 |
|
||||
| FD | `/proc/sys/fs/file-nr` | allocated/max/usage |
|
||||
| Context | `/proc/stat` | ctxt / intr 速率 |
|
||||
| System | `/etc/os-release`, `uname`, `/proc/uptime` | OS/Kernel/Uptime |
|
||||
| HealthProbe | 后端配置 | HTTP/TCP/CMD 探测结果 |
|
||||
|
||||
实现原则:
|
||||
|
||||
- 单个采集器失败不能影响整次上报。
|
||||
- 采集错误写本地日志,不把错误堆进上报报文。
|
||||
- 网络/磁盘速率类指标需要保存上一轮样本计算差值。
|
||||
- 不要依赖 shell 命令做核心采集,优先读 `/proc` 和 Go 标准库。
|
||||
|
||||
---
|
||||
|
||||
## 5. 后端处理规格
|
||||
|
||||
```text
|
||||
ReceiveReport(req)
|
||||
├── parse timestamp
|
||||
├── marshal complex fields to JSON string
|
||||
├── insert AgentReport
|
||||
├── match asset by hostname or IP
|
||||
├── update latest metrics on asset_servers
|
||||
├── if no match, auto register server
|
||||
├── cache latest metrics in Redis if available
|
||||
├── broadcast MetricsHub
|
||||
└── return success
|
||||
```
|
||||
|
||||
资产匹配优先级:
|
||||
|
||||
1. Agent 上报 `hostname`。
|
||||
2. Agent 上报 `ip`。
|
||||
3. 请求来源 IP。
|
||||
4. 必要时自动注册新资产。
|
||||
|
||||
离线判断:
|
||||
|
||||
```text
|
||||
latest_report_time < now - offline_threshold
|
||||
→ agent_status = offline
|
||||
```
|
||||
|
||||
建议阈值:
|
||||
|
||||
| interval | offline threshold |
|
||||
|----------|-------------------|
|
||||
| 10s | 60s |
|
||||
| 30s | 180s |
|
||||
| 60s | 300s |
|
||||
|
||||
---
|
||||
|
||||
## 6. 任务轮询
|
||||
|
||||
### 6.1 Agent 拉取任务
|
||||
|
||||
```http
|
||||
GET /api/v1/agent/tasks/poll?hostname=app-01
|
||||
Authorization: Bearer <token>
|
||||
```
|
||||
|
||||
响应:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"data": [
|
||||
{
|
||||
"task_id": "uuid",
|
||||
"hostname": "app-01",
|
||||
"type": "command",
|
||||
"command": "df -h",
|
||||
"timeout": 60
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
后端规则:
|
||||
|
||||
- 只返回 `pending` 任务。
|
||||
- 按创建时间升序。
|
||||
- 拉取后原子更新为 `running`。
|
||||
- 单次最多返回 5 个。
|
||||
|
||||
### 6.2 Agent 回传结果
|
||||
|
||||
```http
|
||||
POST /api/v1/agent/tasks/:task_id/result
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"exit_code": 0,
|
||||
"result": "Filesystem ...",
|
||||
"status": "success"
|
||||
}
|
||||
```
|
||||
|
||||
任务安全要求:
|
||||
|
||||
- 命令必须有超时。
|
||||
- 输出必须截断,避免后端大字段膨胀。
|
||||
- 任务执行应记录操作者、创建时间、开始时间、结束时间。
|
||||
- 生产环境应接入命令策略或审批,尤其是 `script` 类型。
|
||||
|
||||
---
|
||||
|
||||
## 7. 安装和升级
|
||||
|
||||
安装链路:
|
||||
|
||||
```text
|
||||
Frontend AgentWizard
|
||||
→ backend AgentInstallHandler
|
||||
→ SSH to target server
|
||||
→ download aiops-agent binary / install.sh
|
||||
→ write systemd unit
|
||||
→ systemctl enable --now aiops-agent
|
||||
→ detect version
|
||||
→ write audit log
|
||||
```
|
||||
|
||||
systemd 服务要求:
|
||||
|
||||
```ini
|
||||
[Service]
|
||||
ExecStart=/usr/local/bin/aiops-agent -server <SERVER> -token <TOKEN> -interval 30
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
```
|
||||
|
||||
安装验收:
|
||||
|
||||
1. `/usr/local/bin/aiops-agent version` 正常。
|
||||
2. `systemctl status aiops-agent` active。
|
||||
3. 后端 1 分钟内收到上报。
|
||||
4. 资产 `agent_version` 更新。
|
||||
5. 安装审计记录成功或失败原因。
|
||||
|
||||
---
|
||||
|
||||
## 8. 安全要求
|
||||
|
||||
| 风险 | 要求 |
|
||||
|------|------|
|
||||
| token 泄漏 | token 不写命令审计、不在前端明文展示 |
|
||||
| 伪造上报 | token 必须校验,建议绑定 hostname/server_id |
|
||||
| 命令任务滥用 | command/script 任务接入策略、审计、超时、输出截断 |
|
||||
| 自动注册污染资产 | 自动注册要有去重策略和可信来源限制 |
|
||||
| 高并发上报 | Agent jitter + 后端批量/缓存/限流 |
|
||||
| 采集权限过大 | Agent 默认不需要 root;端口进程归属等能力可降级 |
|
||||
|
||||
---
|
||||
|
||||
## 9. 与 Redis/MySQL 主动采集的边界
|
||||
|
||||
客户端 Agent 第一职责是主机 OS 层采集,Redis/MySQL 第一职责是服务内部指标采集。即使两者部署在同一台机器,也应保持两条链路独立。// Logan.Li
|
||||
|
||||
| 能力 | 客户端 Agent | 后端中间件监控 |
|
||||
|------|--------------|----------------|
|
||||
| 发现 3306/6379 端口 | 可以,通过端口采集器 | 不负责端口发现 |
|
||||
| 判断 TCP 是否可连 | 可以,通过健康探针 | 可以,连接失败则目标 offline |
|
||||
| Redis INFO / DBSIZE | 不做 | 必须做 |
|
||||
| MySQL SHOW GLOBAL STATUS | 不做 | 必须做 |
|
||||
| 主机 CPU/内存/磁盘 | 必须做 | 不做 |
|
||||
| 服务级 QPS/连接数/命中率 | 不做 | 必须做 |
|
||||
|
||||
如果要把 Redis/MySQL 指标下沉到 Agent,需要新增独立的 `middleware` 采集器和权限配置;当前设计不建议这么做,因为后端主动采集更便于集中管理凭据、采集间隔和告警策略。
|
||||
|
||||
---
|
||||
|
||||
## 10. 验收矩阵
|
||||
|
||||
| 场景 | 预期 |
|
||||
|------|------|
|
||||
| `output` 调试 | 打印完整指标,不访问后端 |
|
||||
| 正常上报 | 后端写入 `agent_reports` |
|
||||
| 资产匹配 | `asset_servers` 实时指标更新 |
|
||||
| 自动注册 | 新 hostname 创建资产 |
|
||||
| 网络断开 | Agent 记录失败并下轮重试 |
|
||||
| 后端重启 | Agent 自动恢复上报 |
|
||||
| 任务执行成功 | 状态 `success`,保存输出 |
|
||||
| 任务超时 | 状态 `timeout`,进程被终止 |
|
||||
| Agent 停止 | 超过阈值后标记 offline |
|
||||
| 一键安装 | systemd 服务 active,审计可查 |
|
||||
Reference in new issue
Block a user