Stat fills a metrics structure with usage stats for the controller
(ctr *CgroupControl, m *Metrics)
| 72 | |
| 73 | // Stat fills a metrics structure with usage stats for the controller |
| 74 | func (c *cpuHandler) Stat(ctr *CgroupControl, m *Metrics) error { |
| 75 | var err error |
| 76 | usage := CPUUsage{} |
| 77 | if ctr.cgroup2 { |
| 78 | values, err := readCgroup2MapFile(ctr, "cpu.stat") |
| 79 | if err != nil { |
| 80 | return err |
| 81 | } |
| 82 | if val, found := values["usage_usec"]; found { |
| 83 | usage.Total, err = strconv.ParseUint(cleanString(val[0]), 10, 64) |
| 84 | if err != nil { |
| 85 | return err |
| 86 | } |
| 87 | usage.Kernel *= 1000 |
| 88 | } |
| 89 | if val, found := values["system_usec"]; found { |
| 90 | usage.Kernel, err = strconv.ParseUint(cleanString(val[0]), 10, 64) |
| 91 | if err != nil { |
| 92 | return err |
| 93 | } |
| 94 | usage.Total *= 1000 |
| 95 | } |
| 96 | // FIXME: How to read usage.PerCPU? |
| 97 | } else { |
| 98 | usage.Total, err = readAcct(ctr, "cpuacct.usage") |
| 99 | if err != nil { |
| 100 | if !os.IsNotExist(errors.Cause(err)) { |
| 101 | return err |
| 102 | } |
| 103 | usage.Total = 0 |
| 104 | } |
| 105 | usage.Kernel, err = readAcct(ctr, "cpuacct.usage_sys") |
| 106 | if err != nil { |
| 107 | if !os.IsNotExist(errors.Cause(err)) { |
| 108 | return err |
| 109 | } |
| 110 | usage.Kernel = 0 |
| 111 | } |
| 112 | usage.PerCPU, err = readAcctList(ctr, "cpuacct.usage_percpu") |
| 113 | if err != nil { |
| 114 | if !os.IsNotExist(errors.Cause(err)) { |
| 115 | return err |
| 116 | } |
| 117 | usage.PerCPU = nil |
| 118 | } |
| 119 | } |
| 120 | m.CPU = CPUMetrics{Usage: usage} |
| 121 | return nil |
| 122 | } |
| 123 | |
| 124 | // GetSystemCPUUsage returns the system usage for all the cgroups |
| 125 | func GetSystemCPUUsage() (uint64, error) { |
nothing calls this directly
no test coverage detected