首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于n8n和LLM的告警分析探索

基于n8n和LLM的告警分析探索

原创
作者头像
保持热爱奔赴山海
发布2025-11-30 18:00:09
发布2025-11-30 18:00:09
1930
举报
文章被收录于专栏:DevOpsDevOps

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

上面的这个图的大致流程:

1 人工触发流程(也可改为webhook触发,或者直接在alertmanger配一个webhook到发这里)

2 调用alertmanager的alerts接口,获取到非静默状态的活跃告警的大的列表

3 将大的告警列表转为逐个item,然后循环发给deepseek(或者其它LLM也可以)

4 LLM将分析的结果存到本地文件(因为返回的内容可能比较多,可能超过IM工具message阈值),然后将本地文件上传到OSS,最后通过IM将分析结果的url发出来。

大致代码如下:

访问alertmanager alert接口

代码语言:txt
复制
http://192.168.31.181:9093/api/v2/alerts

筛选出非屏蔽状态的告警清单的代码如下

代码语言:txt
复制
// 获取所有输入告警项
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(),
    }
  }
];

转为逐条的告警信息

代码语言:txt
复制
// 获取输入数据(应该是一个包含一个对象的数组,该对象有 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档