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

docs(PRDAI服务器监测): 删除AI服务器监测需求文档,处理字符编码问题

- 移除整个PRD需求文档,包括服务器配置、工作流程、各类检测步骤等内容
- 删除了包含SSH连接、基础信息采集、资源使用检测等完整巡检流程
- 移除了MySQL、Redis、EMQX、Java应用等各类服务的检测方案
- 清理了Docker容器、网络分析、系统日志等深度检测相关内容
- 删除了安全检测和各类应用日志分析的详细步骤
上级 ead4ed00
...@@ -144,7 +144,14 @@ ...@@ -144,7 +144,14 @@
"Bash(python3 log_monitor.py)", "Bash(python3 log_monitor.py)",
"Bash(dir E:\\\\GithubData\\\\ubains-module-test\\\\Docs\\\\PRD\\\\日志监测 *)", "Bash(dir E:\\\\GithubData\\\\ubains-module-test\\\\Docs\\\\PRD\\\\日志监测 *)",
"Bash(dir E:\\\\GithubData\\\\ubains-module-test\\\\Docs\\\\PRD\\\\日志监测\\\\服务日志分析结果 *)", "Bash(dir E:\\\\GithubData\\\\ubains-module-test\\\\Docs\\\\PRD\\\\日志监测\\\\服务日志分析结果 *)",
"Bash(dir *)" "Bash(dir *)",
"Bash(python3 -c ' *)",
"Bash(powershell.exe -NoProfile -Command \"Get-Content check_server_health.ps1 -Encoding UTF8 | Select-Object -Index 0,1 | Select-Object -First 3\")",
"Bash(powershell.exe -NoProfile -ExecutionPolicy Bypass -File \"fix_encoding.ps1\")",
"Bash(powershell.exe -NoProfile -ExecutionPolicy Bypass -Command '& { $content = Get-Content '\\\\''check_server_health.ps1'\\\\'' -Raw -Encoding UTF8; $content[0..100] -join '\\\\'''\\\\'' }')",
"Bash(powershell.exe -NoProfile -ExecutionPolicy Bypass -Command \"try { . .\\\\check_server_health.ps1 -ErrorAction Stop 2>&1 | Select-Object -First 10 } catch { Write-Host '语法错误' }\")",
"Bash(python3)",
"Bash(powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ' *)"
] ]
} }
} }
# PowerShell脚本修复辅助脚本
# 用于修复check_server_health.ps1的编码和语法问题
$scriptPath = "check_server_health.ps1"
# 读取文件内容
$content = Get-Content $scriptPath -Raw -Encoding UTF8
# 修复所有的问题字符串
$content = $content -replace '检测失败或无数据`n"', '检测失败或无数据`n"'
$content = $content -replace '\$([^)]+)\.Name', '${_}.Name'
$content = $content -replace '\$([^)]+)\.Value', '${_}.Value'
$content = $content -replace '\$([^)]+)\.Status', '${_}.Status'
$content = $content -replace '\$([^)]+)\.Threshold', '${_}.Threshold'
$content = $content -replace '\$([^)]+)\.Message', '${_}.Message'
# 修复特定变量引用问题
$content = $content -replace '容器\$([^}]+)', '容器${1}'
$content = $content -replace '容器\$([a-zA-Z_]+)', '容器${1}'
# 保存为UTF-8 with BOM
$utf8 = New-Object System.Text.UTF8Encoding $true
[System.IO.File]::WriteAllText((Resolve-Path $scriptPath).Path, $content, $utf8)
Write-Host "脚本修复完成!" -ForegroundColor Green
Write-Host "文件已使用UTF-8 with BOM编码保存" -ForegroundColor Green
# -*- coding: utf-8 -*-
"""修复PowerShell Here-String中的换行符问题"""
file_path = r'E:\GithubData\ubains-module-test\AuxiliaryTool\ScriptTool\新服务自检\check_server_health.ps1'
with open(file_path, 'r', encoding='utf-8-sig') as f:
content = f.read()
# 在Here-String中,需要使用真正的换行符而不是 `n
# 查找Here-String的范围
here_string_start = content.find('$reportContent = @"')
here_string_end = content.rfind('"@')
if here_string_start != -1 and here_string_end != -1:
before = content[:here_string_start]
here_string = content[here_string_start:here_string_end]
after = content[here_string_end:]
# 替换Here-String中的 "检测失败或无数据`n" 为真正换行的格式
# 原来的格式: "- 检测失败或无数据`n"
# 修复为: "- 检测失败或无数据
# "
old_text = '"- 检测失败或无数据`n"'
new_text = '"- 检测失败或无数据\n"'
here_string = here_string.replace(old_text, new_text)
content = before + here_string + after
with open(file_path, 'w', encoding='utf-8-sig') as f:
f.write(content)
print('Here-String换行符修复完成')
else:
print('未找到Here-String边界')
# 测试脚本语法
$ErrorActionPreference = "Stop"
try {
# 尝试解析脚本
$scriptPath = Join-Path $PSScriptRoot "check_server_health.ps1"
$content = Get-Content $scriptPath -Raw
Write-Host "正在检查脚本语法..." -ForegroundColor Cyan
# 检查关键修复点
if ($content -match '\$MYSQL_PASSWORD = ''[^'']*''') {
Write-Host "✓ MySQL密码变量语法正确" -ForegroundColor Green
} else {
Write-Host "✗ MySQL密码变量可能有问题" -ForegroundColor Red
}
if ($content -match '\$REDIS_PASSWORD = ''[^'']*''') {
Write-Host "✓ Redis密码变量语法正确" -ForegroundColor Green
} else {
Write-Host "✗ Redis密码变量可能有问题" -ForegroundColor Red
}
Write-Host "`n语法检查完成!" -ForegroundColor Green
}
catch {
Write-Host "语法检查失败: $($_.Exception.Message)" -ForegroundColor Red
}
# 服务器监测脚本计划执行文档
## 一、任务概述
- **任务名称**: 服务器健康监测脚本开发
- **脚本路径**: `AuxiliaryTool/ScriptTool/新服务自检/check_server_health.ps1`
- **执行方式**: PowerShell脚本,通过SSH连接远程服务器执行检测命令
- **报告输出**: 当前脚本所在目录下的 `reports` 文件夹,Markdown格式
---
## 二、功能模块划分
### 模块一:系统基础检测(12个子项)
1. 系统基础信息
2. CPU资源检测
3. 内存资源检测
4. 磁盘资源检测
5. OOM和内核异常检测
6. 进程状态检测
7. 网络连接检测
8. 安全合规检测
9. 系统日志检测
10. 时间同步检测
11. 端口服务检测
12. 定时任务检测
### 模块二:服务层检测(5个子项)
1. 容器平台检测(Docker)
2. 数据存储检测(MySQL/Redis/FastDFS)
3. 消息中间件检测(EMQX)
4. 应用服务检测(Java/Python/Python_voice/Nginx/Nacos)
5. 日志审计检测
### 模块三:综合诊断检测(1个子项)
1. 核心问题诊断
---
## 三、脚本架构设计
### 3.1 整体架构
```
check_server_health.ps1
├── 参数接收(主机/端口/用户名/密码)
├── SSH连接建立
├── 系统信息采集
├── 模块一:系统基础检测
├── 模块二:服务层检测
├── 模块三:综合诊断检测
├── 报告生成(Markdown格式)
└── SSH连接关闭
```
### 3.2 核心函数设计
| 函数名 | 功能 | 返回值 |
|:---|:---|:---|
| `Connect-SSH` | 建立SSH连接 | SSH Session对象 |
| `Invoke-SSHCommand` | 执行远程命令 | 命令输出结果 |
| `Test-RemoteCommand` | 检测远程命令是否存在 | Boolean |
| `Get-SystemInfo` | 获取系统基础信息 | 哈希表 |
| `Test-CPUUsage` | CPU使用率检测 | 哈希表(值/状态) |
| `Test-MemoryUsage` | 内存使用率检测 | 哈希表(值/状态) |
| `Test-DiskUsage` | 磁盘使用率检测 | 哈希表数组 |
| `Test-ProcessStatus` | 进程状态检测 | 哈希表 |
| `Test-NetworkStatus` | 网络状态检测 | 哈希表 |
| `Test-SecurityStatus` | 安全状态检测 | 哈希表 |
| `Test-DockerStatus` | Docker容器检测 | 哈希表数组 |
| `Test-MySQLStatus` | MySQL数据库检测 | 哈希表 |
| `Test-RedisStatus` | Redis缓存检测 | 哈希表 |
| `Test-EMQXStatus` | EMQX消息队列检测 | 哈希表 |
| `Test-ApplicationLogs` | 应用日志分析 | 哈希表 |
| `Get-CoreIssues` | 核心问题汇总 | 哈希表 |
| `New-MarkdownReport` | 生成Markdown报告 | 无(写入文件) |
### 3.3 数据结构设计
#### 检测结果统一格式
```powershell
@{
Name = "检测项名称"
Value = "当前值"
Threshold = "阈值"
Status = "正常" | "警告" | "严重"
Message = "详细说明"
}
```
#### 核心问题汇总格式
```powershell
@{
CriticalIssues = @() # 严重问题列表
WarningIssues = @() # 警告问题列表
}
```
---
## 四、实现步骤
### 步骤1:基础框架搭建
- [ ] 参数定义和验证
- [ ] SSH连接模块(使用plink.exe或SSH.NET)
- [ ] 日志记录模块
- [ ] 报告目录创建
### 步骤2:系统基础检测实现
- [ ] 系统基础信息采集
- [ ] CPU资源检测(含mpstat依赖检测)
- [ ] 内存资源检测(含numactl依赖检测)
- [ ] 磁盘资源检测(含iostat/smartctl依赖检测)
- [ ] OOM和内核异常检测
- [ ] 进程状态检测
- [ ] 网络连接检测
- [ ] 安全合规检测
- [ ] 系统日志检测
- [ ] 时间同步检测
- [ ] 端口服务检测
- [ ] 定时任务检测
### 步骤3:服务层检测实现
- [ ] Docker容器检测
- [ ] MySQL数据库检测
- [ ] Redis缓存检测
- [ ] FastDFS文件存储检测
- [ ] EMQX消息队列检测
- [ ] Java应用检测
- [ ] Python应用检测
- [ ] Nginx应用检测
- [ ] Nacos应用检测
- [ ] 应用日志分析
### 步骤4:综合诊断实现
- [ ] 核心问题诊断汇总
- [ ] 整体状态判断
### 步骤5:报告生成实现
- [ ] Markdown报告生成
- [ ] 报告文件命名(含时间戳)
- [ ] 报告保存到reports目录
---
## 五、关键技术点
### 5.1 SSH连接方式
使用 **plink.exe**(PuTTY命令行工具)进行SSH连接:
```powershell
& plink.exe -ssh -P $port -pw $password "$username@$host" "command"
```
### 5.2 依赖工具检测
```powershell
function Test-RemoteCommand {
param($Session, $Command)
$result = Invoke-SSHCommand $Session "command -v $Command"
return -not [string]::IsNullOrEmpty($result)
}
```
### 5.3 容器动态检测
```powershell
# 检测upython容器是否存在
$pythonExists = Invoke-SSHCommand $session "docker ps --format '{{.Names}}' | Select-String 'upython'"
```
### 5.4 密码环境变量
```powershell
$env:MYSQL_PASSWORD = "dNrprU&2S"
$env:REDIS_PASSWORD = "dNrprU&2S"
```
### 5.5 路径处理
- `/data` 开头 → 宿主机路径(直接执行)
- `/var` 开头 → 容器内路径(docker exec执行)
---
## 六、阈值标准参考
| 检测项 | 警告阈值 | 严重阈值 |
|:---|:---|:---|
| CPU使用率 | >85% | >100% |
| 内存使用率 | >85% | >95% |
| 磁盘使用率 | >90% | >95% |
| 系统负载(1min) | >8 | >16 |
| 线程总数 | >1000 | >3000 |
| TIME_WAIT连接 | >500 | >5000 |
| MySQL慢查询 | >100 | >1000000 |
| Docker重启次数 | >0 | >3 |
---
## 七、状态判断标准
```powershell
function Get-OverallStatus {
param($CriticalIssues, $WarningIssues)
if ($CriticalIssues.Count -gt 0) {
return "严重"
}
elseif ($WarningIssues.Count -ge 3) {
return "警告"
}
elseif ($WarningIssues.Count -gt 0) {
return "警告"
}
else {
return "正常"
}
}
```
---
## 八、开发进度
| 步骤 | 状态 | 说明 |
|:---|:---|:---|
| 基础框架搭建 | ✅ 已完成 | SSH连接、日志记录、参数接收 |
| 系统基础检测 | ✅ 已完成 | 12个检测项全部实现 |
| 服务层检测 | ✅ 已完成 | 5个检测项全部实现 |
| 综合诊断实现 | ✅ 已完成 | 核心问题汇总 |
| 报告生成实现 | ⚠️ 需完善 | 需要动态填充检测结果 |
---
## 九、脚本完善方案
### 9.1 数据流问题分析
**当前问题**:
```
检测函数 → 返回结果 → Out-Null(丢弃) → 报告生成时无数据可用
```
**解决方案**:
```
新增全局变量收集检测结果:
$script:检测结果 = @{
系统基础信息 = @{}
CPU资源 = @()
内存资源 = @()
磁盘资源 = @()
OOM检测 = @()
进程状态 = @()
网络连接 = @()
安全合规 = @()
系统日志 = @()
时间同步 = @()
端口服务 = @()
Docker容器 = @()
MySQL数据库 = @()
Redis缓存 = @()
EMQX消息队列 = @()
应用日志 = @()
}
```
### 9.2 缺失功能补充
| 功能 | 当前状态 | 补充内容 |
|:---|:---|:---|
| EMQX Dashboard检测 | ❌ 未实现 | `docker exec uemqx curl -s http://localhost:18083/api/v5/status` |
| Python_voice检测 | ❌ 未实现 | 动态检测upython_voice容器是否存在 |
| 报告详细内容 | ❌ 占位符 | 根据检测结果动态生成完整Markdown |
### 9.3 技术增强
| 问题 | 解决方案 |
|:---|:---|
| 超时处理 | 使用Start-Job实现真正的超时控制 |
| 错误隔离 | 单个检测项失败不影响整体流程 |
| 编码处理 | UTF-8编码支持,正确处理中文输出 |
### 9.4 修改点汇总
| 序号 | 文件位置 | 修改内容 |
|:---|:---|:---|
| 1 | 全局变量区域 | 新增检测结果收集变量 |
| 2 | Invoke-SSHCommand | 实现超时处理、编码处理 |
| 3 | 所有Test-*函数 | 结果存储到全局变量,移除Out-Null |
| 4 | Test-EMQXStatus | 增加Dashboard检测 |
| 5 | Test-ApplicationLogs | 增加upython_voice检测、其他应用日志 |
| 6 | New-MarkdownReport | 完全重写,使用检测结果动态生成 |
| 7 | Main函数 | 调整流程,收集结果后再生成报告 |
---
## 十、测试计划
### 10.1 单元测试
- [x] SSH连接测试
- [x] 各检测项独立测试
- [x] 阈值判断测试
### 10.2 集成测试
- [ ] 完整流程测试
- [ ] 报告生成测试(MD格式验证)
- [ ] 异常处理测试
### 10.3 真实环境测试
- [ ] 目标服务器实际运行
- [ ] 报告准确性验证
---
## 十一、注意事项
1. **只读操作**: 所有检测命令均为只读,不修改系统配置
2. **依赖工具**: 遇到不存在的依赖工具,打印日志并跳过
3. **错误处理**: SSH连接失败、命令执行失败等异常需妥善处理,单个检测项失败不影响整体
4. **容器适配**: 注意区分宿主机路径和容器内路径
5. **密码安全**: MySQL/Redis密码直接传递(环境变量方式在远程不适用)
6. **超时处理**: 长时间执行的命令设置超时时间(默认30秒,可配置)
7. **编码问题**: 使用UTF-8编码处理中文输出
8. **报告格式**: 最终输出为.md格式的Markdown文件
# _PRD_脚本运行字符报错_问题处理
> 来源:
- `AuxiliaryTool/ScriptTool/新服务自检/check_server_health.ps1`
## 1. 背景与目标
### 1.1 背景
- 执行脚本后报错
### 1.2 目标
- 脚本能够正常运行使用
---
## 2. 问题报错信息
### 2.1 问题一
```
PS C:\Users\UBAINS\Desktop\Test> .\check_server_health.ps1
所在位置 C:\Users\UBAINS\Desktop\Test\check_server_health.ps1:100 字符: 26
+ $MYSQL_PASSWORD = "dNrprU&2S"
+ ~
不允许使用与号(&)。& 运算符是为将来使用而保留的;请用双引号将与号引起来("&"),以将其作为字符串的一部分传递。
所在位置 C:\Users\UBAINS\Desktop\Test\check_server_health.ps1:101 字符: 26
+ $REDIS_PASSWORD = "dNrprU&2S"
+ ~
不允许使用与号(&)。& 运算符是为将来使用而保留的;请用双引号将与号引起来("&"),以将其作为字符串的一部分传递。
所在位置 C:\Users\UBAINS\Desktop\Test\check_server_health.ps1:85 字符: 35
+ if ($confirm -notmatch "Y|y") {
+ ~
语句块或类型定义中缺少右“}”。
所在位置 C:\Users\UBAINS\Desktop\Test\check_server_health.ps1:23 字符: 34
+ function Invoke-InteractiveInput {
+ ~
语句块或类型定义中缺少右“}”。
所在位置 C:\Users\UBAINS\Desktop\Test\check_server_health.ps1:292 字符: 48
+ if ($osInfo -match 'PRETTY_NAME="([^"]+)"') {
+ ~
表达式或语句中包含意外的标记“)”。
所在位置 C:\Users\UBAINS\Desktop\Test\check_server_health.ps1:297 字符: 43
+ $info.Kernel = Invoke-SSHCommand "uname -r" -Timeout 10
+ ~~~~~
表达式或语句中包含意外的标记“uname”。
所在位置 C:\Users\UBAINS\Desktop\Test\check_server_health.ps1:350 字符: 13
+ }
+ ~
表达式或语句中包含意外的标记“}”。
所在位置 C:\Users\UBAINS\Desktop\Test\check_server_health.ps1:357 字符: 9
+ }
+ ~
表达式或语句中包含意外的标记“}”。
所在位置 C:\Users\UBAINS\Desktop\Test\check_server_health.ps1:367 字符: 31
+ Status = "姝e父"
+ ~~~~
表达式或语句中包含意外的标记“姝e父"
Message = "mpstat宸ュ叿鍙敤锛屽凡鑾峰彇璇︾粏鏁版嵁"
}
}
}
else {
Write-Log "mpstat鏈畨瑁咃紝璺宠繃CPU璇︾粏妫€娴?”。
所在位置 C:\Users\UBAINS\Desktop\Test\check_server_health.ps1:367 字符: 31
+ Status = "姝e父"
+ ~
哈希文本不完整。
并未报告所有分析错误。请更正报告的错误并重试。
+ CategoryInfo : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : AmpersandNotAllowed
```
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论