Files

59 lines
1.0 KiB
Go
Raw Permalink Normal View History

package disk
import (
"syscall"
"bugs.watch/agent/internal/aggregate"
)
type Stats struct {
TotalBytes uint64
UsedBytes uint64
}
// Read returns disk usage statistics for the root filesystem.
func Read() (Stats, error) {
var fs syscall.Statfs_t
if err := syscall.Statfs("/", &fs); err != nil {
return Stats{}, err
}
total := fs.Blocks * uint64(fs.Bsize)
free := fs.Bavail * uint64(fs.Bsize)
used := total - free
return Stats{
TotalBytes: total,
UsedBytes: used,
}, nil
}
// UsedPercent returns disk usage as a percentage.
func UsedPercent(stats Stats) float64 {
if stats.TotalBytes == 0 {
return 0
}
return (float64(stats.UsedBytes) / float64(stats.TotalBytes)) * 100.0
}
// Collector implements the collectors.Collector interface for disk usage.
type Collector struct{}
func New() *Collector {
return &Collector{}
}
func (c *Collector) Name() string {
return "disk"
}
func (c *Collector) Collect(window *aggregate.Window) {
stats, err := Read()
if err != nil {
return
}
window.AddDisk(UsedPercent(stats))
}