Dify+MCP实现告警报告生成
摘要:该日志处理系统包含多个功能节点,主要实现时间关键词提取(支持中英文数字转换)、告警数据统计(总告警数、恢复率、级别分布等)、主机/标签分析(限制30条)以及HTML报告自动生成。系统通过正则表达式处理输入,使用Google Chart.js生成可视化图表(饼图/折线图/柱状图),最终输出包含六大分析模块的专业报告:数据概览、每日趋势、告警级别、主机分布、标签分布及优化建议。各节点间通过JSO
Dify上:
日志总结工具

节点一-代码执行:
对输入的sys.query进行分词操作,获取到时间关键词。
import re
def main(arg1: str) -> dict:
patterns = {'year': r'(\d+|[一二三四五六七八九十]+)年',
'month': r'(\d+|[一二三四五六七八九十]+)个月',
'week': r'(\d+|[一二三四五六七八九十]+)周',
'day': r'(\d+|[一二三四五六七八九十]+)天',
'hour': r'(\d+|[一二三四五六七八九十]+)小时'}
month_days = 30
year_days = 365
week_days = 7
total_hours = 0
chinese_num_map = {'一': 1, '二': 2, '三': 3, '四': 4, '五': 5,
'六': 6, '七': 7, '八': 8, '九': 9, '十': 10}
for unit, pattern in patterns.items():
match = re.search(pattern, arg1)
if match:
value_str = match.group(1)
if value_str.isdigit():
value = int(value_str)
else:
value = chinese_num_map.get(value_str, 1) # 默认值为 1,如果未找到匹配
if unit == 'day':
total_hours += value * 24
elif unit == 'month':
total_hours += value * month_days * 24
elif unit == 'year':
total_hours += value * year_days * 24
elif unit == 'hour':
total_hours += value
elif unit == 'week':
total_hours += value * week_days * 24
return {"total_hours": total_hours}
节点二-数据获取MCP请求:
节点三-获取当前时间:
节点四-对请求的结果进行处理:
import json
def main(body: str) -> dict:
# 将 JSON 字符串转换为 Python 字典
data = json.loads(body)
# 从 overall_stats 提取关键信息
overall_stats = data.get("overall_stats", {})
time_offset = overall_stats.get("time_offset", 0)
alert_counts = overall_stats.get("alert_counts", {})
total_alerts = alert_counts.get("total_alerts", 0)
recovered_alerts = alert_counts.get("recovered_alerts", 0)
active_alerts = alert_counts.get("active_alerts", 0)
# 从 overall_stats 提取警报级别分布
alert_level_distribution = overall_stats.get("alert_level_distribution", {})
warning_count = alert_level_distribution.get("Warning", 0)
high_count = alert_level_distribution.get("High", 0)
# 从 overall_stats 提取主机分布(限制在 30 个元素以内)
host_distribution = overall_stats.get("host_distribution", {})
all_hosts = [{"host": k, "count": v} for k, v in list(host_distribution.items())[:30]]
# 从 overall_stats 提取标签分布(限制在 30 个元素以内)
tag_distribution = overall_stats.get("tag_distribution", {})
all_tags = [{"tag": k, "count": v} for k, v in list(tag_distribution.items())[:30]]
# 添加每日告警统计
daily_stats = data.get("daily_stats", {})
formatted_daily_stats = {}
for date, stats in daily_stats.items():
daily_alert_counts = stats.get("alert_counts", {})
daily_alert_level_distribution = stats.get("alert_level_distribution", {})
formatted_daily_stats[date] = {
"total_alerts": daily_alert_counts.get("total_alerts", 0),
"recovered_alerts": daily_alert_counts.get("recovered_alerts", 0),
"active_alerts": daily_alert_counts.get("active_alerts", 0),
"warning_count": daily_alert_level_distribution.get("Warning", 0),
"high_count": daily_alert_level_distribution.get("High", 0),
}
return {
"time_offset": time_offset,
"total_alerts": total_alerts,
"recovered_alerts": recovered_alerts,
"active_alerts": active_alerts,
"warning_count": warning_count,
"high_count": high_count,
"top_hosts": all_hosts,
"top_tags": all_tags,
"daily_stats": formatted_daily_stats # 添加每日统计
}
节点五-AI模型使用:
提示词:
你是一位专业的数据分析专家,请根据提供的监控数据以html格式生成一份详细的中文分析总结报告并且在报告中适当使用图表。图表应用goole chart.js图表应大小适中,居中显示,增强报告的可读性和说服力。确保图表清晰且不占据过多空间。报告内容应涵盖以下几个方面:
一、数据概述(告警趋势以饼图展示)
简要介绍数据的时间范围{{#1752646210378.time_offset#}}(基于"time_offset"字段),以及总告警数{{#1752646210378.total_alerts#}}("total_alerts")、已恢复告警数{{#1752646210378.recovered_alerts#}}("recovered_alerts")和活跃告警数{{#1752646210378.active_alerts#}}("active_alerts")。计算并展示总告警数和已恢复告警数的占比,分析数据反映出的系统整体告警趋势。例如:本次分析基于X小时的监控数据,共记录告警X条,其中已恢复告警X条(占比X%),活跃告警X条(占比X%)。数据表明系统在监控期间经历了较为频繁的告警事件,但恢复率较高,显示出较强的告警管理能力。
二、每日告警趋势分析(使用折线图展示每天的告警数)
分析每天的{{#1752646210378.daily_stats#}}告警数据,绘制每天的总告警数、已恢复告警数和活跃告警数的折线图,展示告警随时间的变化趋势。计算每天的告警恢复率,分析告警的波动情况及可能的原因。例如:从每日告警趋势可以看出,系统在某些日期的告警数量较高,可能与系统负载增加或特定事件有关。每日告警恢复率的波动也反映了运维团队在不同时期的响应效率。
三、告警级别分布(使用柱状图分析)
分析高危告警{{#1752646210378.high_count#}}("high_count")和警告告警{{#1752646210378.warning_count#}}("warning_count")的分布情况,计算各类告警的占比,评估系统的风险等级。例如:在告警级别分布中,高危告警X条(占比X%),警告告警X条(占比X%),其他告警X条(占比X%)。高危告警占比虽不高,但每一条都需要特别关注,因其可能对系统稳定性和业务连续性产生严重影响。警告告警占主导地位,说明系统存在较多需关注但非紧急的问题,可能是系统性能优化、资源配置调整等方面需要改进的信号。整体风险等级评估为中低风险,但需要密切关注高危告警的潜在影响,及时采取措施降低风险。
四、主机分布分析(使用面积图分析)
列出告警数量最多的主机{{#1752646210378.top_hosts#}}("top_hosts"),分析这些主机可能存在的问题或潜在风险。例如:告警数量排名前五的主机如下:
主机A:X条告警(占比X%),可能存在严重性能问题或配置不当,建议优先排查。
主机B:X条告警(占比X%),需要检查相关服务运行状态和资源使用情况。
主机C:X条告警(占比X%),可能涉及存储或网络方面的问题,需进一步分析。
主机D:X条告警(占比X%),建议关注其日志信息以确定具体故障原因。
主机E:X条告警(占比X%),可能为近期系统变更或升级导致的兼容性问题。
五、标签分布分析(使用折线图分析)
分析各监控指标{{#1752646210378.top_tags#}}("top_tags")的告警情况,如CPU使用率、磁盘空间、内存使用率、网络流量等,指出可能存在的性能瓶颈。例如:主要告警指标分布如下:
CPU相关告警:X条,占比X%。包括system.cpu.busy、system.cpu.load等指标告警,表明部分主机CPU资源紧张,可能存在CPU密集型任务或进程占用过多资源,建议优化相关应用或考虑增加CPU资源。
内存相关告警:X条,占比X%。如memory.usage等指标告警,提示内存不足问题,可能需要检查内存泄漏或优化内存使用效率。
磁盘空间告警:X条,占比X%。如vfs.fs.size等指标告警,显示部分磁盘分区空间不足,需及时清理无用文件或扩展存储容量。
网络流量告警:X条,占比X%。如net.if.in等指标告警,可能暗示网络带宽瓶颈或异常流量,建议监测网络性能并排查潜在的网络攻击或配置问题。
六、整体结论与建议
综合以上分析,给出对系统整体健康状况的评价,并提出可能的优化建议。例如:综合来看,系统整体健康状况处于中等水平。大部分告警能够及时恢复,表明告警管理系统和运维团队的响应能力较强。然而,高危告警的存在和部分主机、指标的频繁告警提示系统仍存在一些潜在风险和性能瓶颈。建议:
优先处理高危告警,深入分析其根本原因,采取紧急措施修复或缓解风险。
针对告警数量较多的主机进行全面检查,包括硬件性能、软件配置、日志分析等,找出共性问题并制定解决方案。
优化CPU、内存、磁盘和网络等资源的分配和使用,根据业务需求进行合理的扩容或资源调度策略调整。
定期对系统进行全面巡检和维护,及时发现并解决潜在问题,提高系统的稳定性和可靠性。
考虑完善告警分级分类管理机制,细化告警处理流程,提高运维效率和精准度。
生成的报告应结构清晰、逻辑连贯、语言简洁明了,适合向技术团队和管理层汇报。
节点六-代码执行:
对请求输出的内容进行处理,提取里面的html内容
import re
def main(body: str) -> dict:
# 提取 HTML 内容
html_content_match = re.search(r'```html(.*?)```', body, re.IGNORECASE | re.DOTALL)
if html_content_match:
# 获取匹配到的 HTML 内容
html_content = html_content_match.group(1).strip()
# 去除可能的多余换行符和空白字符
html_content = html_content.replace('\n', '').replace('\r', '').strip()
# 返回提取的 HTML 内容
return {
"html_content": html_content
}
else:
return {
"html_content": "No HTML content found."
}
节点七-MARKDOWN转html文件:
节点八-直接回复:
输出模型答复内容和html文件
运行过程:
输入的内容含有关键词则触发执行
结果包含文件和内容,可以点击文件下载
文件页面打开展示情况:
总结:
该日志处理系统包含多个功能节点,主要实现时间关键词提取(支持中英文数字转换)、告警数据统计(总告警数、恢复率、级别分布等)、主机/标签分析(限制30条)以及HTML报告自动生成。系统通过正则表达式处理输入,使用Google Chart.js生成可视化图表(饼图/折线图/柱状图),最终输出包含六大分析模块的专业报告:数据概览、每日趋势、告警级别、主机分布、标签分布及优化建议。各节点间通过JSON传递数据,支持中英混合时间单位换算为小时数,并对大数据集进行分页处理(限制30条展示)
MCP工具是让TraeAI编程生成的。主要处理数据库连接和数据分析处理
更多推荐
所有评论(0)