...

Source file src/k8s.io/kubernetes/pkg/kubelet/stats/cri_stats_provider_linux.go

Documentation: k8s.io/kubernetes/pkg/kubelet/stats

     1  //go:build linux
     2  // +build linux
     3  
     4  /*
     5  Copyright 2023 The Kubernetes Authors.
     6  
     7  Licensed under the Apache License, Version 2.0 (the "License");
     8  you may not use this file except in compliance with the License.
     9  You may obtain a copy of the License at
    10  
    11      http://www.apache.org/licenses/LICENSE-2.0
    12  
    13  Unless required by applicable law or agreed to in writing, software
    14  distributed under the License is distributed on an "AS IS" BASIS,
    15  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    16  See the License for the specific language governing permissions and
    17  limitations under the License.
    18  */
    19  
    20  package stats
    21  
    22  import (
    23  	"fmt"
    24  	"time"
    25  
    26  	cadvisorapiv2 "github.com/google/cadvisor/info/v2"
    27  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    28  	runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
    29  	statsapi "k8s.io/kubelet/pkg/apis/stats/v1alpha1"
    30  )
    31  
    32  func (p *criStatsProvider) addCRIPodContainerStats(criSandboxStat *runtimeapi.PodSandboxStats,
    33  	ps *statsapi.PodStats, fsIDtoInfo map[runtimeapi.FilesystemIdentifier]*cadvisorapiv2.FsInfo,
    34  	containerMap map[string]*runtimeapi.Container,
    35  	podSandbox *runtimeapi.PodSandbox,
    36  	rootFsInfo *cadvisorapiv2.FsInfo, updateCPUNanoCoreUsage bool) error {
    37  	for _, criContainerStat := range criSandboxStat.Linux.Containers {
    38  		container, found := containerMap[criContainerStat.Attributes.Id]
    39  		if !found {
    40  			continue
    41  		}
    42  		// Fill available stats for full set of required pod stats
    43  		cs, err := p.makeContainerStats(criContainerStat, container, rootFsInfo, fsIDtoInfo, podSandbox.GetMetadata(),
    44  			updateCPUNanoCoreUsage)
    45  		if err != nil {
    46  			return fmt.Errorf("make container stats: %w", err)
    47  		}
    48  		ps.Containers = append(ps.Containers, *cs)
    49  	}
    50  	return nil
    51  }
    52  
    53  func addCRIPodNetworkStats(ps *statsapi.PodStats, criPodStat *runtimeapi.PodSandboxStats) {
    54  	if criPodStat == nil || criPodStat.Linux == nil || criPodStat.Linux.Network == nil {
    55  		return
    56  	}
    57  	criNetwork := criPodStat.Linux.Network
    58  	iStats := statsapi.NetworkStats{
    59  		Time:           metav1.NewTime(time.Unix(0, criNetwork.Timestamp)),
    60  		InterfaceStats: criInterfaceToSummary(criNetwork.DefaultInterface),
    61  		Interfaces:     make([]statsapi.InterfaceStats, 0, len(criNetwork.Interfaces)),
    62  	}
    63  	for _, iface := range criNetwork.Interfaces {
    64  		iStats.Interfaces = append(iStats.Interfaces, criInterfaceToSummary(iface))
    65  	}
    66  	ps.Network = &iStats
    67  }
    68  
    69  func addCRIPodMemoryStats(ps *statsapi.PodStats, criPodStat *runtimeapi.PodSandboxStats) {
    70  	if criPodStat == nil || criPodStat.Linux == nil || criPodStat.Linux.Memory == nil {
    71  		return
    72  	}
    73  	criMemory := criPodStat.Linux.Memory
    74  	ps.Memory = &statsapi.MemoryStats{
    75  		Time:            metav1.NewTime(time.Unix(0, criMemory.Timestamp)),
    76  		AvailableBytes:  valueOfUInt64Value(criMemory.AvailableBytes),
    77  		UsageBytes:      valueOfUInt64Value(criMemory.UsageBytes),
    78  		WorkingSetBytes: valueOfUInt64Value(criMemory.WorkingSetBytes),
    79  		RSSBytes:        valueOfUInt64Value(criMemory.RssBytes),
    80  		PageFaults:      valueOfUInt64Value(criMemory.PageFaults),
    81  		MajorPageFaults: valueOfUInt64Value(criMemory.MajorPageFaults),
    82  	}
    83  }
    84  
    85  func addCRIPodCPUStats(ps *statsapi.PodStats, criPodStat *runtimeapi.PodSandboxStats) {
    86  	if criPodStat == nil || criPodStat.Linux == nil || criPodStat.Linux.Cpu == nil {
    87  		return
    88  	}
    89  	criCPU := criPodStat.Linux.Cpu
    90  	ps.CPU = &statsapi.CPUStats{
    91  		Time:                 metav1.NewTime(time.Unix(0, criCPU.Timestamp)),
    92  		UsageNanoCores:       valueOfUInt64Value(criCPU.UsageNanoCores),
    93  		UsageCoreNanoSeconds: valueOfUInt64Value(criCPU.UsageCoreNanoSeconds),
    94  	}
    95  }
    96  
    97  func addCRIPodProcessStats(ps *statsapi.PodStats, criPodStat *runtimeapi.PodSandboxStats) {
    98  	if criPodStat == nil || criPodStat.Linux == nil || criPodStat.Linux.Process == nil {
    99  		return
   100  	}
   101  	ps.ProcessStats = &statsapi.ProcessStats{
   102  		ProcessCount: valueOfUInt64Value(criPodStat.Linux.Process.ProcessCount),
   103  	}
   104  }
   105  
   106  // listContainerNetworkStats returns the network stats of all the running containers.
   107  // It should return (nil, nil) for platforms other than Windows.
   108  func (p *criStatsProvider) listContainerNetworkStats() (map[string]*statsapi.NetworkStats, error) {
   109  	return nil, nil
   110  }
   111  

View as plain text