123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- package linux
- import (
- "io/ioutil"
- "strconv"
- "strings"
- "time"
- )
- type Stat struct {
- CPUStatAll CPUStat `json:"cpu_all"`
- CPUStats []CPUStat `json:"cpus"`
- Interrupts uint64 `json:"intr"`
- ContextSwitches uint64 `json:"ctxt"`
- BootTime time.Time `json:"btime"`
- Processes uint64 `json:"processes"`
- ProcsRunning uint64 `json:"procs_running"`
- ProcsBlocked uint64 `json:"procs_blocked"`
- }
- type CPUStat struct {
- Id string `json:"id"`
- User uint64 `json:"user"`
- Nice uint64 `json:"nice"`
- System uint64 `json:"system"`
- Idle uint64 `json:"idle"`
- IOWait uint64 `json:"iowait"`
- IRQ uint64 `json:"irq"`
- SoftIRQ uint64 `json:"softirq"`
- Steal uint64 `json:"steal"`
- Guest uint64 `json:"guest"`
- GuestNice uint64 `json:"guest_nice"`
- }
- func createCPUStat(fields []string) *CPUStat {
- s := CPUStat{}
- s.Id = fields[0]
- for i := 1; i < len(fields); i++ {
- v, _ := strconv.ParseUint(fields[i], 10, 64)
- switch i {
- case 1:
- s.User = v
- case 2:
- s.Nice = v
- case 3:
- s.System = v
- case 4:
- s.Idle = v
- case 5:
- s.IOWait = v
- case 6:
- s.IRQ = v
- case 7:
- s.SoftIRQ = v
- case 8:
- s.Steal = v
- case 9:
- s.Guest = v
- case 10:
- s.GuestNice = v
- }
- }
- return &s
- }
- func ReadStat(path string) (*Stat, error) {
- b, err := ioutil.ReadFile(path)
- if err != nil {
- return nil, err
- }
- content := string(b)
- lines := strings.Split(content, "\n")
- var stat Stat = Stat{}
- for i, line := range lines {
- fields := strings.Fields(line)
- if len(fields) == 0 {
- continue
- }
- if fields[0][:3] == "cpu" {
- if cpuStat := createCPUStat(fields); cpuStat != nil {
- if i == 0 {
- stat.CPUStatAll = *cpuStat
- } else {
- stat.CPUStats = append(stat.CPUStats, *cpuStat)
- }
- }
- } else if fields[0] == "intr" {
- stat.Interrupts, _ = strconv.ParseUint(fields[1], 10, 64)
- } else if fields[0] == "ctxt" {
- stat.ContextSwitches, _ = strconv.ParseUint(fields[1], 10, 64)
- } else if fields[0] == "btime" {
- seconds, _ := strconv.ParseInt(fields[1], 10, 64)
- stat.BootTime = time.Unix(seconds, 0)
- } else if fields[0] == "processes" {
- stat.Processes, _ = strconv.ParseUint(fields[1], 10, 64)
- } else if fields[0] == "procs_running" {
- stat.ProcsRunning, _ = strconv.ParseUint(fields[1], 10, 64)
- } else if fields[0] == "procs_blocked" {
- stat.ProcsBlocked, _ = strconv.ParseUint(fields[1], 10, 64)
- }
- }
- return &stat, nil
- }
|