mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
Merge pull request #96873 from ruiwen-zhao/accelerator_stats
Add AcceleratorStats to cri_stats_provider
This commit is contained in:
commit
a20aeb8eed
@ -292,7 +292,7 @@ func (p *criStatsProvider) ListPodCPUAndMemoryStats() ([]statsapi.PodStats, erro
|
|||||||
if !caFound {
|
if !caFound {
|
||||||
klog.V(4).Infof("Unable to find cadvisor stats for %q", containerID)
|
klog.V(4).Infof("Unable to find cadvisor stats for %q", containerID)
|
||||||
} else {
|
} else {
|
||||||
p.addCadvisorContainerStats(cs, &caStats)
|
p.addCadvisorContainerCPUAndMemoryStats(cs, &caStats)
|
||||||
}
|
}
|
||||||
ps.Containers = append(ps.Containers, *cs)
|
ps.Containers = append(ps.Containers, *cs)
|
||||||
}
|
}
|
||||||
@ -785,6 +785,25 @@ func (p *criStatsProvider) addCadvisorContainerStats(
|
|||||||
cs.UserDefinedMetrics = cadvisorInfoToUserDefinedMetrics(caPodStats)
|
cs.UserDefinedMetrics = cadvisorInfoToUserDefinedMetrics(caPodStats)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cpu, memory := cadvisorInfoToCPUandMemoryStats(caPodStats)
|
||||||
|
if cpu != nil {
|
||||||
|
cs.CPU = cpu
|
||||||
|
}
|
||||||
|
if memory != nil {
|
||||||
|
cs.Memory = memory
|
||||||
|
}
|
||||||
|
accelerators := cadvisorInfoToAcceleratorStats(caPodStats)
|
||||||
|
cs.Accelerators = accelerators
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *criStatsProvider) addCadvisorContainerCPUAndMemoryStats(
|
||||||
|
cs *statsapi.ContainerStats,
|
||||||
|
caPodStats *cadvisorapiv2.ContainerInfo,
|
||||||
|
) {
|
||||||
|
if caPodStats.Spec.HasCustomMetrics {
|
||||||
|
cs.UserDefinedMetrics = cadvisorInfoToUserDefinedMetrics(caPodStats)
|
||||||
|
}
|
||||||
|
|
||||||
cpu, memory := cadvisorInfoToCPUandMemoryStats(caPodStats)
|
cpu, memory := cadvisorInfoToCPUandMemoryStats(caPodStats)
|
||||||
if cpu != nil {
|
if cpu != nil {
|
||||||
cs.CPU = cpu
|
cs.CPU = cpu
|
||||||
|
@ -260,11 +260,14 @@ func TestCRIListPodStats(t *testing.T) {
|
|||||||
c0 := containerStatsMap[cName0]
|
c0 := containerStatsMap[cName0]
|
||||||
assert.Equal(container0.CreatedAt, c0.StartTime.UnixNano())
|
assert.Equal(container0.CreatedAt, c0.StartTime.UnixNano())
|
||||||
checkCRICPUAndMemoryStats(assert, c0, infos[container0.ContainerStatus.Id].Stats[0])
|
checkCRICPUAndMemoryStats(assert, c0, infos[container0.ContainerStatus.Id].Stats[0])
|
||||||
|
checkCRIAcceleratorStats(assert, c0, infos[container0.ContainerStatus.Id].Stats[0])
|
||||||
checkCRIRootfsStats(assert, c0, containerStats0, &imageFsInfo)
|
checkCRIRootfsStats(assert, c0, containerStats0, &imageFsInfo)
|
||||||
checkCRILogsStats(assert, c0, &rootFsInfo, containerLogStats0)
|
checkCRILogsStats(assert, c0, &rootFsInfo, containerLogStats0)
|
||||||
|
|
||||||
c1 := containerStatsMap[cName1]
|
c1 := containerStatsMap[cName1]
|
||||||
assert.Equal(container1.CreatedAt, c1.StartTime.UnixNano())
|
assert.Equal(container1.CreatedAt, c1.StartTime.UnixNano())
|
||||||
checkCRICPUAndMemoryStats(assert, c1, infos[container1.ContainerStatus.Id].Stats[0])
|
checkCRICPUAndMemoryStats(assert, c1, infos[container1.ContainerStatus.Id].Stats[0])
|
||||||
|
checkCRIAcceleratorStats(assert, c1, infos[container1.ContainerStatus.Id].Stats[0])
|
||||||
checkCRIRootfsStats(assert, c1, containerStats1, nil)
|
checkCRIRootfsStats(assert, c1, containerStats1, nil)
|
||||||
checkCRILogsStats(assert, c1, &rootFsInfo, containerLogStats1)
|
checkCRILogsStats(assert, c1, &rootFsInfo, containerLogStats1)
|
||||||
checkCRINetworkStats(assert, p0.Network, infos[sandbox0.PodSandboxStatus.Id].Stats[0].Network)
|
checkCRINetworkStats(assert, p0.Network, infos[sandbox0.PodSandboxStatus.Id].Stats[0].Network)
|
||||||
@ -280,6 +283,7 @@ func TestCRIListPodStats(t *testing.T) {
|
|||||||
assert.Equal(cName2, c2.Name)
|
assert.Equal(cName2, c2.Name)
|
||||||
assert.Equal(container2.CreatedAt, c2.StartTime.UnixNano())
|
assert.Equal(container2.CreatedAt, c2.StartTime.UnixNano())
|
||||||
checkCRICPUAndMemoryStats(assert, c2, infos[container2.ContainerStatus.Id].Stats[0])
|
checkCRICPUAndMemoryStats(assert, c2, infos[container2.ContainerStatus.Id].Stats[0])
|
||||||
|
checkCRIAcceleratorStats(assert, c2, infos[container2.ContainerStatus.Id].Stats[0])
|
||||||
checkCRIRootfsStats(assert, c2, containerStats2, &imageFsInfo)
|
checkCRIRootfsStats(assert, c2, containerStats2, &imageFsInfo)
|
||||||
checkCRILogsStats(assert, c2, &rootFsInfo, containerLogStats2)
|
checkCRILogsStats(assert, c2, &rootFsInfo, containerLogStats2)
|
||||||
checkCRINetworkStats(assert, p1.Network, infos[sandbox1.PodSandboxStatus.Id].Stats[0].Network)
|
checkCRINetworkStats(assert, p1.Network, infos[sandbox1.PodSandboxStatus.Id].Stats[0].Network)
|
||||||
@ -296,6 +300,7 @@ func TestCRIListPodStats(t *testing.T) {
|
|||||||
assert.Equal(cName3, c3.Name)
|
assert.Equal(cName3, c3.Name)
|
||||||
assert.Equal(container4.CreatedAt, c3.StartTime.UnixNano())
|
assert.Equal(container4.CreatedAt, c3.StartTime.UnixNano())
|
||||||
checkCRICPUAndMemoryStats(assert, c3, infos[container4.ContainerStatus.Id].Stats[0])
|
checkCRICPUAndMemoryStats(assert, c3, infos[container4.ContainerStatus.Id].Stats[0])
|
||||||
|
checkCRIAcceleratorStats(assert, c3, infos[container4.ContainerStatus.Id].Stats[0])
|
||||||
checkCRIRootfsStats(assert, c3, containerStats4, &imageFsInfo)
|
checkCRIRootfsStats(assert, c3, containerStats4, &imageFsInfo)
|
||||||
|
|
||||||
checkCRILogsStats(assert, c3, &rootFsInfo, containerLogStats4)
|
checkCRILogsStats(assert, c3, &rootFsInfo, containerLogStats4)
|
||||||
@ -692,6 +697,18 @@ func checkCRICPUAndMemoryStats(assert *assert.Assertions, actual statsapi.Contai
|
|||||||
assert.Equal(cs.Memory.ContainerData.Pgmajfault, *actual.Memory.MajorPageFaults)
|
assert.Equal(cs.Memory.ContainerData.Pgmajfault, *actual.Memory.MajorPageFaults)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkCRIAcceleratorStats(assert *assert.Assertions, actual statsapi.ContainerStats, cs *cadvisorapiv2.ContainerStats) {
|
||||||
|
assert.Equal(len(cs.Accelerators), len(actual.Accelerators))
|
||||||
|
for i := range cs.Accelerators {
|
||||||
|
assert.Equal(cs.Accelerators[i].Make, actual.Accelerators[i].Make)
|
||||||
|
assert.Equal(cs.Accelerators[i].Model, actual.Accelerators[i].Model)
|
||||||
|
assert.Equal(cs.Accelerators[i].ID, actual.Accelerators[i].ID)
|
||||||
|
assert.Equal(cs.Accelerators[i].MemoryTotal, actual.Accelerators[i].MemoryTotal)
|
||||||
|
assert.Equal(cs.Accelerators[i].MemoryUsed, actual.Accelerators[i].MemoryUsed)
|
||||||
|
assert.Equal(cs.Accelerators[i].DutyCycle, actual.Accelerators[i].DutyCycle)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func checkCRIRootfsStats(assert *assert.Assertions, actual statsapi.ContainerStats, cs *runtimeapi.ContainerStats, imageFsInfo *cadvisorapiv2.FsInfo) {
|
func checkCRIRootfsStats(assert *assert.Assertions, actual statsapi.ContainerStats, cs *runtimeapi.ContainerStats, imageFsInfo *cadvisorapiv2.FsInfo) {
|
||||||
assert.Equal(cs.WritableLayer.Timestamp, actual.Rootfs.Time.UnixNano())
|
assert.Equal(cs.WritableLayer.Timestamp, actual.Rootfs.Time.UnixNano())
|
||||||
if imageFsInfo != nil {
|
if imageFsInfo != nil {
|
||||||
|
@ -153,6 +153,27 @@ func cadvisorInfoToContainerCPUAndMemoryStats(name string, info *cadvisorapiv2.C
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// cadvisorInfoToAcceleratorStats returns the statsapi.AcceleratorStats converted from
|
||||||
|
// the container info from cadvisor.
|
||||||
|
func cadvisorInfoToAcceleratorStats(info *cadvisorapiv2.ContainerInfo) []statsapi.AcceleratorStats {
|
||||||
|
cstat, found := latestContainerStats(info)
|
||||||
|
if !found || cstat.Accelerators == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var result []statsapi.AcceleratorStats
|
||||||
|
for _, acc := range cstat.Accelerators {
|
||||||
|
result = append(result, statsapi.AcceleratorStats{
|
||||||
|
Make: acc.Make,
|
||||||
|
Model: acc.Model,
|
||||||
|
ID: acc.ID,
|
||||||
|
MemoryTotal: acc.MemoryTotal,
|
||||||
|
MemoryUsed: acc.MemoryUsed,
|
||||||
|
DutyCycle: acc.DutyCycle,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
func cadvisorInfoToProcessStats(info *cadvisorapiv2.ContainerInfo) *statsapi.ProcessStats {
|
func cadvisorInfoToProcessStats(info *cadvisorapiv2.ContainerInfo) *statsapi.ProcessStats {
|
||||||
cstat, found := latestContainerStats(info)
|
cstat, found := latestContainerStats(info)
|
||||||
if !found || cstat.Processes == nil {
|
if !found || cstat.Processes == nil {
|
||||||
|
@ -59,6 +59,7 @@ const (
|
|||||||
offsetFsTotalUsageBytes
|
offsetFsTotalUsageBytes
|
||||||
offsetFsBaseUsageBytes
|
offsetFsBaseUsageBytes
|
||||||
offsetFsInodeUsage
|
offsetFsInodeUsage
|
||||||
|
offsetAcceleratorDutyCycle
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -499,6 +500,16 @@ func getTestContainerInfo(seed int, podName string, podNamespace string, contain
|
|||||||
BaseUsageBytes: &baseUsageBytes,
|
BaseUsageBytes: &baseUsageBytes,
|
||||||
InodeUsage: &inodeUsage,
|
InodeUsage: &inodeUsage,
|
||||||
},
|
},
|
||||||
|
Accelerators: []cadvisorapiv1.AcceleratorStats{
|
||||||
|
{
|
||||||
|
Make: "nvidia",
|
||||||
|
Model: "Tesla K80",
|
||||||
|
ID: "foobar",
|
||||||
|
MemoryTotal: uint64(seed + offsetMemUsageBytes),
|
||||||
|
MemoryUsed: uint64(seed + offsetMemUsageBytes),
|
||||||
|
DutyCycle: uint64(seed + offsetAcceleratorDutyCycle),
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
stats.Cpu.Usage.Total = uint64(seed + offsetCPUUsageCoreSeconds)
|
stats.Cpu.Usage.Total = uint64(seed + offsetCPUUsageCoreSeconds)
|
||||||
stats.CpuInst.Usage.Total = uint64(seed + offsetCPUUsageCores)
|
stats.CpuInst.Usage.Total = uint64(seed + offsetCPUUsageCores)
|
||||||
|
Loading…
Reference in New Issue
Block a user