stats: add SystemUsage
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
parent
6215e1bb21
commit
510fa4ebc8
|
|
@ -64,6 +64,7 @@ func StatsContainer(w http.ResponseWriter, r *http.Request) {
|
|||
var preCPUStats docker.CPUStats
|
||||
if query.Stream {
|
||||
preRead = time.Now()
|
||||
systemUsage, _ := cgroups.GetSystemCPUUsage()
|
||||
preCPUStats = docker.CPUStats{
|
||||
CPUUsage: docker.CPUUsage{
|
||||
TotalUsage: stats.CPUNano,
|
||||
|
|
@ -71,7 +72,7 @@ func StatsContainer(w http.ResponseWriter, r *http.Request) {
|
|||
UsageInKernelmode: stats.CPUSystemNano,
|
||||
UsageInUsermode: stats.CPUNano - stats.CPUSystemNano,
|
||||
},
|
||||
SystemUsage: 0,
|
||||
SystemUsage: systemUsage,
|
||||
OnlineCPUs: 0,
|
||||
ThrottlingData: docker.ThrottlingData{},
|
||||
}
|
||||
|
|
@ -125,6 +126,8 @@ func StatsContainer(w http.ResponseWriter, r *http.Request) {
|
|||
InstanceID: "",
|
||||
}
|
||||
|
||||
systemUsage, _ := cgroups.GetSystemCPUUsage()
|
||||
|
||||
s := handlers.Stats{StatsJSON: docker.StatsJSON{
|
||||
Stats: docker.Stats{
|
||||
Read: time.Now(),
|
||||
|
|
@ -150,7 +153,7 @@ func StatsContainer(w http.ResponseWriter, r *http.Request) {
|
|||
UsageInKernelmode: cgroupStat.CPU.Usage.Kernel,
|
||||
UsageInUsermode: cgroupStat.CPU.Usage.Total - cgroupStat.CPU.Usage.Kernel,
|
||||
},
|
||||
SystemUsage: 0,
|
||||
SystemUsage: systemUsage,
|
||||
OnlineCPUs: uint32(len(cgroupStat.CPU.Usage.PerCPU)),
|
||||
ThrottlingData: docker.ThrottlingData{
|
||||
Periods: 0,
|
||||
|
|
|
|||
|
|
@ -536,15 +536,14 @@ func (c *CgroupControl) Stat() (*Metrics, error) {
|
|||
return &m, nil
|
||||
}
|
||||
|
||||
func readCgroup2MapFile(ctr *CgroupControl, name string) (map[string][]string, error) {
|
||||
func readCgroup2MapPath(path string) (map[string][]string, error) {
|
||||
ret := map[string][]string{}
|
||||
p := filepath.Join(cgroupRoot, ctr.path, name)
|
||||
f, err := os.Open(p)
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
if os.IsNotExist(err) {
|
||||
return ret, nil
|
||||
}
|
||||
return nil, errors.Wrapf(err, "open file %s", p)
|
||||
return nil, errors.Wrapf(err, "open file %s", path)
|
||||
}
|
||||
defer f.Close()
|
||||
scanner := bufio.NewScanner(f)
|
||||
|
|
@ -557,7 +556,13 @@ func readCgroup2MapFile(ctr *CgroupControl, name string) (map[string][]string, e
|
|||
ret[parts[0]] = parts[1:]
|
||||
}
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, errors.Wrapf(err, "parsing file %s", p)
|
||||
return nil, errors.Wrapf(err, "parsing file %s", path)
|
||||
}
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func readCgroup2MapFile(ctr *CgroupControl, name string) (map[string][]string, error) {
|
||||
p := filepath.Join(cgroupRoot, ctr.path, name)
|
||||
|
||||
return readCgroup2MapPath(p)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -121,3 +121,42 @@ func (c *cpuHandler) Stat(ctr *CgroupControl, m *Metrics) error {
|
|||
m.CPU = CPUMetrics{Usage: usage}
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetSystemCPUUsage returns the system usage for all the cgroups
|
||||
func GetSystemCPUUsage() (uint64, error) {
|
||||
cgroupv2, err := IsCgroup2UnifiedMode()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if !cgroupv2 {
|
||||
p := filepath.Join(cgroupRoot, CPUAcct, "cpuacct.usage")
|
||||
return readFileAsUint64(p)
|
||||
}
|
||||
|
||||
files, err := ioutil.ReadDir(cgroupRoot)
|
||||
if err != nil {
|
||||
return 0, errors.Wrapf(err, "read directory %q", cgroupRoot)
|
||||
}
|
||||
var total uint64
|
||||
for _, file := range files {
|
||||
if !file.IsDir() {
|
||||
continue
|
||||
}
|
||||
p := filepath.Join(cgroupRoot, file.Name(), "cpu.stat")
|
||||
|
||||
values, err := readCgroup2MapPath(p)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if val, found := values["usage_usec"]; found {
|
||||
v, err := strconv.ParseUint(cleanString(val[0]), 10, 0)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
total += v * 1000
|
||||
}
|
||||
|
||||
}
|
||||
return total, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue