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