ascjreddy/Network-Monitoring-Incident-Response-Platform

GitHub: ascjreddy/Network-Monitoring-Incident-Response-Platform

该平台通过 syslog 收集、SNMP 轮询和拓扑感知的事件关联引擎,自动完成多设备网络环境中的故障根因分析与连锁影响追踪,将传统手动排查的 15-30 分钟缩短至 60 秒以内。

Stars: 2 | Forks: 1

# 网络监控事件响应平台 针对多设备网络环境的自动化根因分析和故障重构。 ## 为什么开发这个平台 当网络发生故障时,典型的响应方式是手动的:通过 SSH 登录到每台设备,在 syslog 中使用 grep 进行搜索,对比时间戳,并试图找出最先发生故障的节点。在多设备网络中,这个过程通常需要 15–30 分钟——而每过一分钟,如果错误地归责了故障点,或者以错误的顺序修复了正确的故障点,都会导致更多的停机时间。 我想要构建一个能自动完成这种关联分析的系统。只需为其提供网络拓扑,让它持续收集遥测数据,当发生故障时,它应该能在 60 秒内准确地告诉你是什么发生了故障、产生了什么连锁反应,以及应该如何解决。 ## 工作原理 三个 Python 脚本持续运行并协同工作: **`syslog_collector.py`** 在 GNS3 虚拟机上监听 UDP 514 端口。来自每台网络设备的每一条 syslog 消息都会到达这里,经过严重级别和设备身份的解析后,被写入 Windows 主机上的 PostgreSQL 中。 **`snmp_poller.py`** 每 30 秒通过 SNMP 轮询一次设备,检查可达性。结果会被存入同一个 PostgreSQL 数据库中。 **`incident_engine.py`** 在 Windows 上运行,每 30 秒查询一次数据库。它会检查过去 10 分钟的事件,对已知的故障特征应用模式匹配规则,遍历拓扑图以查找下游影响范围,并写入结构化的事件记录——包括根因设备、受影响的设备、时间线以及修复步骤。 Grafana 面板直接从 PostgreSQL 提取数据,并每 30 秒自动刷新一次。当事件触发时,你会立即看到它:活动事件计数器变红,事件日志显示完整的根因分析,并且 syslog 流显示触发该事件的原始事件。 ## 架构 ``` 9 GNS3 network devices (Cisco IOU) | | syslog UDP 514 SNMP every 30s | | syslog_collector.py snmp_poller.py (GNS3 VM) (GNS3 VM) | | +--------+----------+ | PostgreSQL (Windows host) 3 tables: syslog_events snmp_metrics incidents | incident_engine.py (Windows host) | +----------+-----------+ | | Grafana dashboard Incident reports (real-time panels) (root cause + fix) ``` ## 网络拓扑 跨越 4 层的 9 台设备运行 OSPF: ``` Edge-RTR-01 / \ Core-SW-01 Core-SW-02 | | Dist-HQ Dist-Branch / \ | Acc-SW1 Acc-SW2 Acc-SW3 ``` 关联引擎能够识别此拓扑。当 Core-SW-01 上的某个接口断开时,引擎会遍历该树状结构,并识别出 Dist-HQ、Acc-SW1、Acc-SW2 及其下游的所有设备——这些都是症状,而不是原因。 ## 引擎检测的内容 | 事件类型 | 检测逻辑 | |---|---| | 接口断开 | syslog 中包含 `LINEPROTO-5-UPDOWN` + `down` | | OSPF 邻居丢失 | syslog 中包含 `OSPF` + `ADJCHG` + `DOWN` | | 设备不可达 | SNMP 连续 90 秒以上报告 `unreachable` | | 链路震荡 (Link flapping) | 同一设备在 10 分钟内发生 5 次以上的 up/down 事件 | 故障的恢复检测采用相同的反向逻辑。当接口重新启动或 OSPF 邻接关系恢复时,事件将被标记为已解决,仪表板也会变回绿色。 有一个不太明显但值得一提的修复机制:在事件解决后,10 分钟的事件窗口中仍然包含最初的故障 syslog 消息。如果不对此进行处理,引擎将立即重新检测到相同的事件。解决方法是使用一个 `recently_resolved` 字典来跟踪 `(device, incident_type) → resolved_at` 时间戳。在每个引擎周期中,任何早于该时间戳的匹配事件都会被跳过。 ## 事件输出示例 ``` ============================================================ INCIDENT DETECTED -- 2026-06-01 02:57:28 ============================================================ Type: OSPF_NEIGHBOR_LOST Root Cause: Core-SW-01 Event: OSPF adjacency lost at 2026-06-01 02:57:22 Affected: Dist-HQ, Acc-SW1, Acc-SW2 Remediation: Verify OSPF config on both sides. Run: show ip ospf neighbor Check interface status. ------------------------------------------------------------ Timeline: 02:57:22 | Core-SW-01 | %OSPF-5-ADJCHG: Nbr 1.1.1.1 from FULL to DOWN 02:57:24 | Core-SW-01 | %LINEPROTO-5-UPDOWN: Ethernet0/0 changed to down ============================================================ ``` ## 技术栈 | 组件 | 工具 | |---|---| | 网络模拟器 | GNS3 | | 网络设备 | Cisco IOU-L3, Cisco IOU-L2 | | 遥测 | Python syslog 服务器 (UDP 514) + subprocess snmpget | | 数据库 | PostgreSQL 16 | | 面板 | Grafana | | 语言 | Python 3 | ## 运行说明 **前置条件:** 安装了 Cisco IOU 镜像的 GNS3,Python 3.9+,PostgreSQL,Grafana。 ``` git clone https://github.com/ascjreddy/Network-Monitoring-Incident-Response-Platform cd Network-Monitoring-Incident-Response-Platform pip install psycopg2-binary ``` 设置数据库(创建三张表——schema 位于 `architecture.md` 中)。 然后启动这三个脚本: ``` # 在 GNS3 VM 上 — 终端 1 sudo python3 syslog_collector.py # 在 GNS3 VM 上 — 终端 2 sudo python3 snmp_poller.py # 在 Windows 上 — PowerShell python incident_engine.py ``` 从 `grafana-dashboard.json` 导入 Grafana 面板。 在 Core-SW-01 上触发测试故障: ``` conf t interface Ethernet0/0 shutdown end ``` 引擎会在 60 秒内检测到它。使用 `no shutdown` 恢复接口,事件会自动解决。 ## 测试结果 **测试用例 1 — Core-SW-01 接口故障** 通过在 Core-SW-01 上关闭 Ethernet0/0 触发。引擎检测到了 OSPF_NEIGHBOR_LOST,并追踪到了 Dist-HQ 及下游接入层交换机的连锁反应。当接口重新启动时,事件已自动解决。 检测时间:从接口关闭到事件记录写入不到 60 秒。 涵盖汇聚层故障、OSPF 邻接丢失和误报预防的其他测试场景记录在 screenshots 文件夹中。
标签:Docker 部署, Grafana, PostgreSQL, 故障排查, 根因分析, 测试用例, 系统日志, 网络运维