告警降噪与智能合并:基于滑动窗口与语义相似度的 AI 告警治理

在大型分布式探针集群中,当底层发生级联网络抖动或 DDoS 洪水攻击时,监控系统往往会在一分钟内产生数千条告警。
如果仅仅依靠简单的“时间窗口计数收敛”,往往无法识别**“文本措辞略有不同、但根本诱因 100% 相同”的同质化告警**:
- 探针 A 报告:“
TCP reset received from 10.0.0.88”; - 探针 B 报告:“
Connection refused by target 10.0.0.88:80”; - 探针 C 报告:“
Upstream HTTP 502 Bad Gateway via 10.0.0.88”。
这三条告警虽然字面不同,但其物理本质都是**“后端主机 10.0.0.88 的 80 端口服务宕机崩溃”**!
如果系统将它们作为三类独立告警分别通知值班工程师,依然会造成严重的信息碎片化与认知负担。
今天我们在 packet-ai 模块中实现一套基于滑动时间窗口与大模型语义聚类的智能告警降噪与合并引擎(Smart Alert Deduplication & Merging Engine)。
1. 语义相似度智能告警合并架构
[ 全网数十台探针推送的高频原始告警流 (每分钟 3,000 条) ]
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 滑动窗口微批聚合器 (Sliding Window Ingestion) │
│ │
│ - 收集 15 秒滑动窗口内的所有未决告警事件 │
│ - 提取关键四元组与错误签名 (IP, Port, ErrKind) │
└──────────────────────────────┬──────────────────────────────┘
│ (将微批文本投递给大模型)
▼
┌─────────────────────────────────────────────────────────────┐
│ AI 语义归因与聚类中枢 (Semantic Deduplicator)│
│ │
│ - 识别语义等价性: "TCP RST" ≈ "Conn Refused" ≈ "502 Gateway"│
│ - 归因聚合: 识别为【10.0.0.88:80 服务离线】同一根因事件 │
│ - 抑制率评估: 将 3000 条异构告警智能压缩为 2 条结构化摘要 │
└──────────────────────────────┬──────────────────────────────┘
│
▼
[ 仅向钉钉 / Slack 运维群发送 1 条高价值决策级聚合通知 ]
2. 编写智能告警合并器 SemanticAlertMerger
在 crates/packet-ai/src/semantic_alert_merger.rs 中:
// crates/packet-ai/src/semantic_alert_merger.rs
use crate::adapter::LlmProviderAdapter;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RawIncidentAlert {
pub source_probe: String,
pub timestamp_ms: u64,
pub target_endpoint: String,
pub alert_message: String,
}
pub struct SemanticAlertMerger {
adapter: Arc<dyn LlmProviderAdapter>,
}
impl SemanticAlertMerger {
pub fn new(adapter: Arc<dyn LlmProviderAdapter>) -> Self {
Self { adapter }
}
/// 执行滑动窗口内的智能语义聚类与告警合并
pub async fn merge_and_deduplicate_alerts(
&self,
alerts: &[RawIncidentAlert],
) -> Result<String, String> {
let json_text = serde_json::to_string_pretty(alerts).map_err(|e| e.to_string())?;
let prompt = format!(
"你是一名顶级云原生运维告警治理专家。请对以下滑动窗口内收集到的多节点网络告警事件进行智能语义去重与同因合并:\n\n\
【原始告警列表】:\n{}\n\n\
请输出合并后的极简 Markdown 决策通知:\n\
1. 🎯 **根本故障事件(合并后的单一主事件)**;\n\
2. 📊 **波及范围与受影响节点数(统计涉及的探针与关联告警总数)**;\n\
3. 🔍 **不同现象背后的同因机理证明(一句话解释为什么这些异构报错本质相同)**;\n\
4. 🛠 **第一优先级修复建议**。",
json_text
);
let mut stream = self
.adapter
.stream_diagnose("告警语义降噪专家", &prompt)
.await
.map_err(|e| e.to_string())?;
let mut output = String::new();
use futures_util::StreamExt;
while let Some(chunk) = stream.next().await {
output.push_str(&chunk.unwrap_or_default());
}
Ok(output)
}
}
3. 告警风暴智能合并实测
模拟 15 秒内来自 3 个机房的 600 条异构报错:
- 节点 1 报:
TCP Reset from 10.0.0.88:80(300次); - 节点 2 报:
Upstream 502 Bad Gateway to 10.0.0.88:80(250次); - 节点 3 报:
DNS lookup timeout for auth.internal.mesh(50次)。
大模型输出的智能合并结果:
### 🎯 根本故障主事件 #1: 后端服务 10.0.0.88:80 进程异常崩溃
- **波及范围**:覆盖 Probe-01, Probe-02,共合并同质告警 **550 条(降噪率 99.8%)**;
- **同因证明**:TCP Reset 与 502 Bad Gateway 均系目标端口拒绝建立连接引发的次生表现,根因为 80 端口服务离线;
- **处置行动**:立即检查 10.0.0.88 宿主机上的 Nginx / Docker 容器健康状态。
### 🎯 根本故障主事件 #2: 内网 DNS 鉴权域名解析超时
- **波及范围**:Probe-03 捕获 50 条;
- **处置行动**:排查 CoreDNS 实例负载。
总结
引入基于语义相似度的 AI 告警治理体系:
- 将数千条嘈杂的异构告警合并为 2 条高可读性的根因摘要;
- 告警降噪率突破 99.5%;
- 彻底消灭了运维团队的“告警疲劳(Alert Fatigue)”,极大缩短了故障响应时间。
282



被折叠的 条评论
为什么被折叠?



