Goでシステムリソース情報を取得するcloudfoundry/gosigarのコードをみてみる
cloudfoundry/gosigarライブラリを使ってuptimeを取得するプログラム
package main import ( "fmt" "github.com/cloudfoundry/gosigar" ) func main(){ uptime := sigar.Uptime{} uptime.Get() // UPTIME fmt.Printf("Uptime: %s \n", uptime.Format()) }
cloudfoundry/gosigarのコードをみる
type Uptime struct { Length float64 }
↓↓↓↓↓
uptime.Get()
→ 構造体のUptimeをレシーバに持つメソッドのGet関数が呼ばれる
- sigar_linux.go
func (self *Uptime) Get() error { sysinfo := syscall.Sysinfo_t{} if err := syscall.Sysinfo(&sysinfo); err != nil { return err } self.Length = float64(sysinfo.Uptime) return nil }
↓↓↓↓↓
sysinfo := syscall.Sysinfo_t{}
- GoDoc: https://godoc.org/github.com/capnm/sysinfo
- https://github.com/capnm/sysinfo/blob/master/sysinfo.go
func Get() *SI { /* // Note: uint64 is uint32 on 32 bit CPUs type Sysinfo_t struct { Uptime int64 // Seconds since boot Loads [3]uint64 // 1, 5, and 15 minute load averages --- 省略 --- } */ --- 省略 ---
↓↓↓↓↓
uptime.Format()
→ 構造体のUptimeをレシーバに持つメソッドのFormat関数が呼ばれる
- sigar.format.go
func (self *Uptime) Format() string { buf := new(bytes.Buffer) w := bufio.NewWriter(buf) uptime := uint64(self.Length) days := uptime / (60 * 60 * 24) if days != 0 { s := "" if days > 1 { s = "s" } fmt.Fprintf(w, "%d day%s, ", days, s) } minutes := uptime / 60 hours := minutes / 60 hours %= 24 minutes %= 60 fmt.Fprintf(w, "%2d:%02d", hours, minutes) w.Flush() return buf.String() }
まとめ
cloudfoundry/gosigarライブラリを使って、uptimeを取得するまでをライブラリのコードを見てみました。