디스크 추가
This commit is contained in:
parent
6d211fce2c
commit
d06269e787
|
@ -7,7 +7,7 @@ import (
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
funcs := []func(){
|
funcs := []func(){
|
||||||
a, b, c, d, e,
|
a, b, c, d, e, f,
|
||||||
}
|
}
|
||||||
for i := 0; i < 1000; i++ {
|
for i := 0; i < 1000; i++ {
|
||||||
fmt.Printf("------ %d -------\n", i)
|
fmt.Printf("------ %d -------\n", i)
|
||||||
|
|
|
@ -10,7 +10,6 @@ import (
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
|
||||||
"amuz.es/src/infra/goutils/misc"
|
"amuz.es/src/infra/goutils/misc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -92,3 +91,7 @@ func e() {
|
||||||
fmt.Printf("cpu total: %d\n", ct.Total)
|
fmt.Printf("cpu total: %d\n", ct.Total)
|
||||||
fmt.Printf("cpu user: %d\n", ct.User)
|
fmt.Printf("cpu user: %d\n", ct.User)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func f() {
|
||||||
|
fmt.Fprintf(os.Stderr, "%s\n", "not supported")
|
||||||
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"github.com/mackerelio/go-osstat/network"
|
"github.com/mackerelio/go-osstat/network"
|
||||||
"github.com/mackerelio/go-osstat/uptime"
|
"github.com/mackerelio/go-osstat/uptime"
|
||||||
"github.com/mackerelio/go-osstat/cpu"
|
"github.com/mackerelio/go-osstat/cpu"
|
||||||
|
"github.com/mackerelio/go-osstat/disk"
|
||||||
"github.com/hako/durafmt"
|
"github.com/hako/durafmt"
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
@ -104,3 +105,15 @@ func e() {
|
||||||
fmt.Printf("cpu steal: %d\n", ct.Steal)
|
fmt.Printf("cpu steal: %d\n", ct.Steal)
|
||||||
fmt.Printf("cpu total: %d\n", ct.Total)
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -42,6 +42,7 @@ github.com/lestrrat-go/file-rotatelogs/internal/option
|
||||||
github.com/lestrrat-go/strftime
|
github.com/lestrrat-go/strftime
|
||||||
# github.com/mackerelio/go-osstat v0.0.0-20180312130411-192e3c5eacaf
|
# github.com/mackerelio/go-osstat v0.0.0-20180312130411-192e3c5eacaf
|
||||||
github.com/mackerelio/go-osstat/cpu
|
github.com/mackerelio/go-osstat/cpu
|
||||||
|
github.com/mackerelio/go-osstat/disk
|
||||||
github.com/mackerelio/go-osstat/loadavg
|
github.com/mackerelio/go-osstat/loadavg
|
||||||
github.com/mackerelio/go-osstat/memory
|
github.com/mackerelio/go-osstat/memory
|
||||||
github.com/mackerelio/go-osstat/network
|
github.com/mackerelio/go-osstat/network
|
||||||
|
|
Loading…
Reference in New Issue