network_stats.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. // +build windows
  2. /*
  3. Copyright 2019 The Kubernetes Authors.
  4. Licensed under the Apache License, Version 2.0 (the "License");
  5. you may not use this file except in compliance with the License.
  6. You may obtain a copy of the License at
  7. http://www.apache.org/licenses/LICENSE-2.0
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. */
  14. package winstats
  15. import (
  16. "sync"
  17. cadvisorapi "github.com/google/cadvisor/info/v1"
  18. "k8s.io/apimachinery/pkg/util/sets"
  19. "k8s.io/klog"
  20. )
  21. const (
  22. packetsReceivedPerSecondQuery = "\\Network Adapter(*)\\Packets Received/sec"
  23. packetsSentPerSecondQuery = "\\Network Adapter(*)\\Packets Sent/sec"
  24. bytesReceivedPerSecondQuery = "\\Network Adapter(*)\\Bytes Received/sec"
  25. bytesSentPerSecondQuery = "\\Network Adapter(*)\\Bytes Sent/sec"
  26. packetsReceivedDiscardedQuery = "\\Network Adapter(*)\\Packets Received Discarded"
  27. packetsReceivedErrorsQuery = "\\Network Adapter(*)\\Packets Received Errors"
  28. packetsOutboundDiscardedQuery = "\\Network Adapter(*)\\Packets Outbound Discarded"
  29. packetsOutboundErrorsQuery = "\\Network Adapter(*)\\Packets Outbound Errors"
  30. )
  31. // networkCounter contains the counters for network adapters.
  32. type networkCounter struct {
  33. packetsReceivedPerSecondCounter *perfCounter
  34. packetsSentPerSecondCounter *perfCounter
  35. bytesReceivedPerSecondCounter *perfCounter
  36. bytesSentPerSecondCounter *perfCounter
  37. packetsReceivedDiscardedCounter *perfCounter
  38. packetsReceivedErrorsCounter *perfCounter
  39. packetsOutboundDiscardedCounter *perfCounter
  40. packetsOutboundErrorsCounter *perfCounter
  41. mu sync.RWMutex
  42. adapterStats map[string]cadvisorapi.InterfaceStats
  43. }
  44. func newNetworkCounters() (*networkCounter, error) {
  45. packetsReceivedPerSecondCounter, err := newPerfCounter(packetsReceivedPerSecondQuery)
  46. if err != nil {
  47. return nil, err
  48. }
  49. packetsSentPerSecondCounter, err := newPerfCounter(packetsSentPerSecondQuery)
  50. if err != nil {
  51. return nil, err
  52. }
  53. bytesReceivedPerSecondCounter, err := newPerfCounter(bytesReceivedPerSecondQuery)
  54. if err != nil {
  55. return nil, err
  56. }
  57. bytesSentPerSecondCounter, err := newPerfCounter(bytesSentPerSecondQuery)
  58. if err != nil {
  59. return nil, err
  60. }
  61. packetsReceivedDiscardedCounter, err := newPerfCounter(packetsReceivedDiscardedQuery)
  62. if err != nil {
  63. return nil, err
  64. }
  65. packetsReceivedErrorsCounter, err := newPerfCounter(packetsReceivedErrorsQuery)
  66. if err != nil {
  67. return nil, err
  68. }
  69. packetsOutboundDiscardedCounter, err := newPerfCounter(packetsOutboundDiscardedQuery)
  70. if err != nil {
  71. return nil, err
  72. }
  73. packetsOutboundErrorsCounter, err := newPerfCounter(packetsOutboundErrorsQuery)
  74. if err != nil {
  75. return nil, err
  76. }
  77. return &networkCounter{
  78. packetsReceivedPerSecondCounter: packetsReceivedPerSecondCounter,
  79. packetsSentPerSecondCounter: packetsSentPerSecondCounter,
  80. bytesReceivedPerSecondCounter: bytesReceivedPerSecondCounter,
  81. bytesSentPerSecondCounter: bytesSentPerSecondCounter,
  82. packetsReceivedDiscardedCounter: packetsReceivedDiscardedCounter,
  83. packetsReceivedErrorsCounter: packetsReceivedErrorsCounter,
  84. packetsOutboundDiscardedCounter: packetsOutboundDiscardedCounter,
  85. packetsOutboundErrorsCounter: packetsOutboundErrorsCounter,
  86. adapterStats: map[string]cadvisorapi.InterfaceStats{},
  87. }, nil
  88. }
  89. func (n *networkCounter) getData() ([]cadvisorapi.InterfaceStats, error) {
  90. packetsReceivedPerSecondData, err := n.packetsReceivedPerSecondCounter.getDataList()
  91. if err != nil {
  92. klog.Errorf("Unable to get packetsReceivedPerSecond perf counter data; err: %v", err)
  93. return nil, err
  94. }
  95. packetsSentPerSecondData, err := n.packetsSentPerSecondCounter.getDataList()
  96. if err != nil {
  97. klog.Errorf("Unable to get packetsSentPerSecond perf counter data; err: %v", err)
  98. return nil, err
  99. }
  100. bytesReceivedPerSecondData, err := n.bytesReceivedPerSecondCounter.getDataList()
  101. if err != nil {
  102. klog.Errorf("Unable to get bytesReceivedPerSecond perf counter data; err: %v", err)
  103. return nil, err
  104. }
  105. bytesSentPerSecondData, err := n.bytesSentPerSecondCounter.getDataList()
  106. if err != nil {
  107. klog.Errorf("Unable to get bytesSentPerSecond perf counter data; err: %v", err)
  108. return nil, err
  109. }
  110. packetsReceivedDiscardedData, err := n.packetsReceivedDiscardedCounter.getDataList()
  111. if err != nil {
  112. klog.Errorf("Unable to get packetsReceivedDiscarded perf counter data; err: %v", err)
  113. return nil, err
  114. }
  115. packetsReceivedErrorsData, err := n.packetsReceivedErrorsCounter.getDataList()
  116. if err != nil {
  117. klog.Errorf("Unable to get packetsReceivedErrors perf counter data; err: %v", err)
  118. return nil, err
  119. }
  120. packetsOutboundDiscardedData, err := n.packetsOutboundDiscardedCounter.getDataList()
  121. if err != nil {
  122. klog.Errorf("Unable to get packetsOutboundDiscarded perf counter data; err: %v", err)
  123. return nil, err
  124. }
  125. packetsOutboundErrorsData, err := n.packetsOutboundErrorsCounter.getDataList()
  126. if err != nil {
  127. klog.Errorf("Unable to get packetsOutboundErrors perf counter data; err: %v", err)
  128. return nil, err
  129. }
  130. n.mu.Lock()
  131. defer n.mu.Unlock()
  132. n.mergeCollectedData(
  133. packetsReceivedPerSecondData,
  134. packetsSentPerSecondData,
  135. bytesReceivedPerSecondData,
  136. bytesSentPerSecondData,
  137. packetsReceivedDiscardedData,
  138. packetsReceivedErrorsData,
  139. packetsOutboundDiscardedData,
  140. packetsOutboundErrorsData,
  141. )
  142. return n.listInterfaceStats(), nil
  143. }
  144. // mergeCollectedData merges the collected data into cache. It should be invoked under lock protected.
  145. func (n *networkCounter) mergeCollectedData(packetsReceivedPerSecondData,
  146. packetsSentPerSecondData,
  147. bytesReceivedPerSecondData,
  148. bytesSentPerSecondData,
  149. packetsReceivedDiscardedData,
  150. packetsReceivedErrorsData,
  151. packetsOutboundDiscardedData,
  152. packetsOutboundErrorsData map[string]uint64) {
  153. adapters := sets.NewString()
  154. // merge the collected data and list of adapters.
  155. adapters.Insert(n.mergePacketsReceivedPerSecondData(packetsReceivedPerSecondData)...)
  156. adapters.Insert(n.mergePacketsSentPerSecondData(packetsSentPerSecondData)...)
  157. adapters.Insert(n.mergeBytesReceivedPerSecondData(bytesReceivedPerSecondData)...)
  158. adapters.Insert(n.mergeBytesSentPerSecondData(bytesSentPerSecondData)...)
  159. adapters.Insert(n.mergePacketsReceivedDiscardedData(packetsReceivedDiscardedData)...)
  160. adapters.Insert(n.mergePacketsReceivedErrorsData(packetsReceivedErrorsData)...)
  161. adapters.Insert(n.mergePacketsOutboundDiscardedData(packetsOutboundDiscardedData)...)
  162. adapters.Insert(n.mergePacketsOutboundErrorsData(packetsOutboundErrorsData)...)
  163. // delete the cache for non-existing adapters.
  164. for adapter := range n.adapterStats {
  165. if !adapters.Has(adapter) {
  166. delete(n.adapterStats, adapter)
  167. }
  168. }
  169. }
  170. func (n *networkCounter) mergePacketsReceivedPerSecondData(packetsReceivedPerSecondData map[string]uint64) []string {
  171. var adapters []string
  172. for adapterName, value := range packetsReceivedPerSecondData {
  173. adapters = append(adapters, adapterName)
  174. newStat := n.adapterStats[adapterName]
  175. newStat.Name = adapterName
  176. newStat.RxPackets = newStat.RxPackets + value
  177. n.adapterStats[adapterName] = newStat
  178. }
  179. return adapters
  180. }
  181. func (n *networkCounter) mergePacketsSentPerSecondData(packetsSentPerSecondData map[string]uint64) []string {
  182. var adapters []string
  183. for adapterName, value := range packetsSentPerSecondData {
  184. adapters = append(adapters, adapterName)
  185. newStat := n.adapterStats[adapterName]
  186. newStat.Name = adapterName
  187. newStat.TxPackets = newStat.TxPackets + value
  188. n.adapterStats[adapterName] = newStat
  189. }
  190. return adapters
  191. }
  192. func (n *networkCounter) mergeBytesReceivedPerSecondData(bytesReceivedPerSecondData map[string]uint64) []string {
  193. var adapters []string
  194. for adapterName, value := range bytesReceivedPerSecondData {
  195. adapters = append(adapters, adapterName)
  196. newStat := n.adapterStats[adapterName]
  197. newStat.Name = adapterName
  198. newStat.RxBytes = newStat.RxBytes + value
  199. n.adapterStats[adapterName] = newStat
  200. }
  201. return adapters
  202. }
  203. func (n *networkCounter) mergeBytesSentPerSecondData(bytesSentPerSecondData map[string]uint64) []string {
  204. var adapters []string
  205. for adapterName, value := range bytesSentPerSecondData {
  206. adapters = append(adapters, adapterName)
  207. newStat := n.adapterStats[adapterName]
  208. newStat.Name = adapterName
  209. newStat.TxBytes = newStat.TxBytes + value
  210. n.adapterStats[adapterName] = newStat
  211. }
  212. return adapters
  213. }
  214. func (n *networkCounter) mergePacketsReceivedDiscardedData(packetsReceivedDiscardedData map[string]uint64) []string {
  215. var adapters []string
  216. for adapterName, value := range packetsReceivedDiscardedData {
  217. adapters = append(adapters, adapterName)
  218. newStat := n.adapterStats[adapterName]
  219. newStat.Name = adapterName
  220. newStat.RxDropped = value
  221. n.adapterStats[adapterName] = newStat
  222. }
  223. return adapters
  224. }
  225. func (n *networkCounter) mergePacketsReceivedErrorsData(packetsReceivedErrorsData map[string]uint64) []string {
  226. var adapters []string
  227. for adapterName, value := range packetsReceivedErrorsData {
  228. adapters = append(adapters, adapterName)
  229. newStat := n.adapterStats[adapterName]
  230. newStat.Name = adapterName
  231. newStat.RxErrors = value
  232. n.adapterStats[adapterName] = newStat
  233. }
  234. return adapters
  235. }
  236. func (n *networkCounter) mergePacketsOutboundDiscardedData(packetsOutboundDiscardedData map[string]uint64) []string {
  237. var adapters []string
  238. for adapterName, value := range packetsOutboundDiscardedData {
  239. adapters = append(adapters, adapterName)
  240. newStat := n.adapterStats[adapterName]
  241. newStat.Name = adapterName
  242. newStat.TxDropped = value
  243. n.adapterStats[adapterName] = newStat
  244. }
  245. return adapters
  246. }
  247. func (n *networkCounter) mergePacketsOutboundErrorsData(packetsOutboundErrorsData map[string]uint64) []string {
  248. var adapters []string
  249. for adapterName, value := range packetsOutboundErrorsData {
  250. adapters = append(adapters, adapterName)
  251. newStat := n.adapterStats[adapterName]
  252. newStat.Name = adapterName
  253. newStat.TxErrors = value
  254. n.adapterStats[adapterName] = newStat
  255. }
  256. return adapters
  257. }
  258. func (n *networkCounter) listInterfaceStats() []cadvisorapi.InterfaceStats {
  259. stats := make([]cadvisorapi.InterfaceStats, 0, len(n.adapterStats))
  260. for _, stat := range n.adapterStats {
  261. stats = append(stats, stat)
  262. }
  263. return stats
  264. }