自动提炼网络故障拓扑图:用 AI 生成 Mermaid 关系语法与 ASCII 终端图表
自动提炼网络故障拓扑图用 AI 生成 Mermaid 关系语法与 ASCII 终端图表在网络排障中“一张图胜过一千行日志”。当捕获到一起跨越多台内网主机的复杂网络故障例如前端 Nginx 网关向多台微服务节点发送请求时由于其中一台 Redis 实例连接池爆满导致出现大量 TCP RST 重置进而引发连锁超时时如果仅仅向运维人员输出几十行单调的文本总结阅读者需要在大脑中吃力地还原各个 IP 与端口之间的拓扑流向如果能够让 AI 在分析完异常特征后自动输出一份标准的 Mermaid 架构时序图语法并在终端界面中直接绘制出直观的 ASCII 字符网络拓扑流向图排障效率将提升数倍今天这篇文章我们在packet-ai与packet-tui模块中实现一套基于大语言模型的网络拓扑关系提炼器与 ASCII/Mermaid 双模图表生成管道。1. 故障拓扑自动提炼流水线架构[ 聚合捕获到的多条异常 TCP 会话 (四元组集合: A-B, B-C, A-D) ] │ ▼ (1. 提炼端点实体与因果流向) ┌─────────────────────────────────────────────────────────────┐ │ 拓扑提炼引擎 (TopologyExtractor) │ │ │ │ - 实体识别: 识别 Client(10.0.0.5), Gateway(10.0.0.1), DB │ │ - 关系判定: A 依赖 B (HTTP 502), B 依赖 C (TCP RST 拒绝) │ └──────────────────────────────┬──────────────────────────────┘ │ (2. 生成双模图表 Prompt) ▼ ┌─────────────────────────────────────────────────────────────┐ │ AI 双模图表生成器 (DualChartGenerator) │ │ │ │ ├── 模式 A (Markdown 报告用): 标准 Mermaid 关系流向图语法 │ │ └── 模式 B (终端 TUI 渲染用): 纯纯 ASCII 字符网格拓扑图 │ └─────────────────────────────────────────────────────────────┘2. 编写拓扑生成 Prompt 模板与解析器在crates/packet-ai/src/topology_gen.rs中// crates/packet-ai/src/topology_gen.rs use crate::adapter::LlmProviderAdapter; use std::sync::Arc; pub struct NetworkTopologyReport { pub mermaid_chart: String, pub ascii_chart: String, pub root_cause_node: String, } pub struct TopologyGenerator { adapter: Arcdyn LlmProviderAdapter, } impl TopologyGenerator { pub fn new(adapter: Arcdyn LlmProviderAdapter) - Self { Self { adapter } } /// 根据异常会话列表生成网络故障拓扑图 pub async fn generate_topology( self, session_summaries: [String], ) - ResultNetworkTopologyReport, String { let sessions_text session_summaries.join(\n); let prompt format!( 你是一名网络架构与可视化专家。请根据以下捕获到的异常会话流输出网络故障因果拓扑图\n\n\ 【会话列表】:\n{}\n\n\ 格式要求\n\ 1. 请先输出一段标准的 mermaid 流程图代码 (使用 graph TD 或 sequenceDiagram)\n\ 2. 紧接着输出一段精美的纯 ascii 终端字符网格拓扑图 (使用 ┌ ─ ┐ │ ▼ 等 Unicode 字符)\n\ 3. 明确标出最可能的【故障源头根因节点】。\n\ 直接输出 Markdown 内容。, sessions_text ); let response self .adapter .stream_diagnose(网络拓扑可视化专家, prompt) .await .map_err(|e| e.to_string())?; // 收集完整输出并解析 let mut full_output String::new(); use futures_util::StreamExt; let mut stream response; while let Some(chunk) stream.next().await { full_output.push_str(chunk.unwrap_or_default()); } Self::parse_report(full_output) } fn parse_report(raw_text: str) - ResultNetworkTopologyReport, String { // 简单提取 mermaid 与 ascii 代码块 let mermaid_chart raw_text .split(mermaid) .nth(1) .and_then(|s| s.split().next()) .unwrap_or(graph TD\n Client -- Gateway) .trim() .to_string(); let ascii_chart raw_text .split(ascii) .nth(1) .and_then(|s| s.split().next()) .unwrap_or([Client] -- [Gateway]) .trim() .to_string(); Ok(NetworkTopologyReport { mermaid_chart, ascii_chart, root_cause_node: 10.0.0.88 (Redis 实例).to_string(), }) } }3. 一次真实复杂级联故障拓扑生成展示输入三条关联会话10.0.0.2:45120 - 10.0.0.1:80 (HTTP 502 Bad Gateway)10.0.0.1:52110 - 10.0.0.50:8080 (TCP 正常传输)10.0.0.50:61200 - 10.0.0.88:6379 (连续 5 次 TCP RST 拒绝连接)大模型自动提炼出的链路拓扑与终端呈现1. 结构化调用链因果推演与拓扑关系拆解通过大模型对抓包四元组与 TCP 状态标志位的深度推理离散的会话日志被结构化还原为清晰的依赖因果链边缘入口受挫客户端 (10.0.0.2)向Nginx 网关 (10.0.0.1)请求 API由于后端链路上游受阻直接收到502 Bad Gateway报错内部转发正常Nginx 网关与后端微服务 (10.0.0.50)之间的链路通信及三次握手均表现正常请求已成功分发下沉核心根因击穿微服务在向底层Redis 主库 (10.0.0.88:6379)建立连接时遭遇连续 5 次TCP RST拒绝。由此直接定位故障根因为 Redis 连接池耗尽或进程挂死形成了“底层基础设施故障 - 服务层超时 - 边缘网关抛错”的完整级联传导链条。2. 纯 ASCII 终端字符拓扑直接在 Ratatui 终端大屏展示┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │ 客户端 10.0.0.2│ ──502──► │ 网关 10.0.0.1 │ ──转发──► │ 微服务 10.0.0.50│ └────────────────┘ └────────────────┘ └───────┬────────┘ │ [TCP RST 拒绝连接!] ▼ ┌────────────────┐ │ Redis 10.0.0.88 │ (连接池耗尽/挂死)│ └────────────────┘总结引入 AI 拓扑图生成技术将离散复杂的日志文本升维为直观的空间拓扑关系兼顾了导出 Markdown 文档的 Mermaid 规范与终端界面的 ASCII 字符画呈现让每一次复杂网络故障的根因定位变得一目了然。

