Skip to content

Commit 92a42e6

Browse files
committed
Surface cadvisor PSI metrics to summary API and prometheus metrics
1 parent c7fc9d5 commit 92a42e6

File tree

5 files changed

+68
-0
lines changed

5 files changed

+68
-0
lines changed

Diff for: pkg/kubelet/cadvisor/cadvisor_linux.go

+6
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ import (
3939
cadvisorapiv2 "github.com/google/cadvisor/info/v2"
4040
"github.com/google/cadvisor/manager"
4141
"github.com/google/cadvisor/utils/sysfs"
42+
utilfeature "k8s.io/apiserver/pkg/util/feature"
4243
"k8s.io/klog/v2"
44+
"k8s.io/kubernetes/pkg/features"
4345
"k8s.io/utils/ptr"
4446
)
4547

@@ -93,6 +95,10 @@ func New(imageFsInfoProvider ImageFsInfoProvider, rootPath string, cgroupRoots [
9395
cadvisormetrics.OOMMetrics: struct{}{},
9496
}
9597

98+
if utilfeature.DefaultFeatureGate.Enabled(features.KubeletPSI) {
99+
includedMetrics[cadvisormetrics.PressureMetrics] = struct{}{}
100+
}
101+
96102
if usingLegacyStats || localStorageCapacityIsolation {
97103
includedMetrics[cadvisormetrics.DiskUsageMetrics] = struct{}{}
98104
}

Diff for: pkg/kubelet/server/server.go

+5
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,11 @@ func (s *Server) InstallAuthNotRequiredHandlers() {
455455
cadvisormetrics.ProcessMetrics: struct{}{},
456456
cadvisormetrics.OOMMetrics: struct{}{},
457457
}
458+
459+
if utilfeature.DefaultFeatureGate.Enabled(features.KubeletPSI) {
460+
includedMetrics[cadvisormetrics.PressureMetrics] = struct{}{}
461+
}
462+
458463
// cAdvisor metrics are exposed under the secured handler as well
459464
r := compbasemetrics.NewKubeRegistry()
460465
r.RawMustRegister(metrics.NewPrometheusMachineCollector(prometheusHostAdapter{s.host}, includedMetrics))

Diff for: pkg/kubelet/server/stats/summary.go

+5
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ import (
2424
"k8s.io/klog/v2"
2525

2626
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27+
utilfeature "k8s.io/apiserver/pkg/util/feature"
2728
statsapi "k8s.io/kubelet/pkg/apis/stats/v1alpha1"
29+
"k8s.io/kubernetes/pkg/features"
2830
"k8s.io/kubernetes/pkg/kubelet/util"
2931
)
3032

@@ -113,6 +115,9 @@ func (sp *summaryProviderImpl) Get(ctx context.Context, updateStats bool) (*stat
113115
Rlimit: rlimit,
114116
SystemContainers: sp.GetSystemContainersStats(nodeConfig, podStats, updateStats),
115117
}
118+
if utilfeature.DefaultFeatureGate.Enabled(features.KubeletPSI) {
119+
nodeStats.IO = rootStats.IO
120+
}
116121
summary := statsapi.Summary{
117122
Node: nodeStats,
118123
Pods: podStats,

Diff for: pkg/kubelet/stats/cadvisor_stats_provider.go

+3
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ func (p *cadvisorStatsProvider) ListPodStats(ctx context.Context) ([]statsapi.Po
156156
podStats.CPU = cpu
157157
podStats.Memory = memory
158158
podStats.Swap = cadvisorInfoToSwapStats(podInfo)
159+
if utilfeature.DefaultFeatureGate.Enabled(features.KubeletPSI) {
160+
podStats.IO = cadvisorInfoToIOStats(podInfo)
161+
}
159162
// ProcessStats were accumulated as the containers were iterated.
160163
}
161164

Diff for: pkg/kubelet/stats/helper.go

+49
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ import (
2424
cadvisorapiv2 "github.com/google/cadvisor/info/v2"
2525
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2626
"k8s.io/apimachinery/pkg/types"
27+
utilfeature "k8s.io/apiserver/pkg/util/feature"
2728
"k8s.io/klog/v2"
2829
statsapi "k8s.io/kubelet/pkg/apis/stats/v1alpha1"
30+
"k8s.io/kubernetes/pkg/features"
2931
"k8s.io/kubernetes/pkg/kubelet/cadvisor"
3032
"k8s.io/kubernetes/pkg/kubelet/server/stats"
3133
)
@@ -53,6 +55,9 @@ func cadvisorInfoToCPUandMemoryStats(info *cadvisorapiv2.ContainerInfo) (*statsa
5355
}
5456
if cstat.Cpu != nil {
5557
cpuStats.UsageCoreNanoSeconds = &cstat.Cpu.Usage.Total
58+
if utilfeature.DefaultFeatureGate.Enabled(features.KubeletPSI) {
59+
cpuStats.PSI = cadvisorPSIToStatsPSI(&cstat.Cpu.PSI)
60+
}
5661
}
5762
}
5863
if info.Spec.HasMemory && cstat.Memory != nil {
@@ -71,6 +76,9 @@ func cadvisorInfoToCPUandMemoryStats(info *cadvisorapiv2.ContainerInfo) (*statsa
7176
availableBytes := info.Spec.Memory.Limit - cstat.Memory.WorkingSet
7277
memoryStats.AvailableBytes = &availableBytes
7378
}
79+
if utilfeature.DefaultFeatureGate.Enabled(features.KubeletPSI) {
80+
memoryStats.PSI = cadvisorPSIToStatsPSI(&cstat.Memory.PSI)
81+
}
7482
} else {
7583
memoryStats = &statsapi.MemoryStats{
7684
Time: metav1.NewTime(cstat.Timestamp),
@@ -96,6 +104,9 @@ func cadvisorInfoToContainerStats(name string, info *cadvisorapiv2.ContainerInfo
96104
result.CPU = cpu
97105
result.Memory = memory
98106
result.Swap = cadvisorInfoToSwapStats(info)
107+
if utilfeature.DefaultFeatureGate.Enabled(features.KubeletPSI) {
108+
result.IO = cadvisorInfoToIOStats(info)
109+
}
99110

100111
// NOTE: if they can be found, log stats will be overwritten
101112
// by the caller, as it knows more information about the pod,
@@ -307,6 +318,24 @@ func cadvisorInfoToSwapStats(info *cadvisorapiv2.ContainerInfo) *statsapi.SwapSt
307318
return swapStats
308319
}
309320

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+
310339
// latestContainerStats returns the latest container stats from cadvisor, or nil if none exist
311340
func latestContainerStats(info *cadvisorapiv2.ContainerInfo) (*cadvisorapiv2.ContainerStats, bool) {
312341
stats := info.Stats
@@ -493,3 +522,23 @@ func makePodStorageStats(s *statsapi.PodStats, rootFsInfo *cadvisorapiv2.FsInfo,
493522
}
494523
s.EphemeralStorage = calcEphemeralStorage(s.Containers, ephemeralStats, rootFsInfo, logStats, etcHostsStats, isCRIStatsProvider)
495524
}
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

Comments
 (0)