mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-11 02:15:48 +02:00
124 lines
3.3 KiB
Go
124 lines
3.3 KiB
Go
package tool
|
|
|
|
import (
|
|
"github.com/0xJacky/Nginx-UI/server/settings"
|
|
"github.com/shirou/gopsutil/v3/cpu"
|
|
"github.com/shirou/gopsutil/v3/disk"
|
|
"github.com/shirou/gopsutil/v3/net"
|
|
"runtime"
|
|
"time"
|
|
)
|
|
|
|
type usage struct {
|
|
Time time.Time `json:"x"`
|
|
Usage float64 `json:"y"`
|
|
}
|
|
|
|
var CpuUserBuffer []usage
|
|
var CpuTotalBuffer []usage
|
|
var NetRecvBuffer []usage
|
|
var NetSentBuffer []usage
|
|
var DiskWriteBuffer []usage
|
|
var DiskReadBuffer []usage
|
|
|
|
var LastDiskWrites uint64
|
|
var LastDiskReads uint64
|
|
|
|
var LastNetRecv uint64
|
|
var LastNetSent uint64
|
|
|
|
func RecordServerAnalytic() {
|
|
network, _ := net.IOCounters(false)
|
|
diskIOCounters, _ := disk.IOCounters(settings.ServerSettings.DiskName)
|
|
diskIO, ok := diskIOCounters[settings.ServerSettings.DiskName]
|
|
|
|
if ok {
|
|
LastDiskWrites = diskIO.WriteCount
|
|
LastDiskReads = diskIO.ReadCount
|
|
}
|
|
|
|
if len(network) > 0 {
|
|
LastNetRecv = network[0].BytesRecv
|
|
LastNetSent = network[0].BytesSent
|
|
}
|
|
|
|
now := time.Now()
|
|
// 初始化记录数组
|
|
for i := 100; i > 0; i-- {
|
|
u := usage{Time: now.Add(time.Duration(-i) * time.Second)}
|
|
CpuUserBuffer = append(CpuUserBuffer, u)
|
|
CpuTotalBuffer = append(CpuTotalBuffer, u)
|
|
NetRecvBuffer = append(NetRecvBuffer, u)
|
|
NetSentBuffer = append(NetSentBuffer, u)
|
|
DiskWriteBuffer = append(DiskWriteBuffer, u)
|
|
DiskReadBuffer = append(DiskReadBuffer, u)
|
|
}
|
|
for {
|
|
cpuTimesBefore, _ := cpu.Times(false)
|
|
time.Sleep(1000 * time.Millisecond)
|
|
cpuTimesAfter, _ := cpu.Times(false)
|
|
threadNum := runtime.GOMAXPROCS(0)
|
|
|
|
cpuUserUsage := (cpuTimesAfter[0].User - cpuTimesBefore[0].User) / (float64(1000*threadNum) / 1000)
|
|
cpuUserUsage *= 100
|
|
cpuSystemUsage := (cpuTimesAfter[0].System - cpuTimesBefore[0].System) / (float64(1000*threadNum) / 1000)
|
|
cpuSystemUsage *= 100
|
|
now := time.Now()
|
|
u := usage{
|
|
Time: now,
|
|
Usage: cpuUserUsage,
|
|
}
|
|
CpuUserBuffer = append(CpuUserBuffer, u)
|
|
s := usage{
|
|
Time: now,
|
|
Usage: cpuUserUsage + cpuSystemUsage,
|
|
}
|
|
CpuTotalBuffer = append(CpuTotalBuffer, s)
|
|
if len(CpuUserBuffer) > 100 {
|
|
CpuUserBuffer = CpuUserBuffer[1:]
|
|
}
|
|
if len(CpuTotalBuffer) > 100 {
|
|
CpuTotalBuffer = CpuTotalBuffer[1:]
|
|
}
|
|
network, _ = net.IOCounters(false)
|
|
if len(network) == 0 {
|
|
continue
|
|
}
|
|
NetRecvBuffer = append(NetRecvBuffer, usage{
|
|
Time: now,
|
|
Usage: float64(network[0].BytesRecv - LastNetRecv),
|
|
})
|
|
NetSentBuffer = append(NetRecvBuffer, usage{
|
|
Time: now,
|
|
Usage: float64(network[0].BytesSent - LastNetSent),
|
|
})
|
|
LastNetRecv = network[0].BytesRecv
|
|
LastNetSent = network[0].BytesSent
|
|
if len(NetRecvBuffer) > 100 {
|
|
NetRecvBuffer = NetRecvBuffer[1:]
|
|
}
|
|
if len(NetSentBuffer) > 100 {
|
|
NetSentBuffer = NetSentBuffer[1:]
|
|
}
|
|
diskIOCounters, _ = disk.IOCounters(settings.ServerSettings.DiskName)
|
|
diskIO, ok = diskIOCounters[settings.ServerSettings.DiskName]
|
|
if ok {
|
|
DiskReadBuffer = append(DiskReadBuffer, usage{
|
|
Time: now,
|
|
Usage: float64(diskIO.ReadCount - LastDiskReads),
|
|
})
|
|
DiskWriteBuffer = append(DiskWriteBuffer, usage{
|
|
Time: now,
|
|
Usage: float64(diskIO.WriteCount - LastDiskWrites),
|
|
})
|
|
if len(DiskReadBuffer) > 100 {
|
|
DiskReadBuffer = DiskReadBuffer[1:]
|
|
}
|
|
if len(DiskWriteBuffer) > 100 {
|
|
DiskWriteBuffer = DiskWriteBuffer[1:]
|
|
}
|
|
LastDiskWrites = diskIO.WriteCount
|
|
LastDiskReads = diskIO.ReadCount
|
|
}
|
|
}
|
|
}
|