Skip to content

Commit c3872cc

Browse files
committed
refactor: move CPUType to cpu.go
1 parent fc6923f commit c3872cc

File tree

5 files changed

+96
-94
lines changed

5 files changed

+96
-94
lines changed

cpu.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package stats
22

33
import (
4+
"bufio"
5+
"bytes"
46
"context"
57
"errors"
8+
"fmt"
69
"io/ioutil"
710
"os"
811
"path/filepath"
@@ -12,6 +15,96 @@ import (
1215
"time"
1316
)
1417

18+
// CPUType represents /dev/cputype.
19+
type CPUType struct {
20+
Name string
21+
Clock int // clock rate in MHz
22+
}
23+
24+
func ReadCPUType(ctx context.Context, opts ...Option) (*CPUType, error) {
25+
cfg := newConfig(opts...)
26+
var c CPUType
27+
if err := readCPUType(cfg.rootdir, &c); err != nil {
28+
return nil, err
29+
}
30+
return &c, nil
31+
}
32+
33+
type SysStats struct {
34+
ID int
35+
NumCtxSwitch int64
36+
NumInterrupt int64
37+
NumSyscall int64
38+
NumFault int64
39+
NumTLBFault int64
40+
NumTLBPurge int64
41+
LoadAvg int64 // in units of milli-CPUs and is decayed over time
42+
Idle int // percentage
43+
Interrupt int // percentage
44+
}
45+
46+
// ReadSysStats reads system statistics from /dev/sysstat.
47+
func ReadSysStats(ctx context.Context, opts ...Option) ([]*SysStats, error) {
48+
cfg := newConfig(opts...)
49+
file := filepath.Join(cfg.rootdir, "/dev/sysstat")
50+
f, err := os.Open(file)
51+
if err != nil {
52+
return nil, err
53+
}
54+
defer f.Close()
55+
56+
scanner := bufio.NewScanner(f)
57+
var stats []*SysStats
58+
for scanner.Scan() {
59+
a := strings.Fields(scanner.Text())
60+
if len(a) != 10 {
61+
continue
62+
}
63+
var (
64+
p intParser
65+
stat SysStats
66+
)
67+
stat.ID = p.ParseInt(a[0], 10)
68+
stat.NumCtxSwitch = p.ParseInt64(a[1], 10)
69+
stat.NumInterrupt = p.ParseInt64(a[2], 10)
70+
stat.NumSyscall = p.ParseInt64(a[3], 10)
71+
stat.NumFault = p.ParseInt64(a[4], 10)
72+
stat.NumTLBFault = p.ParseInt64(a[5], 10)
73+
stat.NumTLBPurge = p.ParseInt64(a[6], 10)
74+
stat.LoadAvg = p.ParseInt64(a[7], 10)
75+
stat.Idle = p.ParseInt(a[8], 10)
76+
stat.Interrupt = p.ParseInt(a[9], 10)
77+
if err := p.Err(); err != nil {
78+
return nil, err
79+
}
80+
stats = append(stats, &stat)
81+
}
82+
if err := scanner.Err(); err != nil {
83+
return nil, err
84+
}
85+
return stats, nil
86+
}
87+
88+
func readCPUType(rootdir string, c *CPUType) error {
89+
file := filepath.Join(rootdir, "/dev/cputype")
90+
b, err := ioutil.ReadFile(file)
91+
if err != nil {
92+
return err
93+
}
94+
b = bytes.TrimSpace(b)
95+
i := bytes.LastIndexByte(b, ' ')
96+
if i < 0 {
97+
return fmt.Errorf("%s: invalid format", file)
98+
}
99+
clock, err := strconv.Atoi(string(b[i+1:]))
100+
if err != nil {
101+
return err
102+
}
103+
c.Name = string(b[:i])
104+
c.Clock = clock
105+
return nil
106+
}
107+
15108
// Time represents /dev/time.
16109
type Time struct {
17110
Unix time.Duration
@@ -106,6 +199,7 @@ func ReadCPUStats(ctx context.Context, opts ...Option) (*CPUStats, error) {
106199
if err := readTime(file, &t); err != nil {
107200
return nil, err
108201
}
202+
// TODO(lufia): In multi-processor host, Idle should multiple by core numbers.
109203
stat.Idle = t.Uptime() - stat.User - stat.Sys
110204
return &stat, nil
111205
}

doc.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// Package stats provides statistic utilities for Plan 9.
2+
package stats

host.go

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// Package stats provides statistic utilities for Plan 9.
21
package stats
32

43
import (
@@ -21,17 +20,10 @@ var (
2120
// Host represents host status.
2221
type Host struct {
2322
Sysname string
24-
CPU *CPUType
2523
Storages []*Storage
2624
Interfaces []*Interface
2725
}
2826

29-
// CPUType
30-
type CPUType struct {
31-
Name string
32-
Clock int // clock rate in MHz
33-
}
34-
3527
// MemStats represents the memory statistics.
3628
type MemStats struct {
3729
Total int64 // total memory in byte
@@ -185,12 +177,6 @@ func ReadHost(ctx context.Context, opts ...Option) (*Host, error) {
185177
}
186178
h.Sysname = name
187179

188-
cpu, err := readCPUType(cfg.rootdir)
189-
if err != nil {
190-
return nil, err
191-
}
192-
h.CPU = cpu
193-
194180
a, err := readStorages(cfg.rootdir)
195181
if err != nil {
196182
return nil, err
@@ -217,27 +203,6 @@ func readSysname(rootdir string) (string, error) {
217203
return string(bytes.TrimSpace(b)), nil
218204
}
219205

220-
func readCPUType(rootdir string) (*CPUType, error) {
221-
file := filepath.Join(rootdir, "/dev/cputype")
222-
b, err := ioutil.ReadFile(file)
223-
if err != nil {
224-
return nil, err
225-
}
226-
b = bytes.TrimSpace(b)
227-
i := bytes.LastIndexByte(b, ' ')
228-
if i < 0 {
229-
return nil, fmt.Errorf("%s: invalid format", file)
230-
}
231-
clock, err := strconv.Atoi(string(b[i+1:]))
232-
if err != nil {
233-
return nil, err
234-
}
235-
return &CPUType{
236-
Name: string(b[:i]),
237-
Clock: clock,
238-
}, nil
239-
}
240-
241206
func readStorages(rootdir string) ([]*Storage, error) {
242207
sdctl := filepath.Join(rootdir, "/dev/sdctl")
243208
f, err := os.Open(sdctl)

host_test.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@ func TestReadHost(t *testing.T) {
1515
}
1616
want := &Host{
1717
Sysname: "gnot",
18-
CPU: &CPUType{
19-
Name: "Core i7/Xeon",
20-
Clock: 2403,
21-
},
2218
Storages: []*Storage{
2319
&Storage{
2420
Name: "sdC0",

stats.go

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -8,61 +8,6 @@ import (
88
"strings"
99
)
1010

11-
type SysStats struct {
12-
ID int
13-
NumCtxSwitch int64
14-
NumInterrupt int64
15-
NumSyscall int64
16-
NumFault int64
17-
NumTLBFault int64
18-
NumTLBPurge int64
19-
LoadAvg int64 // in units of milli-CPUs and is decayed over time
20-
Idle int // percentage
21-
Interrupt int // percentage
22-
}
23-
24-
// ReadSysStats reads system statistics from /dev/sysstat.
25-
func ReadSysStats(ctx context.Context, opts ...Option) ([]*SysStats, error) {
26-
cfg := newConfig(opts...)
27-
file := filepath.Join(cfg.rootdir, "/dev/sysstat")
28-
f, err := os.Open(file)
29-
if err != nil {
30-
return nil, err
31-
}
32-
defer f.Close()
33-
34-
scanner := bufio.NewScanner(f)
35-
var stats []*SysStats
36-
for scanner.Scan() {
37-
a := strings.Fields(scanner.Text())
38-
if len(a) != 10 {
39-
continue
40-
}
41-
var (
42-
p intParser
43-
stat SysStats
44-
)
45-
stat.ID = p.ParseInt(a[0], 10)
46-
stat.NumCtxSwitch = p.ParseInt64(a[1], 10)
47-
stat.NumInterrupt = p.ParseInt64(a[2], 10)
48-
stat.NumSyscall = p.ParseInt64(a[3], 10)
49-
stat.NumFault = p.ParseInt64(a[4], 10)
50-
stat.NumTLBFault = p.ParseInt64(a[5], 10)
51-
stat.NumTLBPurge = p.ParseInt64(a[6], 10)
52-
stat.LoadAvg = p.ParseInt64(a[7], 10)
53-
stat.Idle = p.ParseInt(a[8], 10)
54-
stat.Interrupt = p.ParseInt(a[9], 10)
55-
if err := p.Err(); err != nil {
56-
return nil, err
57-
}
58-
stats = append(stats, &stat)
59-
}
60-
if err := scanner.Err(); err != nil {
61-
return nil, err
62-
}
63-
return stats, nil
64-
}
65-
6611
type InterfaceStats struct {
6712
PacketsReceived int64 // in packets
6813
Link int // link status

0 commit comments

Comments
 (0)