这块个人还处于探索阶段,流程里还可能存在考虑不全面的地方。

上面的这个图的大致流程:
1 人工触发流程(也可改为webhook触发,或者直接在alertmanger配一个webhook到发这里)
2 调用alertmanager的alerts接口,获取到非静默状态的活跃告警的大的列表
3 将大的告警列表转为逐个item,然后循环发给deepseek(或者其它LLM也可以)
4 LLM将分析的结果存到本地文件(因为返回的内容可能比较多,可能超过IM工具message阈值),然后将本地文件上传到OSS,最后通过IM将分析结果的url发出来。
大致代码如下:
访问alertmanager alert接口
http://192.168.31.181:9093/api/v2/alerts筛选出非屏蔽状态的告警清单的代码如下
// 获取所有输入告警项
const inputItems = $input.all();
// 过滤出 status.state 不是 "suppressed" 的告警
const filteredAlerts = inputItems.filter(item => {
const alert = item.json;
const state = alert.status?.state;
// 只保留 state 存在且不等于 "suppressed" 的告警
return state && state !== 'suppressed';
});
// 可选:进一步提取关键字段(让数据更干净)
const processedAlerts = filteredAlerts.map(item => {
const alert = item.json;
const labels = alert.labels || {};
const annotations = alert.annotations || {};
return {
alertName: labels.alertname || 'Unknown',
severity: labels.severity || 'unknown',
instance: labels.instance || 'N/A',
job: labels.job || 'N/A',
cluster: labels.cluster || 'N/A',
summary: annotations.summary || '',
description: annotations.description || '',
state: alert.status?.state || 'unknown',
startsAt: alert.startsAt,
endsAt: alert.endsAt,
updatedAt: alert.updatedAt,
fingerprint: alert.fingerprint,
generatorURL: alert.generatorURL,
};
});
// 返回结果(只包含非 suppressed 告警)
return [
{
json: {
alerts: processedAlerts,
total: processedAlerts.length,
filteredOut: inputItems.length - processedAlerts.length,
timestamp: new Date().toISOString(),
}
}
];转为逐条的告警信息
// 获取输入数据(应该是一个包含一个对象的数组,该对象有 alerts 字段)
const inputItem = $input.first();
if (!inputItem || !inputItem.json || !Array.isArray(inputItem.json.alerts)) {
throw new Error("Input data is invalid or missing 'alerts' array");
}
// 提取 alerts 数组
const alerts = inputItem.json.alerts;
// 将每个 alert 转换为一个独立的 item
const resultItems = alerts.map(alert => {
return {
json: alert // 每条告警作为单独的 item 的 json 字段
};
});
// 返回多个 item(n8n 会自动展开)
return resultItems;
将LLM生成的结果写到本地文件中

上传文件到oss

这里稍微费事的是将LLM返回的内容写到文件中,试了code功能下没成功(可能是我的JS太弱了)。于是改为使用shell命令的方式,在n8n的机器上写个shell脚本,如下:

IM通知带上oss链接

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。