diff --git a/test/os.go b/test/os.go index 96561d3..8458ce3 100644 --- a/test/os.go +++ b/test/os.go @@ -7,7 +7,7 @@ import ( func main() { funcs := []func(){ - a, b, c, d, e, + a, b, c, d, e, f, } for i := 0; i < 1000; i++ { fmt.Printf("------ %d -------\n", i) diff --git a/test/os_darwin.go b/test/os_darwin.go index 724c892..eaba45a 100644 --- a/test/os_darwin.go +++ b/test/os_darwin.go @@ -10,7 +10,6 @@ import ( "fmt" "os" - "time" "amuz.es/src/infra/goutils/misc" ) @@ -92,3 +91,7 @@ func e() { fmt.Printf("cpu total: %d\n", ct.Total) fmt.Printf("cpu user: %d\n", ct.User) } + +func f() { + fmt.Fprintf(os.Stderr, "%s\n", "not supported") +} diff --git a/test/os_linux.go b/test/os_linux.go index 95c714a..52c482b 100644 --- a/test/os_linux.go +++ b/test/os_linux.go @@ -6,6 +6,7 @@ import ( "github.com/mackerelio/go-osstat/network" "github.com/mackerelio/go-osstat/uptime" "github.com/mackerelio/go-osstat/cpu" + "github.com/mackerelio/go-osstat/disk" "github.com/hako/durafmt" "fmt" @@ -104,3 +105,15 @@ func e() { fmt.Printf("cpu steal: %d\n", ct.Steal) fmt.Printf("cpu total: %d\n", ct.Total) } +func f() { + disks, err := disk.Get() + if err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err) + return + } + for _, dsk := range disks { + fmt.Println("disk name: ", dsk.Name) + fmt.Println("disk read: ", misc.FileSizeIEC(dsk.ReadsCompleted)) + fmt.Println("disk written: ", misc.FileSizeIEC(dsk.WritesCompleted)) + } +} diff --git a/vendor/github.com/mackerelio/go-osstat/disk/disk_linux.go b/vendor/github.com/mackerelio/go-osstat/disk/disk_linux.go new file mode 100644 index 0000000..b9b4a3a --- /dev/null +++ b/vendor/github.com/mackerelio/go-osstat/disk/disk_linux.go @@ -0,0 +1,58 @@ +// +build linux + +package disk + +import ( + "bufio" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// Get disk I/O statistics +func Get() ([]Stats, error) { + // Reference: Documentation/iostats.txt in the source of Linux + file, err := os.Open("/proc/diskstats") + if err != nil { + return nil, err + } + defer file.Close() + return collectDiskStats(file) +} + +// Stats represents disk I/O statistics for linux +type Stats struct { + Name string + ReadsCompleted, WritesCompleted uint64 +} + +func collectDiskStats(out io.Reader) ([]Stats, error) { + scanner := bufio.NewScanner(out) + var diskStats []Stats + for scanner.Scan() { + fields := strings.Fields(scanner.Text()) + if len(fields) < 14 { + continue + } + name := fields[2] + readsCompleted, err := strconv.ParseUint(fields[3], 10, 64) + if err != nil { + return nil, fmt.Errorf("failed to parse reads completed of %s", name) + } + writesCompleted, err := strconv.ParseUint(fields[7], 10, 64) + if err != nil { + return nil, fmt.Errorf("failed to parse writes completed of %s", name) + } + diskStats = append(diskStats, Stats{ + Name: name, + ReadsCompleted: readsCompleted, + WritesCompleted: writesCompleted, + }) + } + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("scan error for /proc/diskstats: %s", err) + } + return diskStats, nil +} diff --git a/vendor/github.com/mackerelio/go-osstat/disk/disk_linux_test.go b/vendor/github.com/mackerelio/go-osstat/disk/disk_linux_test.go new file mode 100644 index 0000000..9b70fb1 --- /dev/null +++ b/vendor/github.com/mackerelio/go-osstat/disk/disk_linux_test.go @@ -0,0 +1,44 @@ +// +build linux + +package disk + +import ( + "reflect" + "strings" + "testing" +) + +func TestGetDisk(t *testing.T) { + disks, err := Get() + if err != nil { + t.Fatalf("error should be nil but got: %v", err) + } + t.Logf("disks value: %+v", disks) +} + +func TestCollectDiskStats(t *testing.T) { + got, err := collectDiskStats(strings.NewReader( + ` 202 1 xvda1 750193 3037 28116978 368712 16600606 7233846 424712632 23987908 0 2355636 24345740 + 202 2 xvda2 1641 9310 87552 1252 6365 3717 80664 24192 0 15040 25428 + 7 0 loop0 0 0 0 0 0 0 0 0 0 0 0 + 7 1 loop1 0 0 0 0 0 0 0 0 0 0 0 + 253 0 dm-0 46095806 0 549095028 2243928 7192424 0 305024576 12521088 0 2728444 14782668 + 253 628 dm-628 3198 0 75410 1360 30802835 0 3942653176 1334317408 0 70948 1358596768 + 253 2 dm-2 2022 0 42250 488 30822403 0 3942809696 1364721232 0 93348 1382989868 +`)) + if err != nil { + t.Fatalf("error should be nil but got: %v", err) + } + expected := []Stats{ + {"xvda1", 750193, 16600606}, + {"xvda2", 1641, 6365}, + {"loop0", 0, 0}, + {"loop1", 0, 0}, + {"dm-0", 46095806, 7192424}, + {"dm-628", 3198, 30802835}, + {"dm-2", 2022, 30822403}, + } + if !reflect.DeepEqual(got, expected) { + t.Errorf("invalid disk value: %+v (expected: %+v)", got, expected) + } +} diff --git a/vendor/vgo.list b/vendor/vgo.list index 09a1137..c58d494 100644 --- a/vendor/vgo.list +++ b/vendor/vgo.list @@ -42,6 +42,7 @@ github.com/lestrrat-go/file-rotatelogs/internal/option github.com/lestrrat-go/strftime # github.com/mackerelio/go-osstat v0.0.0-20180312130411-192e3c5eacaf github.com/mackerelio/go-osstat/cpu +github.com/mackerelio/go-osstat/disk github.com/mackerelio/go-osstat/loadavg github.com/mackerelio/go-osstat/memory github.com/mackerelio/go-osstat/network