feat:add network

#501
This commit is contained in:
samwaf
2025-10-30 11:20:58 +08:00
parent e9ffb00384
commit c0fbb15195
5 changed files with 102 additions and 14 deletions
+13 -9
View File
@@ -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"` // 网络发送速率(字节/秒)
}
+14 -3
View File
@@ -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"` // 发送速率(字节/秒)
}
+1 -1
View File
@@ -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)
}
+60
View File
@@ -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
}
+14 -1
View File
@@ -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)