| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 | package analyticimport (	"runtime"	"time"	"github.com/shirou/gopsutil/v4/cpu"	"github.com/shirou/gopsutil/v4/disk"	"github.com/uozi-tech/cosy/logger")func getTotalDiskIO() (read, write uint64) {	diskIOCounters, err := disk.IOCounters()	if err != nil {		logger.Error(err)		return	}	for _, v := range diskIOCounters {		write += v.WriteCount		read += v.ReadCount	}	return}func recordCpu(now time.Time) {	cpuTimesBefore, err := cpu.Times(false)	if err != nil {		logger.Error(err)		return	}	time.Sleep(1000 * time.Millisecond)	cpuTimesAfter, err := cpu.Times(false)	if err != nil {		logger.Error(err)		return	}	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[float64]{		Time:  now,		Usage: cpuUserUsage,	}	CpuUserRecord = append(CpuUserRecord, u)	s := Usage[float64]{		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) {	// Get network statistics using GetNetworkStat which includes Ethernet interfaces	networkStats, err := GetNetworkStat()	if err != nil {		logger.Error(err)		return	}	// Calculate usage since last record	bytesRecv := networkStats.BytesRecv - LastNetRecv	bytesSent := networkStats.BytesSent - LastNetSent	// Update records	NetRecvRecord = append(NetRecvRecord, Usage[uint64]{		Time:  now,		Usage: bytesRecv,	})	NetSentRecord = append(NetSentRecord, Usage[uint64]{		Time:  now,		Usage: bytesSent,	})	// Update last values	LastNetRecv = networkStats.BytesRecv	LastNetSent = networkStats.BytesSent	// Limit record size	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[uint64]{		Time:  now,		Usage: readCount - LastDiskReads,	})	DiskWriteRecord = append(DiskWriteRecord, Usage[uint64]{		Time:  now,		Usage: writeCount - LastDiskWrites,	})	if len(DiskReadRecord) > 100 {		DiskReadRecord = DiskReadRecord[1:]	}	if len(DiskWriteRecord) > 100 {		DiskWriteRecord = DiskWriteRecord[1:]	}	LastDiskWrites = writeCount	LastDiskReads = readCount}
 |