Clean up analytic code, update Simplified Chinese translations.

This commit is contained in:
0xJacky 2022-02-23 21:40:43 +08:00
parent 46e86d2a3d
commit 42417e806d
17 changed files with 638 additions and 286 deletions

View file

@ -0,0 +1,58 @@
package analytic
import (
"github.com/shirou/gopsutil/v3/net"
"log"
"time"
)
type usage struct {
Time time.Time `json:"x"`
Usage interface{} `json:"y"`
}
var (
CpuUserRecord []usage
CpuTotalRecord []usage
NetRecvRecord []usage
NetSentRecord []usage
DiskWriteRecord []usage
DiskReadRecord []usage
LastDiskWrites uint64
LastDiskReads uint64
LastNetSent uint64
LastNetRecv uint64
)
func init() {
network, _ := net.IOCounters(false)
if len(network) > 0 {
LastNetRecv = network[0].BytesRecv
LastNetSent = network[0].BytesSent
}
LastDiskReads, LastDiskWrites = getTotalDiskIO()
now := time.Now()
// init record slices
for i := 100; i > 0; i-- {
u := usage{Time: now.Add(time.Duration(-i) * time.Second), Usage: 0}
CpuUserRecord = append(CpuUserRecord, u)
CpuTotalRecord = append(CpuTotalRecord, u)
NetRecvRecord = append(NetRecvRecord, u)
NetSentRecord = append(NetSentRecord, u)
DiskWriteRecord = append(DiskWriteRecord, u)
DiskReadRecord = append(DiskReadRecord, u)
}
}
func RecordServerAnalytic() {
log.Println("[Nginx UI] RecordServerAnalytic Started")
for {
now := time.Now()
recordCpu(now) // this func will spend more than 1 second.
recordNetwork(now)
recordDiskIO(now)
}
}

96
server/analytic/record.go Normal file
View file

@ -0,0 +1,96 @@
package analytic
import (
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/net"
"runtime"
"time"
)
func getTotalDiskIO() (read, write uint64) {
diskIOCounters, _ := disk.IOCounters()
for _, v := range diskIOCounters {
write += v.WriteCount
read += v.ReadCount
}
return
}
func recordCpu(now time.Time) {
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
u := usage{
Time: now,
Usage: cpuUserUsage,
}
CpuUserRecord = append(CpuUserRecord, u)
s := usage{
Time: now,
Usage: cpuUserUsage + cpuSystemUsage,
}
CpuTotalRecord = append(CpuTotalRecord, s)
if len(CpuUserRecord) > 100 {
CpuUserRecord = CpuUserRecord[1:]
}
if len(CpuTotalRecord) > 100 {
CpuTotalRecord = CpuTotalRecord[1:]
}
}
func recordNetwork(now time.Time) {
network, _ := net.IOCounters(false)
if len(network) == 0 {
return
}
NetRecvRecord = append(NetRecvRecord, usage{
Time: now,
Usage: network[0].BytesRecv - LastNetRecv,
})
NetSentRecord = append(NetSentRecord, usage{
Time: now,
Usage: network[0].BytesSent - LastNetSent,
})
LastNetRecv = network[0].BytesRecv
LastNetSent = network[0].BytesSent
if len(NetRecvRecord) > 100 {
NetRecvRecord = NetRecvRecord[1:]
}
if len(NetSentRecord) > 100 {
NetSentRecord = NetSentRecord[1:]
}
}
func recordDiskIO(now time.Time) {
readCount, writeCount := getTotalDiskIO()
DiskReadRecord = append(DiskReadRecord, usage{
Time: now,
Usage: readCount - LastDiskReads,
})
DiskWriteRecord = append(DiskWriteRecord, usage{
Time: now,
Usage: writeCount - LastDiskWrites,
})
if len(DiskReadRecord) > 100 {
DiskReadRecord = DiskReadRecord[1:]
}
if len(DiskWriteRecord) > 100 {
DiskWriteRecord = DiskWriteRecord[1:]
}
LastDiskWrites = writeCount
LastDiskReads = readCount
}

View file

@ -3,7 +3,7 @@ package api
import (
"encoding/json"
"fmt"
"github.com/0xJacky/Nginx-UI/server/tool"
"github.com/0xJacky/Nginx-UI/server/analytic"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/host"
@ -89,8 +89,8 @@ func Analytic(c *gin.Context) {
response["disk_percentage"], _ = strconv.ParseFloat(fmt.Sprintf("%.2f", diskUsage.UsedPercent), 64)
response["diskIO"] = gin.H{
"writes": tool.DiskWriteBuffer[len(tool.DiskWriteBuffer)-1],
"reads": tool.DiskReadBuffer[len(tool.DiskReadBuffer)-1],
"writes": analytic.DiskWriteRecord[len(analytic.DiskWriteRecord)-1],
"reads": analytic.DiskReadRecord[len(analytic.DiskReadRecord)-1],
}
network, _ := net.IOCounters(false)
@ -125,17 +125,17 @@ func GetAnalyticInit(c *gin.Context) {
"host": hostInfo,
"cpu": gin.H{
"info": cpuInfo,
"user": tool.CpuUserBuffer,
"total": tool.CpuTotalBuffer,
"user": analytic.CpuUserRecord,
"total": analytic.CpuTotalRecord,
},
"network": gin.H{
"init": _net,
"bytesRecv": tool.NetRecvBuffer,
"bytesSent": tool.NetSentBuffer,
"bytesRecv": analytic.NetRecvRecord,
"bytesSent": analytic.NetSentRecord,
},
"diskIO": gin.H{
"writes": tool.DiskWriteBuffer,
"reads": tool.DiskReadBuffer,
"writes": analytic.DiskWriteRecord,
"reads": analytic.DiskReadRecord,
},
})
}

View file

@ -15,7 +15,6 @@ type Server struct {
HTTPChallengePort string
Email string
Database string
DiskName string
}
var ServerSettings = &Server{
@ -23,7 +22,6 @@ var ServerSettings = &Server{
RunMode: "debug",
HTTPChallengePort: "9180",
Database: "database",
DiskName: "vda",
}
var ConfPath string

View file

@ -1,124 +0,0 @@
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
}
}
}