提交 0da15710 authored 作者: 陈泽健's avatar 陈泽健

feat(skills): 新增ARM集群监控完整代码实现,升级X86集群监控至v2.0

- ARM-CLUSTER-MONITOR: 新增PRD文档、计划执行记录、完整监控代码实现
  - ssh_manager/config_parser/system_monitor/container_monitor
  - middleware_monitor/cluster_consistency/log_analyzer/monitor_agent
  - report_generator + README + requirements
- X86-CLUSTER-MONITOR: 代码升级v2.0,增强集群一致性监控能力
  - server_checker/report_generator/main 等核心模块重构
  - config.json 更新集群配置
- X86-QLV10-XTYBS/X86-TX-XTYBS: 新增code目录、更新SKILL.md、计划执行模板
- 集群信息配置表: 补发达梦数据库配置、Redis/MySQL密码信息
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 1e7ae2e8
# ARM集群夜间监控系统
## 项目概述
本系统用于监测9网段四台ARM架构服务器集群的服务健康状态,支持定时监控(夜间22:00至次日09:00,每2小时一次),输出详细分析报告并以日期时间命名。
## 目录结构
```
.claude/skills/ARM-CLUSTER-MONITOR/
├── SKILL.md # Skill说明文档
├── 集群信息配置表.md # 集群配置文件
├── PRD_ARM集群夜间监控系统.md # PRD需求文档
├── 计划执行_20260709_143000.md # 计划执行文档
├── README.md # 本文件
└── code/ # 代码目录
├── ssh_manager.py # SSH连接管理
├── config_parser.py # 配置解析
├── system_monitor.py # 系统资源监测
├── container_monitor.py # 容器状态监测
├── middleware_monitor.py # 中间件集群监测
├── log_analyzer.py # 日志分析
├── cluster_consistency.py # 集群一致性检查
├── report_generator.py # 报告生成器
├── monitor_agent.py # 主监控调度器
├── main.py # 主入口脚本
└── requirements.txt # Python依赖清单
```
## 代码统计
- **总代码行数**: 5089行
- **Python模块数**: 10个
- **代码注释率**: ≥80%(全中文注释)
- **编码格式**: UTF-8
## 快速开始
### 1. 安装依赖
```bash
cd .claude/skills/ARM-CLUSTER-MONITOR/code
pip install -r requirements.txt
```
### 2. 执行监控
#### 方式一:立即执行一次监控
```bash
python main.py
```
#### 方式二:启动定时监控(22:00-09:00每2小时)
```bash
python main.py 定时
```
#### 方式三:配置SSH免密登录
```bash
python main.py 配置免密
```
#### 方式四:查看定时任务状态
```bash
python main.py 定时状态
```
#### 方式五:停止定时监控
```bash
python main.py 定时停止
```
## 核心功能
### 1. SSH免密连接管理
- 自动检测并配置SSH免密登录
- 免密优先、密码备用的连接策略
- 支持sudo环境下的命令执行
- 连接失败重试机制(3次)
### 2. 系统资源监测
- CPU使用率监测
- 内存使用率监测
- 磁盘使用率监测
- 网络连接数监测
- 阈值判定(WARNING/CRITICAL)
### 3. 容器状态监测
- Docker容器状态检查
- 容器健康检查状态判断
- 容器重启次数统计
- 容器资源使用监测
- 端口监听检查
### 4. 中间件集群监测(核心)
#### Redis哨兵模式
- 主节点存活检查
- 从节点同步状态检查(slave_repl_offset)
- 哨兵进程状态检查(3个哨兵)
- 主从切换风险检测
#### EMQX集群
- 集群节点连通性检查
- 集群会话共享状态检查
- MQTT连接数和订阅数统计
#### Nacos集群
- 集群节点健康检查
- 配置一致性检查
- 控制台登录异常检测(已知问题匹配)
#### MySQL数据库
- 数据库连接测试
- 数据库查询测试
#### 达梦数据库
- dm8-server容器状态检查
- 数据库连接测试
#### FastDFS集群
- Tracker和Storage进程状态检查
- 文件上传功能测试
### 5. 日志分析
- 日志文件大小统计
- ERROR/WARN统计
- 异常堆栈提取
- 关键错误模式匹配
- 上下文压缩策略
### 6. 集群一致性检查
- 服务版本一致性检查
- 配置一致性检查
- 节点连通性检查
- 集群整体健康评分计算
### 7. 报告生成
- Markdown格式报告生成
- 文件命名(日期时间格式)
- 报告模板填充(十部分内容)
- 控制台摘要输出
## 报告内容结构
监控报告包含以下十部分:
1. **集群节点状态总览**
2. **集群横向对比 - 系统资源**
3. **集群横向对比 - 容器状态**
4. **集群横向对比 - 中间件功能**
5. **集群一致性检查**
6. **各节点详细监控数据**
7. **集群告警汇总**
8. **集群健康评分**
9. **处置建议**
10. **监控覆盖率**
## 输出示例
### 控制台输出
```
[信息] 开始检查系统资源: 192.168.9.89
[成功] CPU使用率: 45%
[成功] 内存使用率: 72%
[成功] 磁盘使用率: 65%
[信息] 开始检查容器状态: 192.168.9.89
[成功] 总容器数: 14
[成功] 运行中: 14
[信息] 开始检查中间件状态: 192.168.9.89
[成功] Redis哨兵模式: 正常
[成功] EMQX集群: 正常
[成功] Nacos集群: 正常
```
### 报告文件
- **文件名**: `arm_cluster_monitor_20260709_220000.md`
- **存储位置**: `AuxiliaryTool/ScriptTool/ServiceMonitor/reports/arm_cluster/`
## 模块测试
每个模块都包含测试函数,可以独立测试:
```bash
# 测试SSH连接管理
python ssh_manager.py
# 测试配置解析
python config_parser.py
# 测试系统资源监测
python system_monitor.py
# 测试容器状态监测
python container_monitor.py
# 测试中间件集群监测
python middleware_monitor.py
# 测试日志分析
python log_analyzer.py
# 测试集群一致性检查
python cluster_consistency.py
# 测试报告生成器
python report_generator.py
# 测试主监控调度器
python monitor_agent.py
```
## 配置说明
### 集群信息配置表
所有服务器配置都在 `集群信息配置表.md` 文件中,包括:
- 四台服务器节点信息(IP、用户名、密码、角色、服务列表)
- 中间件集群配置(Redis哨兵、EMQX、Nacos等)
- 已知问题列表(用于告警抑制)
### SSH免密配置
免密凭据存储在 `.ssh/免密_{服务器IP}/` 目录下:
- `id_rsa`: 私钥文件
- `id_rsa.pub`: 公钥文件
- `known_hosts`: 主机指纹
## 技术架构
### 三层验证模式
- **L1 容器层**: docker inspect 存活状态
- **L2 网络层**: 端口监听检查(ss -tln)
- **L3 功能层**: 实际功能测试(数据库连接、MQTT连接等)
### 上下文压缩策略
根据SKILL.md要求,实现了上下文压缩:
- 日志超过100行时使用统计摘要代替原文
- 各Agent返回摘要而非完整数据
- 报告生成后立即写入磁盘,不在内存中保留
## 告警级别
| 级别 | 触发条件 | 处理建议 |
|------|---------|---------|
| INFO | 正常状态变化 | 仅记录 |
| WARNING | 资源使用率超阈值 | 关注,考虑扩容 |
| ERROR | 服务异常/容器退出 | 立即处理 |
| CRITICAL | 核心服务不可用 | 紧急处理 |
## 已知问题
系统会自动匹配已知问题列表,避免重复排查:
- **unacos**: 控制台登录失败user not found(业务面正常,勿restart)
- **ujava2**: 启动后预定返回500(Java启动约12分钟,等待就绪)
## 注意事项
1. **监控时段**: 仅在夜间22:00-09:00执行,白天不自动触发
2. **sudo环境**: 所有节点需要sudo权限(openkylin用户)
3. **上下文限制**: 200k tokens上限,已实现压缩策略
4. **SSH连接超时**: 10秒超时,避免长时间等待
5. **日志分析限制**: 默认分析最近100行,超过使用摘要
## 扩展功能
- [ ] 集群拓扑可视化
- [ ] 集群故障自动恢复
- [ ] 集群负载均衡分析
- [ ] 集群历史趋势图表
- [ ] 集群告警钉钉通知
- [ ] 集群容量规划建议
## 作者信息
- **作者**: Claude Code
- **创建时间**: 2026-07-09
- **版本**: v1.0
- **许可**: 内部使用
## 相关文档
- [SKILL.md](../SKILL.md) - Skill说明文档
- [PRD_ARM集群夜间监控系统.md](../PRD_ARM集群夜间监控系统.md) - PRD需求文档
- [计划执行_20260709_143000.md](../计划执行_20260709_143000.md) - 计划执行文档
- [集群信息配置表.md](../集群信息配置表.md) - 集群配置文件
\ No newline at end of file
此差异已折叠。
# -*- coding: utf-8 -*-
"""
主入口脚本
功能:
1. 命令行参数解析
2. 定时任务启动逻辑
3. 监控执行入口
4. 错误处理
支持命令:
- python main.py # 立即执行一次集群监控
- python main.py 定时 # 启动定时监控(22:00-09:00每2h)
- python main.py 定时状态 # 查看定时任务状态
- python main.py 定时停止 # 停止定时监控任务
- python main.py 配置免密 # 为四台服务器配置SSH免密登录
作者:Claude Code
创建时间:2026-07-09
"""
import sys
import os
from datetime import datetime
# 导入监控调度器
from monitor_agent import MonitorAgent
def main():
"""
主入口函数
"""
# 解析命令行参数
args = sys.argv[1:] if len(sys.argv) > 1 else []
# 根据参数执行对应功能
if len(args) == 0:
# 默认:立即执行一次集群监控
run_immediate_monitor()
elif args[0] == '定时':
# 启动定时监控
if len(args) > 1 and args[1] == '状态':
show_schedule_status()
elif len(args) > 1 and args[1] == '停止':
stop_schedule()
else:
start_schedule()
elif args[0] == '配置免密':
# 配置SSH免密登录
configure_ssh_keys()
else:
# 未知命令
print(f"[错误] 未知命令: {args[0]}")
print_usage()
def run_immediate_monitor():
"""
立即执行一次集群监控
"""
print("=" * 60)
print("ARM集群夜间监控 - 立即执行模式")
print("=" * 60)
print(f"执行时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
try:
# 创建监控调度器
agent = MonitorAgent()
# 执行完整监控流程
summary = agent.run_full_monitor()
# 输出执行结果
if summary.get('status') == 'success':
print("\n" + "=" * 60)
print("监控执行成功")
print("=" * 60)
print(f"节点数: {summary.get('node_count', 0)}")
print(f"已监控: {summary.get('monitored_nodes', 0)}")
print(f"整体状态: {summary.get('overall_status', 'unknown')}")
print(f"健康评分: {summary.get('health_score', 0)}/100")
print(f"告警数: {summary.get('alert_count', 0)}")
print(f"报告路径: {summary.get('report_path', '')}")
print("=" * 60)
else:
print("\n" + "=" * 60)
print("监控执行失败")
print("=" * 60)
print(f"原因: {summary.get('message', '未知错误')}")
print("=" * 60)
except Exception as e:
print(f"\n[错误] 监控执行异常: {str(e)}")
handle_error(e)
def start_schedule():
"""
启动定时监控任务(22:00-09:00每2小时)
注:此方法为Python脚本版本的定时启动逻辑。
在Claude Code环境中,应使用CronCreate工具创建定时任务。
"""
print("=" * 60)
print("ARM集群夜间监控 - 定时任务启动")
print("=" * 60)
print("\n[信息] 定时监控配置:")
print(" - 时间段: 22:00 - 09:00")
print(" - 执行间隔: 每2小时")
print(" - 执行时间点: 22:00, 00:00, 02:00, 04:00, 06:00, 08:00")
print(" - 每夜执行次数: 6次")
print("\n[提示] 在Claude Code环境中,请使用以下方式启动定时任务:")
print(" /ARM-CLUSTER-MONITOR 定时")
print("\n[提示] 或者使用Claude Code的CronCreate工具:")
print(" CronCreate:")
print(" cron: '0 22,0,2,4,6,8 * * *'")
print(" prompt: '/ARM-CLUSTER-MONITOR'")
print(" recurring: true")
print(" durable: true")
print("\n[信息] Python脚本版本不支持独立定时任务,")
print(" 请在Claude Code环境中使用上述命令启动。")
def show_schedule_status():
"""
查看定时任务状态
"""
print("=" * 60)
print("ARM集群夜间监控 - 定时任务状态")
print("=" * 60)
print("\n[提示] 在Claude Code环境中,请使用以下方式查看定时任务:")
print(" /ARM-CLUSTER-MONITOR 定时状态")
print(" 或使用 /cron 命令查看所有定时任务")
print("\n[提示] Python脚本版本不支持独立定时任务管理。")
def stop_schedule():
"""
停止定时监控任务
"""
print("=" * 60)
print("ARM集群夜间监控 - 停止定时任务")
print("=" * 60)
print("\n[提示] 在Claude Code环境中,请使用以下方式停止定时任务:")
print(" /ARM-CLUSTER-MONITOR 定时停止")
print(" 或使用 CronDelete 工具删除定时任务")
print("\n[提示] Python脚本版本不支持独立定时任务管理。")
def configure_ssh_keys():
"""
为四台服务器配置SSH免密登录
"""
print("=" * 60)
print("ARM集群夜间监控 - 配置SSH免密登录")
print("=" * 60)
print("\n[信息] SSH免密配置流程:")
print(" 1. 在本地生成RSA密钥对(如不存在)")
print(" 2. 通过SSH连接远程服务器(首次使用密码)")
print(" 3. 将公钥上传到远程服务器 authorized_keys")
print(" 4. 保存免密凭据到本地 .ssh/免密_{服务器IP}/ 目录")
print(" 5. 后续连接优先使用免密模式")
try:
# 创建监控调度器(会自动连接服务器)
agent = MonitorAgent()
# 加载配置
if not agent.load_config():
print("[错误] 配置文件加载失败,无法配置免密")
return
print(f"\n[信息] 检测到 {len(agent.servers)} 台服务器")
# 连接所有服务器(会自动配置免密)
connect_results = agent.connect_to_all_servers()
# 输出配置结果
success_count = sum(1 for v in connect_results.values() if v)
print(f"\n[汇总] 免密配置成功: {success_count}/{len(agent.servers)} 台")
for ip, success in connect_results.items():
status = '✅ 成功' if success else '❌ 失败'
print(f" - {ip}: {status}")
# 关闭连接
agent.close_all_connections()
print("\n[完成] SSH免密配置流程结束")
except Exception as e:
print(f"\n[错误] SSH免密配置异常: {str(e)}")
handle_error(e)
def print_usage():
"""
打印使用帮助
"""
print("\n" + "=" * 60)
print("ARM集群夜间监控 - 使用说明")
print("=" * 60)
print("\n命令格式: python main.py [命令] [参数]")
print("\n可用命令:")
print(" 无参数 立即执行一次集群监控")
print(" 定时 启动定时监控(22:00-09:00每2h)")
print(" 定时 状态 查看定时任务状态")
print(" 定时 停止 停止定时监控任务")
print(" 配置免密 为四台服务器配置SSH免密登录")
print("\nClaude环境命令:")
print(" /ARM-CLUSTER-MONITOR 立即执行监控")
print(" /ARM-CLUSTER-MONITOR 定时 启动定时监控")
print(" /ARM-CLUSTER-MONITOR 定时状态 查看定时状态")
print(" /ARM-CLUSTER-MONITOR 定时停止 停止定时任务")
print(" /ARM-CLUSTER-MONITOR 配置免密 配置SSH免密")
print("\n" + "=" * 60)
def handle_error(error: Exception):
"""
错误处理函数
Args:
error: 异常对象
"""
print("\n" + "=" * 60)
print("错误处理")
print("=" * 60)
# 错误类型判定
error_type = type(error).__name__
error_message = str(error)
print(f"\n错误类型: {error_type}")
print(f"错误信息: {error_message}")
# 根据错误类型给出处置建议
suggestions = []
if 'Connection' in error_type or 'SSH' in error_type or 'socket' in error_type.lower():
suggestions.append("检查网络连通性")
suggestions.append("检查SSH服务是否运行")
suggestions.append("检查防火墙配置")
suggestions.append("检查SSH密码是否正确")
elif 'File' in error_type or 'IO' in error_type:
suggestions.append("检查配置文件是否存在")
suggestions.append("检查文件权限")
suggestions.append("检查磁盘空间")
elif 'Key' in error_type or 'Auth' in error_type:
suggestions.append("检查SSH免密配置")
suggestions.append("重新生成SSH密钥对")
suggestions.append("检查authorized_keys配置")
else:
suggestions.append("检查Python环境")
suggestions.append("检查依赖包是否安装")
suggestions.append("查看详细日志定位问题")
print("\n处置建议:")
for idx, suggestion in enumerate(suggestions, 1):
print(f" {idx}. {suggestion}")
print("\n[提示] 如问题无法解决,请联系运维人员或查看 Troubleshoot skill")
print("=" * 60)
if __name__ == "__main__":
# 执行主函数
try:
main()
except KeyboardInterrupt:
print("\n[信息] 用户中断,程序退出")
except Exception as e:
print(f"\n[错误] 程序异常退出: {str(e)}")
handle_error(e)
\ No newline at end of file
此差异已折叠。
# X86集群监控依赖
# X86集群监控依赖
paramiko>=2.7.2
requests>=2.28.0
colorama>=0.4.6
python-dateutil>=2.8.2
\ No newline at end of file
colorama>=0.4.6
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论