@@ -24,8 +24,10 @@ import (
24
24
cadvisorapiv2 "github.com/google/cadvisor/info/v2"
25
25
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26
26
"k8s.io/apimachinery/pkg/types"
27
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
27
28
"k8s.io/klog/v2"
28
29
statsapi "k8s.io/kubelet/pkg/apis/stats/v1alpha1"
30
+ "k8s.io/kubernetes/pkg/features"
29
31
"k8s.io/kubernetes/pkg/kubelet/cadvisor"
30
32
"k8s.io/kubernetes/pkg/kubelet/server/stats"
31
33
)
@@ -53,6 +55,9 @@ func cadvisorInfoToCPUandMemoryStats(info *cadvisorapiv2.ContainerInfo) (*statsa
53
55
}
54
56
if cstat .Cpu != nil {
55
57
cpuStats .UsageCoreNanoSeconds = & cstat .Cpu .Usage .Total
58
+ if utilfeature .DefaultFeatureGate .Enabled (features .KubeletPSI ) {
59
+ cpuStats .PSI = cadvisorPSIToStatsPSI (& cstat .Cpu .PSI )
60
+ }
56
61
}
57
62
}
58
63
if info .Spec .HasMemory && cstat .Memory != nil {
@@ -71,6 +76,9 @@ func cadvisorInfoToCPUandMemoryStats(info *cadvisorapiv2.ContainerInfo) (*statsa
71
76
availableBytes := info .Spec .Memory .Limit - cstat .Memory .WorkingSet
72
77
memoryStats .AvailableBytes = & availableBytes
73
78
}
79
+ if utilfeature .DefaultFeatureGate .Enabled (features .KubeletPSI ) {
80
+ memoryStats .PSI = cadvisorPSIToStatsPSI (& cstat .Memory .PSI )
81
+ }
74
82
} else {
75
83
memoryStats = & statsapi.MemoryStats {
76
84
Time : metav1 .NewTime (cstat .Timestamp ),
@@ -96,6 +104,9 @@ func cadvisorInfoToContainerStats(name string, info *cadvisorapiv2.ContainerInfo
96
104
result .CPU = cpu
97
105
result .Memory = memory
98
106
result .Swap = cadvisorInfoToSwapStats (info )
107
+ if utilfeature .DefaultFeatureGate .Enabled (features .KubeletPSI ) {
108
+ result .IO = cadvisorInfoToIOStats (info )
109
+ }
99
110
100
111
// NOTE: if they can be found, log stats will be overwritten
101
112
// by the caller, as it knows more information about the pod,
@@ -307,6 +318,24 @@ func cadvisorInfoToSwapStats(info *cadvisorapiv2.ContainerInfo) *statsapi.SwapSt
307
318
return swapStats
308
319
}
309
320
321
+ func cadvisorInfoToIOStats (info * cadvisorapiv2.ContainerInfo ) * statsapi.IOStats {
322
+ cstat , found := latestContainerStats (info )
323
+ if ! found {
324
+ return nil
325
+ }
326
+
327
+ var ioStats * statsapi.IOStats
328
+
329
+ if info .Spec .HasDiskIo && cstat .DiskIo != nil {
330
+ ioStats = & statsapi.IOStats {
331
+ Time : metav1 .NewTime (cstat .Timestamp ),
332
+ PSI : cadvisorPSIToStatsPSI (& cstat .DiskIo .PSI ),
333
+ }
334
+ }
335
+
336
+ return ioStats
337
+ }
338
+
310
339
// latestContainerStats returns the latest container stats from cadvisor, or nil if none exist
311
340
func latestContainerStats (info * cadvisorapiv2.ContainerInfo ) (* cadvisorapiv2.ContainerStats , bool ) {
312
341
stats := info .Stats
@@ -493,3 +522,23 @@ func makePodStorageStats(s *statsapi.PodStats, rootFsInfo *cadvisorapiv2.FsInfo,
493
522
}
494
523
s .EphemeralStorage = calcEphemeralStorage (s .Containers , ephemeralStats , rootFsInfo , logStats , etcHostsStats , isCRIStatsProvider )
495
524
}
525
+
526
+ func cadvisorPSIToStatsPSI (psi * cadvisorapiv1.PSIStats ) * statsapi.PSIStats {
527
+ if psi == nil {
528
+ return nil
529
+ }
530
+ return & statsapi.PSIStats {
531
+ Full : statsapi.PSIData {
532
+ Total : psi .Full .Total ,
533
+ Avg10 : psi .Full .Avg10 ,
534
+ Avg60 : psi .Full .Avg60 ,
535
+ Avg300 : psi .Full .Avg300 ,
536
+ },
537
+ Some : statsapi.PSIData {
538
+ Total : psi .Some .Total ,
539
+ Avg10 : psi .Some .Avg10 ,
540
+ Avg60 : psi .Some .Avg60 ,
541
+ Avg300 : psi .Some .Avg300 ,
542
+ },
543
+ }
544
+ }
0 commit comments