diff --git a/README.md b/README.md index f66413b..ad8be35 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ will provide useful information. - CacheSize - Flags (ex: "fpu vme de pse tsc msr pae mce cx8 ...") - Microcode -- load/LoadAvg() (linux, freebsd) +- load/Avg() (linux, freebsd, solaris) - Load1 - Load5 - Load15 diff --git a/load/load_solaris.go b/load/load_solaris.go index b9dd273..aa6cd1e 100644 --- a/load/load_solaris.go +++ b/load/load_solaris.go @@ -4,11 +4,12 @@ package load import ( + "bufio" + "bytes" "context" "os/exec" + "strconv" "strings" - - "github.com/shirou/gopsutil/v3/internal/common" ) func Avg() (*AvgStat, error) { @@ -16,7 +17,45 @@ func Avg() (*AvgStat, error) { } func AvgWithContext(ctx context.Context) (*AvgStat, error) { - return nil, common.ErrNotImplementedError + kstat, err := exec.LookPath("kstat") + if err != nil { + return nil, err + } + + out, err := invoke.CommandWithContext(ctx, kstat, "-p", "unix:0:system_misc:avenrun_*") + if err != nil { + return nil, err + } + + avg := &AvgStat{} + scanner := bufio.NewScanner(bytes.NewReader(out)) + for scanner.Scan() { + flds := strings.Fields(scanner.Text()) + if len(flds) < 2 { + continue + } + var tgt *float64 + switch { + case strings.HasSuffix(flds[0], ":avenrun_1min"): + tgt = &avg.Load1 + case strings.HasSuffix(flds[0], ":avenrun_5min"): + tgt = &avg.Load5 + case strings.HasSuffix(flds[0], ":avenrun_15min"): + tgt = &avg.Load15 + default: + continue + } + v, err := strconv.ParseInt(flds[1], 10, 64) + if err != nil { + return nil, err + } + *tgt = float64(v) / (1 << 8) + } + if err = scanner.Err(); err != nil { + return nil, err + } + + return avg, nil } func Misc() (*MiscStat, error) {