从PagerDuty到自愈Agent——ServerGuard的告警驱动架构设计

2026年,SRE领域正在经历一次范式转换:从“人类半夜爬起来修服务器”到“系统自己判断、自己修复”-26。但市面上大多数自愈工具要么绑定K8s生态,要么只停留在“自动重启”的粗粒度层面。

ServerGuard想做的事更朴素:让一台普通的Linux服务器,在没有人盯着的情况下,自己把自己管好。

这篇文章不讲故事,只讲架构和设计取舍。

一、核心问题:告警驱动的“救火循环”
传统监控工具的架构是:
Collector → RuleEngine → Notifier → 人
问题在于,人是最慢的一环。磁盘从95%到100%可能只有几分钟,而人从被叫醒到连上服务器,至少5-10分钟。这中间的窗口期,就是事故发生的窗口期。

ServerGuard把架构改了:
Collector → RuleEngine → Decider → Executor → Notifier

SafetyLayer
核心变化: 在RuleEngine和Notifier之间,插入了Decider和Executor。规则匹配之后不是发通知等人处理,而是先过安全决策层,能自动处理的直接执行。

二、告警收敛:滑动窗口计数
告警收敛是自愈系统的前置条件——如果告警本身就把人淹没了,后面的自愈逻辑根本没人看。

ServerGuard的收敛逻辑分两层:

第一层:抖动抑制。 同一条告警10分钟内重复触发3次,自动静默10分钟。
type AlertThrottle struct {
key string // 告警唯一标识,如 "disk_/dev/sda1"
count int
firstAt time.Time
silenced bool
until time.Time
}

func (t AlertThrottle) ShouldSend() bool {
if t.silenced && time.Now().Before(t.until) {
return false
}
if time.Since(t.firstAt) > 10
time.Minute {
t.count = 0
t.firstAt = time.Now()
}
t.count++
if t.count >= 3 {
t.silenced = true
t.until = time.Now().Add(10 * time.Minute)
return true
}
return true
}
第二层:同源合并。 同一个IP在5分钟窗口内触发多种告警,合并成一条事件摘要。
type AggregationKey struct {
IP string
TimeSlot int64 // 5分钟时间片
}
两层逻辑加起来不到80行。没有机器学习,没有大模型,一个计数器加一个时间窗口。

实测效果:告警从每天47条降到8条,所有原始告警一条没丢,全部落库,面板可查。

三、磁盘写满预测:最小二乘法的工程落地
对近14天的磁盘使用率做线性回归。为什么是14天?7天太短,周末数据干扰大;30天太长,历史噪声多。14天覆盖两个完整周,趋势稳定。

预测公式:
斜率 k = Σ[(xᵢ - x̄)(yᵢ - ȳ)] / Σ[(xᵢ - x̄)²]
截距 b = ȳ - k × x̄
预测第n天 = k × n + b
关键在过滤。 三条校验全过才输出:

R² ≥ 0.6(趋势足够像直线)

斜率必须为正(在涨才预测)

标准差 ≤ 15%(每天涨幅稳定)

回测数据:第1天预测误差约5天,第15天误差缩到1天。越临近越准。

代码位置:internal/forecast/disk.go,不到300行 Go 代码,零外部依赖。

四、与Zabbix/Prometheus的关系
一个常见问题:ServerGuard和Zabbix/Prometheus冲突吗?

不冲突,反而互补。

Zabbix和Prometheus解决的是“告诉我发生了什么”——数据采集、指标存储、可视化面板。Zabbix是All-in-one的传统方案,Prometheus是云原生生态的时序数据库-53。

ServerGuard解决的是另一个问题: “我知道发生了,然后呢?”

能力 Zabbix/Prometheus ServerGuard
指标采集与存储 ✅ 专业 基础采集
可视化面板 ✅ Grafana/Zabbix UI 内置轻量面板
告警通知 ✅ 丰富路由 全渠道推送
自动修复 ❌ ✅
安全约束 ❌ ✅ 五层机制
实操建议:Zabbix/Prometheus负责监控大盘,ServerGuard负责自动修复。Prometheus的Alertmanager推送到ServerGuard的Webhook,ServerGuard收到后触发自愈流程。

如果已经部署了Prometheus,ServerGuard还提供GET /metrics标准Prometheus格式输出,可直接接入Grafana大盘。

五、总结
ServerGuard的架构核心就一句话:把“人处理告警”这一步,用安全约束下的自动决策替代掉。

技术栈:Go 1.25+,gopsutil v3,Gin,SQLite,纯Go YARA。单二进制16MB,零运行时依赖。

项目地址:

GitHub:suoten/ServerGuard

Gitee:suoten/ServerGuard

posted @ 2026-09-18 10:10  硕腾  阅读(7)  评论(0)    收藏  举报