You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

441 regels
14 KiB

  1. // Copyright 2022 The Prometheus Authors
  2. // Licensed under the Apache License, Version 2.0 (the "License");
  3. // you may not use this file except in compliance with the License.
  4. // You may obtain a copy of the License at
  5. //
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  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. package procfs
  14. import (
  15. "bufio"
  16. "bytes"
  17. "fmt"
  18. "io"
  19. "strconv"
  20. "strings"
  21. "github.com/prometheus/procfs/internal/util"
  22. )
  23. // ProcNetstat models the content of /proc/<pid>/net/netstat.
  24. type ProcNetstat struct {
  25. // The process ID.
  26. PID int
  27. TcpExt
  28. IpExt
  29. }
  30. type TcpExt struct { // nolint:revive
  31. SyncookiesSent float64
  32. SyncookiesRecv float64
  33. SyncookiesFailed float64
  34. EmbryonicRsts float64
  35. PruneCalled float64
  36. RcvPruned float64
  37. OfoPruned float64
  38. OutOfWindowIcmps float64
  39. LockDroppedIcmps float64
  40. ArpFilter float64
  41. TW float64
  42. TWRecycled float64
  43. TWKilled float64
  44. PAWSActive float64
  45. PAWSEstab float64
  46. DelayedACKs float64
  47. DelayedACKLocked float64
  48. DelayedACKLost float64
  49. ListenOverflows float64
  50. ListenDrops float64
  51. TCPHPHits float64
  52. TCPPureAcks float64
  53. TCPHPAcks float64
  54. TCPRenoRecovery float64
  55. TCPSackRecovery float64
  56. TCPSACKReneging float64
  57. TCPSACKReorder float64
  58. TCPRenoReorder float64
  59. TCPTSReorder float64
  60. TCPFullUndo float64
  61. TCPPartialUndo float64
  62. TCPDSACKUndo float64
  63. TCPLossUndo float64
  64. TCPLostRetransmit float64
  65. TCPRenoFailures float64
  66. TCPSackFailures float64
  67. TCPLossFailures float64
  68. TCPFastRetrans float64
  69. TCPSlowStartRetrans float64
  70. TCPTimeouts float64
  71. TCPLossProbes float64
  72. TCPLossProbeRecovery float64
  73. TCPRenoRecoveryFail float64
  74. TCPSackRecoveryFail float64
  75. TCPRcvCollapsed float64
  76. TCPDSACKOldSent float64
  77. TCPDSACKOfoSent float64
  78. TCPDSACKRecv float64
  79. TCPDSACKOfoRecv float64
  80. TCPAbortOnData float64
  81. TCPAbortOnClose float64
  82. TCPAbortOnMemory float64
  83. TCPAbortOnTimeout float64
  84. TCPAbortOnLinger float64
  85. TCPAbortFailed float64
  86. TCPMemoryPressures float64
  87. TCPMemoryPressuresChrono float64
  88. TCPSACKDiscard float64
  89. TCPDSACKIgnoredOld float64
  90. TCPDSACKIgnoredNoUndo float64
  91. TCPSpuriousRTOs float64
  92. TCPMD5NotFound float64
  93. TCPMD5Unexpected float64
  94. TCPMD5Failure float64
  95. TCPSackShifted float64
  96. TCPSackMerged float64
  97. TCPSackShiftFallback float64
  98. TCPBacklogDrop float64
  99. PFMemallocDrop float64
  100. TCPMinTTLDrop float64
  101. TCPDeferAcceptDrop float64
  102. IPReversePathFilter float64
  103. TCPTimeWaitOverflow float64
  104. TCPReqQFullDoCookies float64
  105. TCPReqQFullDrop float64
  106. TCPRetransFail float64
  107. TCPRcvCoalesce float64
  108. TCPOFOQueue float64
  109. TCPOFODrop float64
  110. TCPOFOMerge float64
  111. TCPChallengeACK float64
  112. TCPSYNChallenge float64
  113. TCPFastOpenActive float64
  114. TCPFastOpenActiveFail float64
  115. TCPFastOpenPassive float64
  116. TCPFastOpenPassiveFail float64
  117. TCPFastOpenListenOverflow float64
  118. TCPFastOpenCookieReqd float64
  119. TCPFastOpenBlackhole float64
  120. TCPSpuriousRtxHostQueues float64
  121. BusyPollRxPackets float64
  122. TCPAutoCorking float64
  123. TCPFromZeroWindowAdv float64
  124. TCPToZeroWindowAdv float64
  125. TCPWantZeroWindowAdv float64
  126. TCPSynRetrans float64
  127. TCPOrigDataSent float64
  128. TCPHystartTrainDetect float64
  129. TCPHystartTrainCwnd float64
  130. TCPHystartDelayDetect float64
  131. TCPHystartDelayCwnd float64
  132. TCPACKSkippedSynRecv float64
  133. TCPACKSkippedPAWS float64
  134. TCPACKSkippedSeq float64
  135. TCPACKSkippedFinWait2 float64
  136. TCPACKSkippedTimeWait float64
  137. TCPACKSkippedChallenge float64
  138. TCPWinProbe float64
  139. TCPKeepAlive float64
  140. TCPMTUPFail float64
  141. TCPMTUPSuccess float64
  142. TCPWqueueTooBig float64
  143. }
  144. type IpExt struct { // nolint:revive
  145. InNoRoutes float64
  146. InTruncatedPkts float64
  147. InMcastPkts float64
  148. OutMcastPkts float64
  149. InBcastPkts float64
  150. OutBcastPkts float64
  151. InOctets float64
  152. OutOctets float64
  153. InMcastOctets float64
  154. OutMcastOctets float64
  155. InBcastOctets float64
  156. OutBcastOctets float64
  157. InCsumErrors float64
  158. InNoECTPkts float64
  159. InECT1Pkts float64
  160. InECT0Pkts float64
  161. InCEPkts float64
  162. ReasmOverlaps float64
  163. }
  164. func (p Proc) Netstat() (ProcNetstat, error) {
  165. filename := p.path("net/netstat")
  166. data, err := util.ReadFileNoStat(filename)
  167. if err != nil {
  168. return ProcNetstat{PID: p.PID}, err
  169. }
  170. procNetstat, err := parseNetstat(bytes.NewReader(data), filename)
  171. procNetstat.PID = p.PID
  172. return procNetstat, err
  173. }
  174. // parseNetstat parses the metrics from proc/<pid>/net/netstat file
  175. // and returns a ProcNetstat structure.
  176. func parseNetstat(r io.Reader, fileName string) (ProcNetstat, error) {
  177. var (
  178. scanner = bufio.NewScanner(r)
  179. procNetstat = ProcNetstat{}
  180. )
  181. for scanner.Scan() {
  182. nameParts := strings.Split(scanner.Text(), " ")
  183. scanner.Scan()
  184. valueParts := strings.Split(scanner.Text(), " ")
  185. // Remove trailing :.
  186. protocol := strings.TrimSuffix(nameParts[0], ":")
  187. if len(nameParts) != len(valueParts) {
  188. return procNetstat, fmt.Errorf("mismatch field count mismatch in %s: %s",
  189. fileName, protocol)
  190. }
  191. for i := 1; i < len(nameParts); i++ {
  192. value, err := strconv.ParseFloat(valueParts[i], 64)
  193. if err != nil {
  194. return procNetstat, err
  195. }
  196. key := nameParts[i]
  197. switch protocol {
  198. case "TcpExt":
  199. switch key {
  200. case "SyncookiesSent":
  201. procNetstat.TcpExt.SyncookiesSent = value
  202. case "SyncookiesRecv":
  203. procNetstat.TcpExt.SyncookiesRecv = value
  204. case "SyncookiesFailed":
  205. procNetstat.TcpExt.SyncookiesFailed = value
  206. case "EmbryonicRsts":
  207. procNetstat.TcpExt.EmbryonicRsts = value
  208. case "PruneCalled":
  209. procNetstat.TcpExt.PruneCalled = value
  210. case "RcvPruned":
  211. procNetstat.TcpExt.RcvPruned = value
  212. case "OfoPruned":
  213. procNetstat.TcpExt.OfoPruned = value
  214. case "OutOfWindowIcmps":
  215. procNetstat.TcpExt.OutOfWindowIcmps = value
  216. case "LockDroppedIcmps":
  217. procNetstat.TcpExt.LockDroppedIcmps = value
  218. case "ArpFilter":
  219. procNetstat.TcpExt.ArpFilter = value
  220. case "TW":
  221. procNetstat.TcpExt.TW = value
  222. case "TWRecycled":
  223. procNetstat.TcpExt.TWRecycled = value
  224. case "TWKilled":
  225. procNetstat.TcpExt.TWKilled = value
  226. case "PAWSActive":
  227. procNetstat.TcpExt.PAWSActive = value
  228. case "PAWSEstab":
  229. procNetstat.TcpExt.PAWSEstab = value
  230. case "DelayedACKs":
  231. procNetstat.TcpExt.DelayedACKs = value
  232. case "DelayedACKLocked":
  233. procNetstat.TcpExt.DelayedACKLocked = value
  234. case "DelayedACKLost":
  235. procNetstat.TcpExt.DelayedACKLost = value
  236. case "ListenOverflows":
  237. procNetstat.TcpExt.ListenOverflows = value
  238. case "ListenDrops":
  239. procNetstat.TcpExt.ListenDrops = value
  240. case "TCPHPHits":
  241. procNetstat.TcpExt.TCPHPHits = value
  242. case "TCPPureAcks":
  243. procNetstat.TcpExt.TCPPureAcks = value
  244. case "TCPHPAcks":
  245. procNetstat.TcpExt.TCPHPAcks = value
  246. case "TCPRenoRecovery":
  247. procNetstat.TcpExt.TCPRenoRecovery = value
  248. case "TCPSackRecovery":
  249. procNetstat.TcpExt.TCPSackRecovery = value
  250. case "TCPSACKReneging":
  251. procNetstat.TcpExt.TCPSACKReneging = value
  252. case "TCPSACKReorder":
  253. procNetstat.TcpExt.TCPSACKReorder = value
  254. case "TCPRenoReorder":
  255. procNetstat.TcpExt.TCPRenoReorder = value
  256. case "TCPTSReorder":
  257. procNetstat.TcpExt.TCPTSReorder = value
  258. case "TCPFullUndo":
  259. procNetstat.TcpExt.TCPFullUndo = value
  260. case "TCPPartialUndo":
  261. procNetstat.TcpExt.TCPPartialUndo = value
  262. case "TCPDSACKUndo":
  263. procNetstat.TcpExt.TCPDSACKUndo = value
  264. case "TCPLossUndo":
  265. procNetstat.TcpExt.TCPLossUndo = value
  266. case "TCPLostRetransmit":
  267. procNetstat.TcpExt.TCPLostRetransmit = value
  268. case "TCPRenoFailures":
  269. procNetstat.TcpExt.TCPRenoFailures = value
  270. case "TCPSackFailures":
  271. procNetstat.TcpExt.TCPSackFailures = value
  272. case "TCPLossFailures":
  273. procNetstat.TcpExt.TCPLossFailures = value
  274. case "TCPFastRetrans":
  275. procNetstat.TcpExt.TCPFastRetrans = value
  276. case "TCPSlowStartRetrans":
  277. procNetstat.TcpExt.TCPSlowStartRetrans = value
  278. case "TCPTimeouts":
  279. procNetstat.TcpExt.TCPTimeouts = value
  280. case "TCPLossProbes":
  281. procNetstat.TcpExt.TCPLossProbes = value
  282. case "TCPLossProbeRecovery":
  283. procNetstat.TcpExt.TCPLossProbeRecovery = value
  284. case "TCPRenoRecoveryFail":
  285. procNetstat.TcpExt.TCPRenoRecoveryFail = value
  286. case "TCPSackRecoveryFail":
  287. procNetstat.TcpExt.TCPSackRecoveryFail = value
  288. case "TCPRcvCollapsed":
  289. procNetstat.TcpExt.TCPRcvCollapsed = value
  290. case "TCPDSACKOldSent":
  291. procNetstat.TcpExt.TCPDSACKOldSent = value
  292. case "TCPDSACKOfoSent":
  293. procNetstat.TcpExt.TCPDSACKOfoSent = value
  294. case "TCPDSACKRecv":
  295. procNetstat.TcpExt.TCPDSACKRecv = value
  296. case "TCPDSACKOfoRecv":
  297. procNetstat.TcpExt.TCPDSACKOfoRecv = value
  298. case "TCPAbortOnData":
  299. procNetstat.TcpExt.TCPAbortOnData = value
  300. case "TCPAbortOnClose":
  301. procNetstat.TcpExt.TCPAbortOnClose = value
  302. case "TCPDeferAcceptDrop":
  303. procNetstat.TcpExt.TCPDeferAcceptDrop = value
  304. case "IPReversePathFilter":
  305. procNetstat.TcpExt.IPReversePathFilter = value
  306. case "TCPTimeWaitOverflow":
  307. procNetstat.TcpExt.TCPTimeWaitOverflow = value
  308. case "TCPReqQFullDoCookies":
  309. procNetstat.TcpExt.TCPReqQFullDoCookies = value
  310. case "TCPReqQFullDrop":
  311. procNetstat.TcpExt.TCPReqQFullDrop = value
  312. case "TCPRetransFail":
  313. procNetstat.TcpExt.TCPRetransFail = value
  314. case "TCPRcvCoalesce":
  315. procNetstat.TcpExt.TCPRcvCoalesce = value
  316. case "TCPOFOQueue":
  317. procNetstat.TcpExt.TCPOFOQueue = value
  318. case "TCPOFODrop":
  319. procNetstat.TcpExt.TCPOFODrop = value
  320. case "TCPOFOMerge":
  321. procNetstat.TcpExt.TCPOFOMerge = value
  322. case "TCPChallengeACK":
  323. procNetstat.TcpExt.TCPChallengeACK = value
  324. case "TCPSYNChallenge":
  325. procNetstat.TcpExt.TCPSYNChallenge = value
  326. case "TCPFastOpenActive":
  327. procNetstat.TcpExt.TCPFastOpenActive = value
  328. case "TCPFastOpenActiveFail":
  329. procNetstat.TcpExt.TCPFastOpenActiveFail = value
  330. case "TCPFastOpenPassive":
  331. procNetstat.TcpExt.TCPFastOpenPassive = value
  332. case "TCPFastOpenPassiveFail":
  333. procNetstat.TcpExt.TCPFastOpenPassiveFail = value
  334. case "TCPFastOpenListenOverflow":
  335. procNetstat.TcpExt.TCPFastOpenListenOverflow = value
  336. case "TCPFastOpenCookieReqd":
  337. procNetstat.TcpExt.TCPFastOpenCookieReqd = value
  338. case "TCPFastOpenBlackhole":
  339. procNetstat.TcpExt.TCPFastOpenBlackhole = value
  340. case "TCPSpuriousRtxHostQueues":
  341. procNetstat.TcpExt.TCPSpuriousRtxHostQueues = value
  342. case "BusyPollRxPackets":
  343. procNetstat.TcpExt.BusyPollRxPackets = value
  344. case "TCPAutoCorking":
  345. procNetstat.TcpExt.TCPAutoCorking = value
  346. case "TCPFromZeroWindowAdv":
  347. procNetstat.TcpExt.TCPFromZeroWindowAdv = value
  348. case "TCPToZeroWindowAdv":
  349. procNetstat.TcpExt.TCPToZeroWindowAdv = value
  350. case "TCPWantZeroWindowAdv":
  351. procNetstat.TcpExt.TCPWantZeroWindowAdv = value
  352. case "TCPSynRetrans":
  353. procNetstat.TcpExt.TCPSynRetrans = value
  354. case "TCPOrigDataSent":
  355. procNetstat.TcpExt.TCPOrigDataSent = value
  356. case "TCPHystartTrainDetect":
  357. procNetstat.TcpExt.TCPHystartTrainDetect = value
  358. case "TCPHystartTrainCwnd":
  359. procNetstat.TcpExt.TCPHystartTrainCwnd = value
  360. case "TCPHystartDelayDetect":
  361. procNetstat.TcpExt.TCPHystartDelayDetect = value
  362. case "TCPHystartDelayCwnd":
  363. procNetstat.TcpExt.TCPHystartDelayCwnd = value
  364. case "TCPACKSkippedSynRecv":
  365. procNetstat.TcpExt.TCPACKSkippedSynRecv = value
  366. case "TCPACKSkippedPAWS":
  367. procNetstat.TcpExt.TCPACKSkippedPAWS = value
  368. case "TCPACKSkippedSeq":
  369. procNetstat.TcpExt.TCPACKSkippedSeq = value
  370. case "TCPACKSkippedFinWait2":
  371. procNetstat.TcpExt.TCPACKSkippedFinWait2 = value
  372. case "TCPACKSkippedTimeWait":
  373. procNetstat.TcpExt.TCPACKSkippedTimeWait = value
  374. case "TCPACKSkippedChallenge":
  375. procNetstat.TcpExt.TCPACKSkippedChallenge = value
  376. case "TCPWinProbe":
  377. procNetstat.TcpExt.TCPWinProbe = value
  378. case "TCPKeepAlive":
  379. procNetstat.TcpExt.TCPKeepAlive = value
  380. case "TCPMTUPFail":
  381. procNetstat.TcpExt.TCPMTUPFail = value
  382. case "TCPMTUPSuccess":
  383. procNetstat.TcpExt.TCPMTUPSuccess = value
  384. case "TCPWqueueTooBig":
  385. procNetstat.TcpExt.TCPWqueueTooBig = value
  386. }
  387. case "IpExt":
  388. switch key {
  389. case "InNoRoutes":
  390. procNetstat.IpExt.InNoRoutes = value
  391. case "InTruncatedPkts":
  392. procNetstat.IpExt.InTruncatedPkts = value
  393. case "InMcastPkts":
  394. procNetstat.IpExt.InMcastPkts = value
  395. case "OutMcastPkts":
  396. procNetstat.IpExt.OutMcastPkts = value
  397. case "InBcastPkts":
  398. procNetstat.IpExt.InBcastPkts = value
  399. case "OutBcastPkts":
  400. procNetstat.IpExt.OutBcastPkts = value
  401. case "InOctets":
  402. procNetstat.IpExt.InOctets = value
  403. case "OutOctets":
  404. procNetstat.IpExt.OutOctets = value
  405. case "InMcastOctets":
  406. procNetstat.IpExt.InMcastOctets = value
  407. case "OutMcastOctets":
  408. procNetstat.IpExt.OutMcastOctets = value
  409. case "InBcastOctets":
  410. procNetstat.IpExt.InBcastOctets = value
  411. case "OutBcastOctets":
  412. procNetstat.IpExt.OutBcastOctets = value
  413. case "InCsumErrors":
  414. procNetstat.IpExt.InCsumErrors = value
  415. case "InNoECTPkts":
  416. procNetstat.IpExt.InNoECTPkts = value
  417. case "InECT1Pkts":
  418. procNetstat.IpExt.InECT1Pkts = value
  419. case "InECT0Pkts":
  420. procNetstat.IpExt.InECT0Pkts = value
  421. case "InCEPkts":
  422. procNetstat.IpExt.InCEPkts = value
  423. case "ReasmOverlaps":
  424. procNetstat.IpExt.ReasmOverlaps = value
  425. }
  426. }
  427. }
  428. }
  429. return procNetstat, scanner.Err()
  430. }