diff options
| author | Paul Buetow (europa) <paul@buetow.org> | 2015-05-25 10:39:47 +0100 |
|---|---|---|
| committer | Paul Buetow (europa) <paul@buetow.org> | 2015-05-25 10:39:47 +0100 |
| commit | b5117be9fc9dd7be25735fb8da93a2d1fb0349c9 (patch) | |
| tree | 678e734c51794b8b5a75a34fa2578adeaaf7c288 /diskstats | |
| parent | b804f4905f48d3a05218a323b258963c514399f7 (diff) | |
initial diskstats
Diffstat (limited to 'diskstats')
| -rw-r--r-- | diskstats/diskstats.go | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/diskstats/diskstats.go b/diskstats/diskstats.go new file mode 100644 index 0000000..c6d9f9a --- /dev/null +++ b/diskstats/diskstats.go @@ -0,0 +1,102 @@ +package diskstats + +import ( + "fmt" + "io/ioutil" + "log" + "regexp" + "strconv" + "strings" +) + +type Diskstats struct { + Pid int + Cmdline string + Count map[string]int + debug string +} + +func new(pidstr string) (Diskstats, error) { + pid, err0 := strconv.Atoi(pidstr) + if err0 != nil { + return Diskstats{}, err0 + } + diskstats := Diskstats{Pid: pid} + var rawIo string + + err1 := diskstats.gatherRaw(&rawIo, "/proc/%d/io") + if err1 != nil { + return diskstats, err1 + } + err2 := diskstats.parseRawIo(rawIo) + if err2 != nil { + return diskstats, err2 + } + + err3 := diskstats.gatherRaw(&diskstats.Cmdline, "/proc/%d/cmdline") + return diskstats, err3 +} + +func (self *Diskstats) gatherRaw(what *string, pathf string) error { + bytes, err := ioutil.ReadFile(fmt.Sprintf(pathf, self.Pid)) + if err != nil { + return err + } else { + *what = string(bytes) + } + return nil +} + +func (self *Diskstats) parseRawIo(rawIo string) error { + countMap := make(map[string]int) + for _, line := range strings.Split(rawIo, "\n") { + keyval := strings.Split(line, ": ") + if len(keyval) == 2 { + count, err := strconv.Atoi(keyval[1]) + if err != nil { + return err + } + countMap[keyval[0]] = count + } + } + self.Count = countMap + return nil +} + +func (self *Diskstats) String() string { + str := "DISKSTATS=========================\n" + + str += fmt.Sprintf("PID: %d\n", self.Pid) + str += fmt.Sprintf("Cmdline: %s\n", self.Cmdline) + for key, val := range self.Count { + str += fmt.Sprintf("%s=%d\n", key, val) + } + if self.debug != "" { + str += fmt.Sprintf("debug: %s\n", self.debug) + } + + return str +} + +func (self *Diskstats) Print() { + fmt.Println(self) +} + +func Gather(diskstatses chan<- Diskstats) { + re, _ := regexp.Compile("^[0-9]+$") + + dir, err := ioutil.ReadDir("/proc/") + if err != nil { + log.Fatal(err) + } + + for _, direntry := range dir { + name := direntry.Name() + if re.MatchString(name) { + diskstats, err := new(name) + if err == nil { + diskstatses <- diskstats + } + } + } +} |
