Skip to content

Commit 511da82

Browse files
authored
Merge pull request #1224 from scop/feat/solaris-loadavg
[load][solaris] implement AvgWithContext
2 parents 2905884 + d92d114 commit 511da82

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ will provide useful information.
130130
- CacheSize
131131
- Flags (ex: "fpu vme de pse tsc msr pae mce cx8 ...")
132132
- Microcode
133-
- load/LoadAvg() (linux, freebsd)
133+
- load/Avg() (linux, freebsd, solaris)
134134
- Load1
135135
- Load5
136136
- Load15

load/load_solaris.go

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,58 @@
44
package load
55

66
import (
7+
"bufio"
8+
"bytes"
79
"context"
810
"os/exec"
11+
"strconv"
912
"strings"
10-
11-
"github.com/shirou/gopsutil/v3/internal/common"
1213
)
1314

1415
func Avg() (*AvgStat, error) {
1516
return AvgWithContext(context.Background())
1617
}
1718

1819
func AvgWithContext(ctx context.Context) (*AvgStat, error) {
19-
return nil, common.ErrNotImplementedError
20+
kstat, err := exec.LookPath("kstat")
21+
if err != nil {
22+
return nil, err
23+
}
24+
25+
out, err := invoke.CommandWithContext(ctx, kstat, "-p", "unix:0:system_misc:avenrun_*")
26+
if err != nil {
27+
return nil, err
28+
}
29+
30+
avg := &AvgStat{}
31+
scanner := bufio.NewScanner(bytes.NewReader(out))
32+
for scanner.Scan() {
33+
flds := strings.Fields(scanner.Text())
34+
if len(flds) < 2 {
35+
continue
36+
}
37+
var tgt *float64
38+
switch {
39+
case strings.HasSuffix(flds[0], ":avenrun_1min"):
40+
tgt = &avg.Load1
41+
case strings.HasSuffix(flds[0], ":avenrun_5min"):
42+
tgt = &avg.Load5
43+
case strings.HasSuffix(flds[0], ":avenrun_15min"):
44+
tgt = &avg.Load15
45+
default:
46+
continue
47+
}
48+
v, err := strconv.ParseInt(flds[1], 10, 64)
49+
if err != nil {
50+
return nil, err
51+
}
52+
*tgt = float64(v) / (1 << 8)
53+
}
54+
if err = scanner.Err(); err != nil {
55+
return nil, err
56+
}
57+
58+
return avg, nil
2059
}
2160

2261
func Misc() (*MiscStat, error) {

0 commit comments

Comments
 (0)