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 }