mirror of
https://github.com/0xJacky/nginx-ui.git
synced 2025-05-11 10:25:52 +02:00
Clean up analytic code, update Simplified Chinese translations.
This commit is contained in:
parent
46e86d2a3d
commit
42417e806d
17 changed files with 638 additions and 286 deletions
58
server/analytic/analytic.go
Normal file
58
server/analytic/analytic.go
Normal 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
96
server/analytic/record.go
Normal 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
|
||||
}
|
|
@ -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,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue