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