mirror of
https://github.com/containers/podman.git
synced 2025-08-06 19:44:14 +08:00
Merge pull request #15867 from boaz0/closes_15754
Fix: display online_cpus in compat REST API
This commit is contained in:
@ -47,3 +47,8 @@ func (c *Container) GetContainerStats(previousStats *define.ContainerStats) (*de
|
|||||||
}
|
}
|
||||||
return stats, nil
|
return stats, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetOnlineCPUs returns the number of online CPUs as set in the container cpu-set using sched_getaffinity
|
||||||
|
func GetOnlineCPUs(container *Container) (int, error) {
|
||||||
|
return getOnlineCPUs(container)
|
||||||
|
}
|
||||||
|
@ -147,3 +147,7 @@ func calculateBlockIO(stats *cgroups.Metrics) (read uint64, write uint64) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getOnlineCPUs(container *Container) (int, error) {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
|
|
||||||
"github.com/containers/common/pkg/cgroups"
|
"github.com/containers/common/pkg/cgroups"
|
||||||
"github.com/containers/podman/v4/libpod/define"
|
"github.com/containers/podman/v4/libpod/define"
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
// getPlatformContainerStats gets the platform-specific running stats
|
// getPlatformContainerStats gets the platform-specific running stats
|
||||||
@ -129,3 +130,18 @@ func calculateBlockIO(stats *runccgroup.Stats) (read uint64, write uint64) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getOnlineCPUs(container *Container) (int, error) {
|
||||||
|
ctrPID, err := container.PID()
|
||||||
|
if err != nil {
|
||||||
|
return -1, fmt.Errorf("failed to obtain Container %s PID: %w", container.Name(), err)
|
||||||
|
}
|
||||||
|
if ctrPID == 0 {
|
||||||
|
return ctrPID, define.ErrCtrStopped
|
||||||
|
}
|
||||||
|
var cpuSet unix.CPUSet
|
||||||
|
if err := unix.SchedGetaffinity(ctrPID, &cpuSet); err != nil {
|
||||||
|
return -1, fmt.Errorf("failed to obtain Container %s online cpus: %w", container.Name(), err)
|
||||||
|
}
|
||||||
|
return cpuSet.Count(), nil
|
||||||
|
}
|
||||||
|
@ -80,6 +80,11 @@ func StatsContainer(w http.ResponseWriter, r *http.Request) {
|
|||||||
ThrottlingData: docker.ThrottlingData{},
|
ThrottlingData: docker.ThrottlingData{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
onlineCPUs, err := libpod.GetOnlineCPUs(ctnr)
|
||||||
|
if err != nil {
|
||||||
|
utils.InternalServerError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
streamLabel: // A label to flatten the scope
|
streamLabel: // A label to flatten the scope
|
||||||
select {
|
select {
|
||||||
@ -178,7 +183,7 @@ streamLabel: // A label to flatten the scope
|
|||||||
},
|
},
|
||||||
CPU: stats.CPU,
|
CPU: stats.CPU,
|
||||||
SystemUsage: systemUsage,
|
SystemUsage: systemUsage,
|
||||||
OnlineCPUs: uint32(len(cgroupStat.CpuStats.CpuUsage.PercpuUsage)),
|
OnlineCPUs: uint32(onlineCPUs),
|
||||||
ThrottlingData: docker.ThrottlingData{
|
ThrottlingData: docker.ThrottlingData{
|
||||||
Periods: 0,
|
Periods: 0,
|
||||||
ThrottledPeriods: 0,
|
ThrottledPeriods: 0,
|
||||||
|
11
test/apiv2/19-stats.at
Normal file
11
test/apiv2/19-stats.at
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# -*- sh -*-
|
||||||
|
#
|
||||||
|
# test 'stats' endpoints
|
||||||
|
#
|
||||||
|
|
||||||
|
if root; then
|
||||||
|
podman run -dt --name container1 --cpuset-cpus=0 $IMAGE top &>/dev/null
|
||||||
|
|
||||||
|
# regression for https://github.com/containers/podman/issues/15754
|
||||||
|
t GET libpod/containers/container1/stats?stream=false 200 .cpu_stats.online_cpus=1
|
||||||
|
fi
|
Reference in New Issue
Block a user