k8s.io/kubernetes@v1.29.3/pkg/kubelet/winstats/network_stats.go (about)

     1  //go:build windows
     2  // +build windows
     3  
     4  /*
     5  Copyright 2019 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 winstats
    21  
    22  import (
    23  	"sync"
    24  
    25  	cadvisorapi "github.com/google/cadvisor/info/v1"
    26  	"k8s.io/apimachinery/pkg/util/sets"
    27  	"k8s.io/klog/v2"
    28  )
    29  
    30  const (
    31  	packetsReceivedPerSecondQuery = "\\Network Adapter(*)\\Packets Received/sec"
    32  	packetsSentPerSecondQuery     = "\\Network Adapter(*)\\Packets Sent/sec"
    33  	bytesReceivedPerSecondQuery   = "\\Network Adapter(*)\\Bytes Received/sec"
    34  	bytesSentPerSecondQuery       = "\\Network Adapter(*)\\Bytes Sent/sec"
    35  	packetsReceivedDiscardedQuery = "\\Network Adapter(*)\\Packets Received Discarded"
    36  	packetsReceivedErrorsQuery    = "\\Network Adapter(*)\\Packets Received Errors"
    37  	packetsOutboundDiscardedQuery = "\\Network Adapter(*)\\Packets Outbound Discarded"
    38  	packetsOutboundErrorsQuery    = "\\Network Adapter(*)\\Packets Outbound Errors"
    39  )
    40  
    41  // networkCounter contains the counters for network adapters.
    42  type networkCounter struct {
    43  	packetsReceivedPerSecondCounter perfCounter
    44  	packetsSentPerSecondCounter     perfCounter
    45  	bytesReceivedPerSecondCounter   perfCounter
    46  	bytesSentPerSecondCounter       perfCounter
    47  	packetsReceivedDiscardedCounter perfCounter
    48  	packetsReceivedErrorsCounter    perfCounter
    49  	packetsOutboundDiscardedCounter perfCounter
    50  	packetsOutboundErrorsCounter    perfCounter
    51  
    52  	mu           sync.RWMutex
    53  	adapterStats map[string]cadvisorapi.InterfaceStats
    54  }
    55  
    56  func newNetworkCounters() (*networkCounter, error) {
    57  	packetsReceivedPerSecondCounter, err := newPerfCounter(packetsReceivedPerSecondQuery)
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  
    62  	packetsSentPerSecondCounter, err := newPerfCounter(packetsSentPerSecondQuery)
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  
    67  	bytesReceivedPerSecondCounter, err := newPerfCounter(bytesReceivedPerSecondQuery)
    68  	if err != nil {
    69  		return nil, err
    70  	}
    71  
    72  	bytesSentPerSecondCounter, err := newPerfCounter(bytesSentPerSecondQuery)
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  
    77  	packetsReceivedDiscardedCounter, err := newPerfCounter(packetsReceivedDiscardedQuery)
    78  	if err != nil {
    79  		return nil, err
    80  	}
    81  
    82  	packetsReceivedErrorsCounter, err := newPerfCounter(packetsReceivedErrorsQuery)
    83  	if err != nil {
    84  		return nil, err
    85  	}
    86  
    87  	packetsOutboundDiscardedCounter, err := newPerfCounter(packetsOutboundDiscardedQuery)
    88  	if err != nil {
    89  		return nil, err
    90  	}
    91  
    92  	packetsOutboundErrorsCounter, err := newPerfCounter(packetsOutboundErrorsQuery)
    93  	if err != nil {
    94  		return nil, err
    95  	}
    96  
    97  	return &networkCounter{
    98  		packetsReceivedPerSecondCounter: packetsReceivedPerSecondCounter,
    99  		packetsSentPerSecondCounter:     packetsSentPerSecondCounter,
   100  		bytesReceivedPerSecondCounter:   bytesReceivedPerSecondCounter,
   101  		bytesSentPerSecondCounter:       bytesSentPerSecondCounter,
   102  		packetsReceivedDiscardedCounter: packetsReceivedDiscardedCounter,
   103  		packetsReceivedErrorsCounter:    packetsReceivedErrorsCounter,
   104  		packetsOutboundDiscardedCounter: packetsOutboundDiscardedCounter,
   105  		packetsOutboundErrorsCounter:    packetsOutboundErrorsCounter,
   106  		adapterStats:                    map[string]cadvisorapi.InterfaceStats{},
   107  	}, nil
   108  }
   109  
   110  func (n *networkCounter) getData() ([]cadvisorapi.InterfaceStats, error) {
   111  	packetsReceivedPerSecondData, err := n.packetsReceivedPerSecondCounter.getDataList()
   112  	if err != nil {
   113  		klog.ErrorS(err, "Unable to get packetsReceivedPerSecond perf counter data")
   114  		return nil, err
   115  	}
   116  
   117  	packetsSentPerSecondData, err := n.packetsSentPerSecondCounter.getDataList()
   118  	if err != nil {
   119  		klog.ErrorS(err, "Unable to get packetsSentPerSecond perf counter data")
   120  		return nil, err
   121  	}
   122  
   123  	bytesReceivedPerSecondData, err := n.bytesReceivedPerSecondCounter.getDataList()
   124  	if err != nil {
   125  		klog.ErrorS(err, "Unable to get bytesReceivedPerSecond perf counter data")
   126  		return nil, err
   127  	}
   128  
   129  	bytesSentPerSecondData, err := n.bytesSentPerSecondCounter.getDataList()
   130  	if err != nil {
   131  		klog.ErrorS(err, "Unable to get bytesSentPerSecond perf counter data")
   132  		return nil, err
   133  	}
   134  
   135  	packetsReceivedDiscardedData, err := n.packetsReceivedDiscardedCounter.getDataList()
   136  	if err != nil {
   137  		klog.ErrorS(err, "Unable to get packetsReceivedDiscarded perf counter data")
   138  		return nil, err
   139  	}
   140  
   141  	packetsReceivedErrorsData, err := n.packetsReceivedErrorsCounter.getDataList()
   142  	if err != nil {
   143  		klog.ErrorS(err, "Unable to get packetsReceivedErrors perf counter data")
   144  		return nil, err
   145  	}
   146  
   147  	packetsOutboundDiscardedData, err := n.packetsOutboundDiscardedCounter.getDataList()
   148  	if err != nil {
   149  		klog.ErrorS(err, "Unable to get packetsOutboundDiscarded perf counter data")
   150  		return nil, err
   151  	}
   152  
   153  	packetsOutboundErrorsData, err := n.packetsOutboundErrorsCounter.getDataList()
   154  	if err != nil {
   155  		klog.ErrorS(err, "Unable to get packetsOutboundErrors perf counter data")
   156  		return nil, err
   157  	}
   158  
   159  	n.mu.Lock()
   160  	defer n.mu.Unlock()
   161  	n.mergeCollectedData(
   162  		packetsReceivedPerSecondData,
   163  		packetsSentPerSecondData,
   164  		bytesReceivedPerSecondData,
   165  		bytesSentPerSecondData,
   166  		packetsReceivedDiscardedData,
   167  		packetsReceivedErrorsData,
   168  		packetsOutboundDiscardedData,
   169  		packetsOutboundErrorsData,
   170  	)
   171  	return n.listInterfaceStats(), nil
   172  }
   173  
   174  // mergeCollectedData merges the collected data into cache. It should be invoked under lock protected.
   175  func (n *networkCounter) mergeCollectedData(packetsReceivedPerSecondData,
   176  	packetsSentPerSecondData,
   177  	bytesReceivedPerSecondData,
   178  	bytesSentPerSecondData,
   179  	packetsReceivedDiscardedData,
   180  	packetsReceivedErrorsData,
   181  	packetsOutboundDiscardedData,
   182  	packetsOutboundErrorsData map[string]uint64) {
   183  	adapters := sets.NewString()
   184  
   185  	// merge the collected data and list of adapters.
   186  	adapters.Insert(n.mergePacketsReceivedPerSecondData(packetsReceivedPerSecondData)...)
   187  	adapters.Insert(n.mergePacketsSentPerSecondData(packetsSentPerSecondData)...)
   188  	adapters.Insert(n.mergeBytesReceivedPerSecondData(bytesReceivedPerSecondData)...)
   189  	adapters.Insert(n.mergeBytesSentPerSecondData(bytesSentPerSecondData)...)
   190  	adapters.Insert(n.mergePacketsReceivedDiscardedData(packetsReceivedDiscardedData)...)
   191  	adapters.Insert(n.mergePacketsReceivedErrorsData(packetsReceivedErrorsData)...)
   192  	adapters.Insert(n.mergePacketsOutboundDiscardedData(packetsOutboundDiscardedData)...)
   193  	adapters.Insert(n.mergePacketsOutboundErrorsData(packetsOutboundErrorsData)...)
   194  
   195  	// delete the cache for non-existing adapters.
   196  	for adapter := range n.adapterStats {
   197  		if !adapters.Has(adapter) {
   198  			delete(n.adapterStats, adapter)
   199  		}
   200  	}
   201  }
   202  
   203  func (n *networkCounter) mergePacketsReceivedPerSecondData(packetsReceivedPerSecondData map[string]uint64) []string {
   204  	var adapters []string
   205  	for adapterName, value := range packetsReceivedPerSecondData {
   206  		adapters = append(adapters, adapterName)
   207  		newStat := n.adapterStats[adapterName]
   208  		newStat.Name = adapterName
   209  		newStat.RxPackets = newStat.RxPackets + value
   210  		n.adapterStats[adapterName] = newStat
   211  	}
   212  
   213  	return adapters
   214  }
   215  
   216  func (n *networkCounter) mergePacketsSentPerSecondData(packetsSentPerSecondData map[string]uint64) []string {
   217  	var adapters []string
   218  	for adapterName, value := range packetsSentPerSecondData {
   219  		adapters = append(adapters, adapterName)
   220  		newStat := n.adapterStats[adapterName]
   221  		newStat.Name = adapterName
   222  		newStat.TxPackets = newStat.TxPackets + value
   223  		n.adapterStats[adapterName] = newStat
   224  	}
   225  
   226  	return adapters
   227  }
   228  
   229  func (n *networkCounter) mergeBytesReceivedPerSecondData(bytesReceivedPerSecondData map[string]uint64) []string {
   230  	var adapters []string
   231  	for adapterName, value := range bytesReceivedPerSecondData {
   232  		adapters = append(adapters, adapterName)
   233  		newStat := n.adapterStats[adapterName]
   234  		newStat.Name = adapterName
   235  		newStat.RxBytes = newStat.RxBytes + value
   236  		n.adapterStats[adapterName] = newStat
   237  	}
   238  
   239  	return adapters
   240  }
   241  
   242  func (n *networkCounter) mergeBytesSentPerSecondData(bytesSentPerSecondData map[string]uint64) []string {
   243  	var adapters []string
   244  	for adapterName, value := range bytesSentPerSecondData {
   245  		adapters = append(adapters, adapterName)
   246  		newStat := n.adapterStats[adapterName]
   247  		newStat.Name = adapterName
   248  		newStat.TxBytes = newStat.TxBytes + value
   249  		n.adapterStats[adapterName] = newStat
   250  	}
   251  
   252  	return adapters
   253  }
   254  
   255  func (n *networkCounter) mergePacketsReceivedDiscardedData(packetsReceivedDiscardedData map[string]uint64) []string {
   256  	var adapters []string
   257  	for adapterName, value := range packetsReceivedDiscardedData {
   258  		adapters = append(adapters, adapterName)
   259  		newStat := n.adapterStats[adapterName]
   260  		newStat.Name = adapterName
   261  		newStat.RxDropped = value
   262  		n.adapterStats[adapterName] = newStat
   263  	}
   264  
   265  	return adapters
   266  }
   267  
   268  func (n *networkCounter) mergePacketsReceivedErrorsData(packetsReceivedErrorsData map[string]uint64) []string {
   269  	var adapters []string
   270  	for adapterName, value := range packetsReceivedErrorsData {
   271  		adapters = append(adapters, adapterName)
   272  		newStat := n.adapterStats[adapterName]
   273  		newStat.Name = adapterName
   274  		newStat.RxErrors = value
   275  		n.adapterStats[adapterName] = newStat
   276  	}
   277  
   278  	return adapters
   279  }
   280  
   281  func (n *networkCounter) mergePacketsOutboundDiscardedData(packetsOutboundDiscardedData map[string]uint64) []string {
   282  	var adapters []string
   283  	for adapterName, value := range packetsOutboundDiscardedData {
   284  		adapters = append(adapters, adapterName)
   285  		newStat := n.adapterStats[adapterName]
   286  		newStat.Name = adapterName
   287  		newStat.TxDropped = value
   288  		n.adapterStats[adapterName] = newStat
   289  	}
   290  
   291  	return adapters
   292  }
   293  
   294  func (n *networkCounter) mergePacketsOutboundErrorsData(packetsOutboundErrorsData map[string]uint64) []string {
   295  	var adapters []string
   296  	for adapterName, value := range packetsOutboundErrorsData {
   297  		adapters = append(adapters, adapterName)
   298  		newStat := n.adapterStats[adapterName]
   299  		newStat.Name = adapterName
   300  		newStat.TxErrors = value
   301  		n.adapterStats[adapterName] = newStat
   302  	}
   303  
   304  	return adapters
   305  }
   306  
   307  func (n *networkCounter) listInterfaceStats() []cadvisorapi.InterfaceStats {
   308  	stats := make([]cadvisorapi.InterfaceStats, 0, len(n.adapterStats))
   309  	for _, stat := range n.adapterStats {
   310  		stats = append(stats, stat)
   311  	}
   312  	return stats
   313  }