【AIOps】基于Prometheus+夜莺+Deepseek+Dify构建告警分析智能体
前言
目前市场上的大模型已经相对成熟,但大部分人都只是把它当成一个更加智能的对话机器人,使用方式也仅仅是你问我答,怎么用大模型来帮助我们更好的工作,甚至直接帮我们完成工作成为了日后发展不得不考虑的一个方向。于是有人提出了 AI Agent,先通过这张图片来了解一下什么是 AI Agent。
简单来说 AI Agent = 大模型 + 插件 + 工作流,大模型能够根据事件需求自主调用工具和工作流来完成用户需求
可能大家在日常运维工作中会想过以下场景:
- 快到下班时间了,让 AI 总结一下今天的告警
- 早上刚来到公司,让 AI 总结一下最近24小时的告警
这里讲一下怎么利用AI Agent实现
工作流程:
用户输入指令-->大模型拆解任务步骤-->调用时间工具获取当前时间-->形成自然语言和当前时间-->调用告警查询工具获取告警记录-->分析总结告警记录形成报告-->输出给用户
流程图:
1. 安装 Dify
$ git clone https://github.com/langgenius/dify.git
$ cd dify/docker
$ cp .env.example .env
$ docker-compose up -d
2. 接入模型供应商
我这边测试接入的是通义大模型,使用下来响应速度比较快(阿里请给我打钱),也支持接入其他模型厂商或自建的大模型,菜一点的的模型需要更多的提示词
3.创建工作流用于给Agent调用
- 创建获取当前时间和时间戳的工作流
执行工作流 --> 获取当前时间 --> 将当前时间转化为时间戳 --> 输出当前时间和时间戳
- 创建通过自然语言和当前时间查询数据库中告警记录并统计分析的工作流
输入自然语言和当前时间 --> 将自然语言和时间转化为 SQL --> 使用一段Python代码提取SQL --> SQL Client 执行SQL --> 进行统计分析 --> 返回执行结果
SQL生成大模型的提示词:
# 角色:
你是一名数据库专家,擅长将自然语言转换为SQL
# 要求:
1. 按我要求生成对应的SQL命令,
2. 使用时间戳来表示时间
3. 合理使用通配符
# 注意:
只需要输出is_recovered、group_name、hash、trigger_time、severity、recover_time、trigger_value、rule_name、tags、target_ident、字段,不要输出```sql和其他内容只输出SQL语句,
# alert_his_event表是告警记录表,表字段描述如下:
is_recovered 是否恢复,0为告警1为恢复
group_name 业务组名称
hash 哈希值
rule_name 规则名称
severity 告警级别,1:Emergency 2:Warning 3:Notice
notify_groups 告警接收组,团队id,多个空格分隔
target_ident 对象表中机器唯一标识信息
trigger_time 告警时间
trigger_value 告警值
recover_time 恢复时间
tags 标签k=v格式, tags字段中company为公司名称,env为环境类型,project为项目名称
我使用的是夜莺作为告警引擎,所有告警记录都会写到数据库的alert_his_event表中,将表字段描述以及标签意义作为提示词告诉大模型即可
4. 创建Agent
-
创建一个Agent,使用
DeepSeek-R1
大模型为基底,结合告警历史查询工作流、当前时间和时间戳获取工作流和时间戳转换工具 -
Agent的提示词:
# 角色: 你是一名计算机监控领域的专家, # 要求: 1. 根据告警查询历史数据整理成的报告, 2. 注意换行和回车符号, 3. 只输出报告不输出其他内容 4. 不要捏造不存在的信息 5. 以Markdown格式输出 # 工作步骤: 1. 第一步,使用 current_timestamp获取当前时间。 2. 使用alert_history_query查询告警历史, 3. 整理成Markdown格式报告。 # 排版要求以结构化格式输出告警事件报告: 1. 标题 2. 告警概览:告警数量、未恢复数量,已恢复数量 3. 关键发现:从告警级维度、业务组维度top5、项目维度top5、环境维度top5、规则维度top5,数据使用表格展示 4. 建议措施:紧急处理、优化建议 5. 总结 # 表字段描述: is_recovered 是否恢复0否1是 group_name 业务组名称 hash 哈希值 rule_name 规则名称 severity 告警级别,1:Emergency 2:Warning 3:Notice notify_groups 告警接收组,团队id,多个空格分隔 target_ident 对象表中机器唯一标识信息 trigger_time 告警时触发间,上海时区 trigger_value 告警值 recover_time 告警恢复时间,上海时区 tags 标签k=v格式, tags字段中company为公司名称,env为环境类型,project为项目名称 # 工具说明: alert_history_query是告警历史查询工具 current_timestamp是获取当前时间和时间戳的工具 timestamp_to_localtime是时间戳转换工具
常用指令测试
-
总结一下过去三天的告警
-
总结一下昨天的告警
这使用的是自然日,也就是当前时间的前一天00:00到23:59时间范围
注意,为了保证环境安全在查询数据库时使用只读账号进行。在测试的过程中,遇到的比较严重的问题就是目前大模型输入长度还是比较短,在一次性总结六百多条记录时超过了 Deepseek
的输入长度限制,出现了任务失败的情况,可以考虑切割时间进行分析。
参考链接:
数据库表结构 - alert_his_event - 《夜莺(Nightingale)v6.7 使用手册》 - 书栈网 · BookStack
需要智能体DSL文件的小伙伴,关注【运维小记】公众号回复【1331】获取!!