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

feat(server): 添加EMQX和JVM增强检测功能

- 新增EMQX Broker信息检测,获取版本和节点名称
- 新增EMQX Topic统计检测,监控活跃路由数量
- 新增EMQX集群状态检测,检查节点数量和运行状态
- 新增JVM运行时详细信息检测,监控内存使用和线程情况
- 实现虚拟内存、物理内存、数据段、栈段等详细指标监控
- 添加堆内存比例监控和相应的健康状态判断
上级 9bd5a905
......@@ -2569,6 +2569,86 @@ function Test-EMQXStatus {
}
}
# EMQX增强检测 - Broker信息
try {
$brokerInfo = Invoke-SSHCommand "docker exec uemqx emqx_ctl broker 2>&1" -Timeout 15
if ($brokerInfo -and $brokerInfo -notmatch "command not found|error|Error") {
if ($brokerInfo -is [array]) { $brokerInfo = $brokerInfo -join "`n" }
# 尝试多种匹配模式
$brokerVersion = "Unknown"
$brokerName = "Unknown"
if ($brokerInfo -match "version.*?[:\s]+([0-9.]+)") {
$brokerVersion = $matches[1]
}
elseif ($brokerInfo -match "(\d+\.\d+\.\d+)") {
$brokerVersion = $matches[1]
}
if ($brokerInfo -match "name.*?[:\s]+(\w+)") {
$brokerName = $matches[1]
}
elseif ($brokerInfo -match "node.*?[:\s]+(\w+)") {
$brokerName = $matches[1]
}
$results += [PSCustomObject]@{
Name = "EMQX Broker信息"
Value = "$brokerName/$brokerVersion"
Threshold = "-"
Status = "正常"
Message = "EMQX Broker运行正常"
}
}
}
catch {
Write-Log "EMQX Broker信息检测失败: $($_.Exception.Message)" "WARN"
}
# EMQX增强检测 - Topic统计
try {
$topicOutput = Invoke-SSHCommand "docker exec uemqx emqx_ctl routes list 2>&1 | wc -l" -Timeout 15
if ($topicOutput -and $topicOutput -match "^\d+$") {
$topicCount = [int]$topicOutput
$topicStatus = if ($topicCount -gt 0) { "正常" } else { "警告" }
$results += [PSCustomObject]@{
Name = "EMQX Topic统计"
Value = "$topicCount 个路由"
Threshold = ">0"
Status = $topicStatus
Message = "当前EMQX路由表中有 $topicCount 个活跃路由"
}
}
}
catch {
Write-Log "EMQX Topic统计检测失败: $($_.Exception.Message)" "WARN"
}
# EMQX增强检测 - 集群状态
try {
$clusterStatus = Invoke-SSHCommand "docker exec uemqx emqx_ctl cluster status 2>&1" -Timeout 15
if ($clusterStatus -and $clusterStatus -notmatch "command not found") {
$clusterNodes = if ($clusterStatus -match "(\d+)\s+nodes?") { $matches[1] } else { 0 }
$isRunning = if ($clusterStatus -match "running|is running") { $true } else { $false }
$clusterStatusStr = if ($isRunning) { "运行中" } else { "未知" }
$clusterHealth = if ($clusterNodes -gt 0) { "正常" } else { "警告" }
$results += [PSCustomObject]@{
Name = "EMQX集群状态"
Value = "$clusterNodes 节点/$clusterStatusStr"
Threshold = ">0"
Status = $clusterHealth
Message = "EMQX集群包含 $clusterNodes 个节点,状态: $clusterStatusStr"
}
}
}
catch {
Write-Log "EMQX集群状态检测失败: $($_.Exception.Message)" "WARN"
}
# 保存结果
foreach ($result in $results) {
Save-TestResult "EMQX消息队列" $result
......@@ -2826,6 +2906,52 @@ function Test-JavaApplication {
}
}
# JVM增强检测 - 运行时详细信息
try {
# 获取Java进程PID
$javaPidForRuntime = Invoke-SSHCommand "docker exec ujava2 jps 2>/dev/null | grep -v Jps | awk '{print `$1}'" -Timeout 10
if ($javaPidForRuntime -and $javaPidForRuntime -notmatch "error|Error|ERROR") {
if ($javaPidForRuntime -is [array]) { $javaPidForRuntime = $javaPidForRuntime[0] }
$pidString = "$javaPidForRuntime".Trim()
if ($pidString -match "\d+") {
$runtimePid = $pidString
# 获取详细内存统计
$runtimeMem = Invoke-SSHCommand "docker exec ujava2 cat /proc/$runtimePid/status 2>/dev/null | grep -E 'VmSize|VmRSS|VmData|VmStk|VmExe|VmLib|Threads'" -Timeout 10
if ($runtimeMem) {
if ($runtimeMem -is [array]) { $runtimeMem = $runtimeMem -join "`n" }
# 解析内存信息
$vmSize = if ($runtimeMem -match "VmSize:\s+(\d+)\s+kB") { [long]$matches[1] } else { 0 }
$vmRSS = if ($runtimeMem -match "VmRSS:\s+(\d+)\s+kB") { [long]$matches[1] } else { 0 }
$vmData = if ($runtimeMem -match "VmData:\s+(\d+)\s+kB") { [long]$matches[1] } else { 0 }
$vmStk = if ($runtimeMem -match "VmStk:\s+(\d+)\s+kB") { [long]$matches[1] } else { 0 }
$threads = if ($runtimeMem -match "Threads:\s+(\d+)") { [int]$matches[1] } else { 0 }
# 计算堆内存比例
$heapRatio = if ($vmSize -gt 0) { [math]::Round(($vmData / $vmSize) * 100, 1) } else { 0 }
# 生成详细信息字符串
$runtimeDetails = "虚拟内存: {0:N2} GB, 物理内存: {1:N2} GB, 数据段: {2:N2} GB, 栈段: {3:N2} GB, 线程数: {4}, 堆比例: {5}%" -f ($vmSize / 1MB), ($vmRSS / 1MB), ($vmData / 1MB), ($vmStk / 1MB), $threads, $heapRatio
# 根据堆内存比例判断状态
$runtimeStatus = if ($heapRatio -gt 90) { "严重" } elseif ($heapRatio -gt 80) { "警告" } else { "正常" }
$results += [PSCustomObject]@{
Name = "JVM运行时信息"
Value = "虚拟/物理: {0:N2}/{1:N2} GB" -f ($vmSize / 1MB), ($vmRSS / 1MB)
Threshold = "堆比例>90%严重"
Status = $runtimeStatus
Message = $runtimeDetails
}
}
}
}
}
catch {
Write-Log "JVM运行时信息检测失败: $($_.Exception.Message)" "WARN"
}
# 保存结果
foreach ($result in $results) {
Save-TestResult "Java应用" $result
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论