mirror of
https://gitee.com/samwaf/SamWaf.git
synced 2026-09-01 15:32:55 +08:00
@@ -117,13 +117,17 @@ type OperatorMessageInfo struct {
|
||||
// SystemStatsData 系统统计数据结构,用于ECharts展示
|
||||
type SystemStatsData struct {
|
||||
BaseMessageInfo
|
||||
Timestamp int64 `json:"timestamp"` // 时间戳
|
||||
QPS uint64 `json:"qps"` // 当前QPS
|
||||
LogQPS uint64 `json:"log_qps"` // 日志处理QPS
|
||||
MainQueue int `json:"main_queue"` // 主数据队列数量
|
||||
LogQueue int `json:"log_queue"` // 日志队列数量
|
||||
StatsQueue int `json:"stats_queue"` // 统计队列数量
|
||||
MessageQueue int `json:"message_queue"` // 消息队列数量
|
||||
CPUPercent float64 `json:"cpu_percent"` // CPU使用百分比
|
||||
MemoryPercent float64 `json:"memory_percent"` // 内存使用百分比
|
||||
Timestamp int64 `json:"timestamp"` // 时间戳
|
||||
QPS uint64 `json:"qps"` // 当前QPS
|
||||
LogQPS uint64 `json:"log_qps"` // 日志处理QPS
|
||||
MainQueue int `json:"main_queue"` // 主数据队列数量
|
||||
LogQueue int `json:"log_queue"` // 日志队列数量
|
||||
StatsQueue int `json:"stats_queue"` // 统计队列数量
|
||||
MessageQueue int `json:"message_queue"` // 消息队列数量
|
||||
CPUPercent float64 `json:"cpu_percent"` // CPU使用率
|
||||
MemoryPercent float64 `json:"memory_percent"` // 内存使用率
|
||||
NetworkRecv uint64 `json:"network_recv"` // 网络接收字节数(累计)
|
||||
NetworkSent uint64 `json:"network_sent"` // 网络发送字节数(累计)
|
||||
NetworkRecvRate uint64 `json:"network_recv_rate"` // 网络接收速率(字节/秒)
|
||||
NetworkSentRate uint64 `json:"network_sent_rate"` // 网络发送速率(字节/秒)
|
||||
}
|
||||
|
||||
@@ -2,9 +2,10 @@ package response
|
||||
|
||||
// 系统监控响应结构体
|
||||
type WafSystemMonitor struct {
|
||||
CPU WafCPUInfo `json:"cpu"` // CPU信息
|
||||
Memory WafMemoryInfo `json:"memory"` // 内存信息
|
||||
Disk []WafDiskInfo `json:"disk"` // 磁盘信息
|
||||
CPU WafCPUInfo `json:"cpu"` // CPU信息
|
||||
Memory WafMemoryInfo `json:"memory"` // 内存信息
|
||||
Disk []WafDiskInfo `json:"disk"` // 磁盘信息
|
||||
Network WafNetworkInfo `json:"network"` // 网络信息
|
||||
}
|
||||
|
||||
// CPU信息
|
||||
@@ -35,3 +36,13 @@ type WafDiskInfo struct {
|
||||
Used string `json:"used"` // 已用容量
|
||||
UsagePercent float64 `json:"usage_percent"` // 使用率百分比
|
||||
}
|
||||
|
||||
// 网络信息
|
||||
type WafNetworkInfo struct {
|
||||
BytesRecv uint64 `json:"bytes_recv"` // 接收字节数(累计)
|
||||
BytesSent uint64 `json:"bytes_sent"` // 发送字节数(累计)
|
||||
RecvRate string `json:"recv_rate"` // 接收速率(格式化后的字符串)
|
||||
SendRate string `json:"send_rate"` // 发送速率(格式化后的字符串)
|
||||
RecvRateBytes uint64 `json:"recv_rate_bytes"` // 接收速率(字节/秒)
|
||||
SendRateBytes uint64 `json:"send_rate_bytes"` // 发送速率(字节/秒)
|
||||
}
|
||||
|
||||
@@ -14,5 +14,5 @@ func (receiver *WafCommonRouter) InitWafCommonRouter(group *gin.RouterGroup) {
|
||||
router.GET("/samwaf/export", api.ExportExcelApi)
|
||||
router.POST("/samwaf/import", api.ImportExcelApi)
|
||||
//心跳数据
|
||||
router.POST("/samwaf/heartbeat", api.HeartbeatApi)
|
||||
router.GET("/samwaf/heartbeat", api.HeartbeatApi)
|
||||
}
|
||||
|
||||
@@ -10,9 +10,12 @@ import (
|
||||
"github.com/shirou/gopsutil/v3/cpu"
|
||||
"github.com/shirou/gopsutil/v3/disk"
|
||||
"github.com/shirou/gopsutil/v3/mem"
|
||||
"github.com/shirou/gopsutil/v3/net"
|
||||
)
|
||||
|
||||
type WafSystemMonitorService struct {
|
||||
lastNetStats *net.IOCountersStat // 上次网络统计数据
|
||||
lastNetStatsTime time.Time // 上次统计时间
|
||||
}
|
||||
|
||||
var WafSystemMonitorServiceApp = &WafSystemMonitorService{}
|
||||
@@ -42,6 +45,13 @@ func (receiver *WafSystemMonitorService) GetSystemMonitorInfo() (response.WafSys
|
||||
}
|
||||
result.Disk = diskInfo
|
||||
|
||||
// 获取网络信息
|
||||
networkInfo, err := receiver.getNetworkInfo()
|
||||
if err != nil {
|
||||
return result, fmt.Errorf("获取网络信息失败: %v", err)
|
||||
}
|
||||
result.Network = networkInfo
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
@@ -155,3 +165,53 @@ func (receiver *WafSystemMonitorService) formatBytes(bytes uint64) string {
|
||||
}
|
||||
return fmt.Sprintf("%.1f %cB", float64(bytes)/float64(div), "KMGTPE"[exp])
|
||||
}
|
||||
|
||||
// getNetworkInfo 获取网络信息
|
||||
func (receiver *WafSystemMonitorService) getNetworkInfo() (response.WafNetworkInfo, error) {
|
||||
var networkInfo response.WafNetworkInfo
|
||||
currentTime := time.Now()
|
||||
|
||||
// 获取网络接口统计信息
|
||||
netStats, err := net.IOCounters(false) // false表示获取所有接口的汇总信息
|
||||
if err != nil {
|
||||
return networkInfo, err
|
||||
}
|
||||
|
||||
if len(netStats) > 0 {
|
||||
// 取第一个(汇总)统计信息
|
||||
stat := netStats[0]
|
||||
networkInfo.BytesRecv = stat.BytesRecv
|
||||
networkInfo.BytesSent = stat.BytesSent
|
||||
|
||||
// 计算实时流量速率
|
||||
if receiver.lastNetStats != nil && !receiver.lastNetStatsTime.IsZero() {
|
||||
// 计算时间差(秒)
|
||||
timeDiff := currentTime.Sub(receiver.lastNetStatsTime).Seconds()
|
||||
if timeDiff > 0 {
|
||||
// 计算字节差
|
||||
recvDiff := stat.BytesRecv - receiver.lastNetStats.BytesRecv
|
||||
sentDiff := stat.BytesSent - receiver.lastNetStats.BytesSent
|
||||
|
||||
// 计算每秒速率
|
||||
networkInfo.RecvRateBytes = uint64(float64(recvDiff) / timeDiff)
|
||||
networkInfo.SendRateBytes = uint64(float64(sentDiff) / timeDiff)
|
||||
|
||||
// 格式化速率字符串
|
||||
networkInfo.RecvRate = receiver.formatBytes(networkInfo.RecvRateBytes) + "/s"
|
||||
networkInfo.SendRate = receiver.formatBytes(networkInfo.SendRateBytes) + "/s"
|
||||
}
|
||||
} else {
|
||||
// 首次调用,速率为0
|
||||
networkInfo.RecvRateBytes = 0
|
||||
networkInfo.SendRateBytes = 0
|
||||
networkInfo.RecvRate = "0 B/s"
|
||||
networkInfo.SendRate = "0 B/s"
|
||||
}
|
||||
|
||||
// 更新上次统计数据
|
||||
receiver.lastNetStats = &stat
|
||||
receiver.lastNetStatsTime = currentTime
|
||||
}
|
||||
|
||||
return networkInfo, nil
|
||||
}
|
||||
|
||||
@@ -24,9 +24,14 @@ func TaskStatsPush() {
|
||||
// 通过系统监控服务获取CPU和内存信息
|
||||
systemInfo, err := waf_service.WafSystemMonitorServiceApp.GetSystemMonitorInfo()
|
||||
var cpuPercent, memoryPercent float64
|
||||
var networkRecv, networkSent, networkRecvRate, networkSentRate uint64
|
||||
if err == nil {
|
||||
cpuPercent = systemInfo.CPU.UsagePercent
|
||||
memoryPercent = systemInfo.Memory.UsagePercent
|
||||
networkRecv = systemInfo.Network.BytesRecv
|
||||
networkSent = systemInfo.Network.BytesSent
|
||||
networkRecvRate = systemInfo.Network.RecvRateBytes
|
||||
networkSentRate = systemInfo.Network.SendRateBytes
|
||||
} else {
|
||||
zlog.Error(innerLogName, "获取系统监控信息失败", "error", err)
|
||||
}
|
||||
@@ -45,6 +50,10 @@ func TaskStatsPush() {
|
||||
MessageQueue: global.GQEQUE_MESSAGE_DB.Size(),
|
||||
CPUPercent: cpuPercent,
|
||||
MemoryPercent: memoryPercent,
|
||||
NetworkRecv: networkRecv,
|
||||
NetworkSent: networkSent,
|
||||
NetworkRecvRate: networkRecvRate,
|
||||
NetworkSentRate: networkSentRate,
|
||||
BaseMessageInfo: innerbean.BaseMessageInfo{OperaType: "系统统计信息", Server: global.GWAF_CUSTOM_SERVER_NAME},
|
||||
}
|
||||
zlog.Debug(innerLogName, "系统统计信息",
|
||||
@@ -55,7 +64,11 @@ func TaskStatsPush() {
|
||||
"统计队列", statsData.StatsQueue,
|
||||
"消息队列", statsData.MessageQueue,
|
||||
"CPU使用率", statsData.CPUPercent,
|
||||
"内存使用率", statsData.MemoryPercent)
|
||||
"内存使用率", statsData.MemoryPercent,
|
||||
"网络接收", statsData.NetworkRecv,
|
||||
"网络发送", statsData.NetworkSent,
|
||||
"网络接收速率", statsData.NetworkRecvRate,
|
||||
"网络发送速率", statsData.NetworkSentRate)
|
||||
|
||||
global.GQEQUE_MESSAGE_DB.Enqueue(statsData)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user