Description sysmon is a small system monitoring library written in Go.
Created: Mar 11, 2026
Updated: Mar 21, 2026
Github Link: GitHub ↗
Created: Mar 11, 2026
Updated: Mar 21, 2026
Github Link: GitHub ↗
sysmon
sysmon is a small system monitoring library.
Providing a simple functions for retrieving system information directly from the Linux /proc filesystem. Just collecting useful metrics such as CPU usage, memory usage, and process information.
The purpose is to understand how Linux exposes system data and how tools like top or htop get the info.
Features
- Read system metrics from
/proc - CPU usage information
- Memory statistics
- Process information
- Simple Go API for accessing system data
Requirements
- Linux
Installation
go get github.com/omar0ali/sysmon
Usage
import "github.com/omar0ali/sysmon"
package main
func main() {
// MemInfo And CpuInfo
meminfo, err := sysmon.ReadMemInfo(sysmon.MB)
if err != nil {
panic(err)
}
fmt.Printf("MEMINFO: %+v\n", meminfo)
cpuinfo, err := sysmon.ReadCpuInfo()
if err != nil {
panic(err)
}
fmt.Printf("CPUINFO: %+v\n", cpuinfo)
// CpuStat
prev, err := sysmon.ReadCpuStat()
if err != nil {
panic(err)
}
for i, stat := range prev {
fmt.Printf("CPUSTATS_PREV %d: %+v\n", i, *stat)
}
time.Sleep(time.Second)
curr, err := sysmon.ReadCpuStat()
if err != nil {
panic(err)
}
for i, stat := range curr {
fmt.Printf("CPUSTATS_CURR %d: %+v\n", i, *stat)
}
delta := sysmon.DeltaCPUStats(prev, curr)
for i, d := range delta {
total := d.User + d.Nice + d.System + d.Idle + d.Iowait + d.Irq + d.SoftIrq
idle := d.Idle + d.Iowait
usage := float64(total-idle) / float64(total) * 100
fmt.Printf("CPU%d usage: %.1f%%\n", i, usage)
}
// display processes
pids, err := sysmon.GetPids()
if err != nil {
panic(err)
}
fmt.Printf("Pids: %+v\n", pids)
procs := map[int]*sysmon.Process{}
for i := range pids {
procs[pids[i]], err = sysmon.NewProcess(pids[i])
if err != nil {
panic(err)
}
}
for i := range procs {
fmt.Printf("PROC: %+v\n", procs[i])
}
// refresh processes to get processes usage
prevCPU, err := sysmon.ReadCpuStat()
if err != nil {
panic(err)
}
prevProcCPU := map[int]uint64{}
for pid, p := range procs {
prevProcCPU[pid] = p.Stat.UTime + p.Stat.STime
}
time.Sleep(time.Second)
sysmon.RefreshProcesses(procs)
currCPU, err := sysmon.ReadCpuStat()
if err != nil {
panic(err)
}
delta = sysmon.DeltaCPUStats(prevCPU, currCPU)
totalDelta := uint64(0)
for _, d := range delta {
totalDelta += d.User + d.Nice + d.System + d.Idle +
d.Iowait + d.Irq + d.SoftIrq
}
for pid, p := range procs {
prev, ok := prevProcCPU[pid]
if !ok {
continue
}
curr := p.Stat.UTime + p.Stat.STime
procDelta := curr - prev
cpuPercent := float64(procDelta) / float64(totalDelta) * 100
name := p.Stat.Comm
fmt.Printf("Name: %s PID: %d CPU: %.2f%%\n", name, pid, cpuPercent)
}
}