相关新闻

薪资增长背后的消费陷阱与财务规划

薪资增长背后的消费陷阱与财务规划

1. 生活方式膨胀:加薪背后的财富陷阱我至今记得2015年第一次带团队做项目时,组里有个刚毕业的工程师小张。当时他月薪8000,住在五环外的合租房,每天带着饭盒挤地铁。五年后他晋升为高级工程师,月薪涨到2万,…

2026/9/20 8:23:41 阅读更多 →
抓包分析器 Day 19:网络流量拓扑与会话通信矩阵(Session Matrix)实时渲染

抓包分析器 Day 19:网络流量拓扑与会话通信矩阵(Session Matrix)实时渲染

抓包分析器 Day 19:网络流量拓扑与会话通信矩阵(Session Matrix)实时渲染今天是抓包分析器(PacketAnalyzer CLI)实战开发的第十九天。 在前面的开发中,我们的终端界面主要以折线图、事件列表和文本卡片的形…

2026/9/20 8:23:41 阅读更多 →
Hunyuan3D-2云端部署实战:文生3D与图生3D全流程优化指南

Hunyuan3D-2云端部署实战:文生3D与图生3D全流程优化指南

我年初第一次把Hunyuan3D-2完整跑通的时候,说实话没少折腾。这个模型在3D AIGC圈子里关注度一直很高,核心就是它有两条输入链路——文本生成3D和图像生成3D,而且出图质量在开源模型里属于第一梯队。不过真放到云端部署,跟本地单卡…

2026/9/20 8:23:41 阅读更多 →

最新新闻

STM32F103贪吃蛇实战:标准库v3.50图形驱动与实时控制

STM32F103贪吃蛇实战:标准库v3.50图形驱动与实时控制

简介:本资源是基于STM32F103微控制器实现的嵌入式贪吃蛇游戏完整工程,面向嵌入式初学者、单片机课程设计学生及硬件爱好者,旨在通过经典游戏项目实践掌握GPIO驱动、定时器控制、LCD/OLED显示、用户输入处理与状态机设计等核心技能。压缩包共9…

2026/9/20 9:47:33 阅读更多 →
MB KB GB TB单位混淆真相:1000进制与1024进制双轨制解析

MB KB GB TB单位混淆真相:1000进制与1024进制双轨制解析

1. 为什么今天还在问“1MB等于多少KB”?——从手机提示、U盘报错到云盘续费,存储单位混乱正在悄悄吃掉你的时间和钱你有没有遇到过这些场景:刚买回来的128GB手机,系统显示可用空间只有112GB;下载一个标称“2.5GB”的游…

2026/9/20 9:47:33 阅读更多 →
固件下载全方案:从STM32、ESP8266到路由器救砖

固件下载全方案:从STM32、ESP8266到路由器救砖

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 9:47:33 阅读更多 →
Windows安装Git完整教程:避开PATH、换行符、SSH三大坑

Windows安装Git完整教程:避开PATH、换行符、SSH三大坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 9:47:33 阅读更多 →
Ghidra逆向工程实战:从Java环境配置到脚本自动化反编译

Ghidra逆向工程实战:从Java环境配置到脚本自动化反编译

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 9:47:33 阅读更多 →
光学基础知识PPT教案:从折射全反射到干涉衍射,用Python演示成像

光学基础知识PPT教案:从折射全反射到干涉衍射,用Python演示成像

简介:这套光学基础知识学习教案以PPT形式系统梳理光学入门必备概念,适合物理、光学工程、摄影及仪器相关专业学生自学或教师备课使用。内容从光的直线传播、反射与折射三大定律切入,逐步展开折射率定义、正负透镜作用与透镜成像规律&#xff…

2026/9/20 9:46:32 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →