My Note

自己理解のためのブログ

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関数が呼ばれる

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{}

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を取得するまでをライブラリのコードを見てみました。