machine/src/monitor/monitor.go
2025-02-16 12:14:44 +08:00

84 lines
2.4 KiB
Go

package monitor
import (
"time"
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"github.com/shirou/gopsutil/v4/cpu"
"github.com/shirou/gopsutil/v4/disk"
"github.com/shirou/gopsutil/v4/mem"
"github.com/shirou/gopsutil/v4/net"
)
type monitor struct {
fields string `data:"ModelName,Mhz,Core,Thread,CorePercent,ThreadPercent,Total,Free,Available,Used,UsedPercent,DiskTotal,DiskFree,DiskUsed,DiskUsedPercent,BytesRecv,BytesSent,PacketsRecv,PacketsSent"`
list string `name:"list hash auto" help:"monitor"`
}
func (s monitor) List(m *ice.Message, arg ...string) {
m.Cmd(web.SPACE, ice.OPS, web.DREAM, web.SERVER).Table(func(value ice.Maps) {
m.PushRecord(value)
})
return
c, _ := cpu.Info()
v, _ := mem.VirtualMemory()
d, _ := disk.Usage(kit.Pwd())
n, _ := net.IOCounters(false)
kit.For(kit.Split(m.OptionDefault(mdb.FIELDS, m.Config(mdb.FIELDS))), func(field string) {
switch field {
case "ModelName":
m.Push(field, c[0].ModelName)
case "Mhz":
list := []string{}
for _, v := range c {
list = append(list, kit.Format("%.2f", v.Mhz))
}
m.Push(field, kit.Join(list, ","))
case "Core", "Thread":
n, _ := cpu.Counts(field == "Thread")
m.Push(field, n)
case "CorePercent", "ThreadPercent":
p, _ := cpu.Percent(3*time.Second, field == "ThreadPercent")
list := []string{}
for _, v := range p {
list = append(list, kit.Format("%.2f", v))
}
m.Push(field, kit.Join(list, ","))
case "Total":
m.Push(field, kit.FmtSize(v.Total))
case "Free":
m.Push(field, kit.FmtSize(v.Free))
case "Available":
m.Push(field, kit.FmtSize(v.Available))
case "Used":
m.Push(field, kit.FmtSize(v.Used))
case "UsedPercent":
m.Push(field, kit.Format("%.2f%%", v.UsedPercent))
case "DiskTotal":
m.Push(field, kit.FmtSize(d.Total))
case "DiskFree":
m.Push(field, kit.FmtSize(d.Free))
case "DiskUsed":
m.Push(field, kit.FmtSize(d.Used))
case "DiskUsedPercent":
m.Push(field, kit.Format("%.2f%%", d.UsedPercent))
case "BytesRecv":
m.Push(field, kit.FmtSize(n[0].BytesRecv))
case "BytesSent":
m.Push(field, kit.FmtSize(n[0].BytesSent))
case "PacketsRecv":
m.Push(field, kit.FmtSize(n[0].PacketsRecv))
case "PacketsSent":
m.Push(field, kit.FmtSize(n[0].PacketsSent))
default:
m.Push(field, "")
}
})
}
func init() { ice.Cmd("web.chat.dev.machine.monitor", monitor{}) }