Skip to content

Commit 3d753b0

Browse files
committed
Introduce parsing for /proc/<pid>/net/snmp, /proc/<pid>/net/snmp6 and /proc/<pid>/net/netstat.
Signed-off-by: Nikos Kakavas <[email protected]>
1 parent 71acf3d commit 3d753b0

9 files changed

+856
-0
lines changed

fixtures.ttar

+119
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,125 @@ Inter-| Receive | Transmit
156156
eth0: 438 5 0 0 0 0 0 0 648 8 0 0 0 0 0 0
157157
Mode: 644
158158
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
159+
Path: fixtures/proc/26231/net/snmp
160+
Lines: 12
161+
Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates
162+
Ip: 2 64 594223 0 1 0 0 0 593186 547253 20 231 0 0 0 0 0 0 0
163+
Icmp: InMsgs InErrors InCsumErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps
164+
Icmp: 45 1 0 45 0 0 0 0 0 0 0 0 0 0 50 0 50 0 0 0 0 0 0 0 0 0 0
165+
IcmpMsg: InType3 OutType3
166+
IcmpMsg: 45 50
167+
Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts InCsumErrors
168+
Tcp: 1 200 120000 -1 1103 9 8 51 15 653161 594855 348 98 1038 0
169+
Udp: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors IgnoredMulti
170+
Udp: 10179 50 0 9846 0 0 0 58
171+
UdpLite: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors IgnoredMulti
172+
UdpLite: 0 0 0 0 0 0 0 0
173+
Mode: 644
174+
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
175+
Path: fixtures/proc/26231/net/netstat
176+
Lines: 4
177+
TcpExt: SyncookiesSent SyncookiesRecv SyncookiesFailed EmbryonicRsts PruneCalled RcvPruned OfoPruned OutOfWindowIcmps LockDroppedIcmps ArpFilter TW TWRecycled TWKilled PAWSActive PAWSEstab DelayedACKs DelayedACKLocked DelayedACKLost ListenOverflows ListenDrops TCPHPHits TCPPureAcks TCPHPAcks TCPRenoRecovery TCPSackRecovery TCPSACKReneging TCPSACKReorder TCPRenoReorder TCPTSReorder TCPFullUndo TCPPartialUndo TCPDSACKUndo TCPLossUndo TCPLostRetransmit TCPRenoFailures TCPSackFailures TCPLossFailures TCPFastRetrans TCPSlowStartRetrans TCPTimeouts TCPLossProbes TCPLossProbeRecovery TCPRenoRecoveryFail TCPSackRecoveryFail TCPRcvCollapsed TCPDSACKOldSent TCPDSACKOfoSent TCPDSACKRecv TCPDSACKOfoRecv TCPAbortOnData TCPAbortOnClose TCPAbortOnMemory TCPAbortOnTimeout TCPAbortOnLinger TCPAbortFailed TCPMemoryPressures TCPMemoryPressuresChrono TCPSACKDiscard TCPDSACKIgnoredOld TCPDSACKIgnoredNoUndo TCPSpuriousRTOs TCPMD5NotFound TCPMD5Unexpected TCPMD5Failure TCPSackShifted TCPSackMerged TCPSackShiftFallback TCPBacklogDrop PFMemallocDrop TCPMinTTLDrop TCPDeferAcceptDrop IPReversePathFilter TCPTimeWaitOverflow TCPReqQFullDoCookies TCPReqQFullDrop TCPRetransFail TCPRcvCoalesce TCPOFOQueue TCPOFODrop TCPOFOMerge TCPChallengeACK TCPSYNChallenge TCPFastOpenActive TCPFastOpenActiveFail TCPFastOpenPassive TCPFastOpenPassiveFail TCPFastOpenListenOverflow TCPFastOpenCookieReqd TCPFastOpenBlackhole TCPSpuriousRtxHostQueues BusyPollRxPackets TCPAutoCorking TCPFromZeroWindowAdv TCPToZeroWindowAdv TCPWantZeroWindowAdv TCPSynRetrans TCPOrigDataSent TCPHystartTrainDetect TCPHystartTrainCwnd TCPHystartDelayDetect TCPHystartDelayCwnd TCPACKSkippedSynRecv TCPACKSkippedPAWS TCPACKSkippedSeq TCPACKSkippedFinWait2 TCPACKSkippedTimeWait TCPACKSkippedChallenge TCPWinProbe TCPKeepAlive TCPMTUPFail TCPMTUPSuccess TCPWqueueTooBig
178+
TcpExt: 0 0 0 1 0 0 0 0 0 0 83 0 0 0 3640 287 1 7460 0 0 134193 1335 829 0 4 0 1 0 0 0 0 1 19 0 0 0 0 3 0 32 100 4 0 0 0 7460 2421 49 1 62 6 0 23 0 7 0 0 0 0 19 2 0 0 0 0 0 6 0 0 0 0 3 0 0 0 0 92425 65515 0 2421 4 4 0 0 0 0 0 0 0 0 0 10 0 0 0 16 2221 0 0 2 45 0 0 3 0 0 0 0 456 0 0 0
179+
IpExt: InNoRoutes InTruncatedPkts InMcastPkts OutMcastPkts InBcastPkts OutBcastPkts InOctets OutOctets InMcastOctets OutMcastOctets InBcastOctets OutBcastOctets InCsumErrors InNoECTPkts InECT1Pkts InECT0Pkts InCEPkts ReasmOverlaps
180+
IpExt: 0 0 208 214 118 111 190585481 7512674 26093 25903 14546 13628 0 134215 0 0 0 0
181+
Mode: 644
182+
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
183+
Path: fixtures/proc/26231/net/snmp6
184+
Lines: 92
185+
Ip6InReceives 92166
186+
Ip6InHdrErrors 0
187+
Ip6InTooBigErrors 0
188+
Ip6InNoRoutes 0
189+
Ip6InAddrErrors 0
190+
Ip6InUnknownProtos 0
191+
Ip6InTruncatedPkts 0
192+
Ip6InDiscards 0
193+
Ip6InDelivers 92053
194+
Ip6OutForwDatagrams 0
195+
Ip6OutRequests 57502
196+
Ip6OutDiscards 0
197+
Ip6OutNoRoutes 169
198+
Ip6ReasmTimeout 0
199+
Ip6ReasmReqds 0
200+
Ip6ReasmOKs 0
201+
Ip6ReasmFails 0
202+
Ip6FragOKs 0
203+
Ip6FragFails 0
204+
Ip6FragCreates 0
205+
Ip6InMcastPkts 381
206+
Ip6OutMcastPkts 148
207+
Ip6InOctets 113479132
208+
Ip6OutOctets 9842685
209+
Ip6InMcastOctets 65971
210+
Ip6OutMcastOctets 19394
211+
Ip6InBcastOctets 0
212+
Ip6OutBcastOctets 0
213+
Ip6InNoECTPkts 92166
214+
Ip6InECT1Pkts 0
215+
Ip6InECT0Pkts 0
216+
Ip6InCEPkts 0
217+
Icmp6InMsgs 142
218+
Icmp6InErrors 0
219+
Icmp6OutMsgs 58
220+
Icmp6OutErrors 0
221+
Icmp6InCsumErrors 0
222+
Icmp6InDestUnreachs 2
223+
Icmp6InPktTooBigs 0
224+
Icmp6InTimeExcds 0
225+
Icmp6InParmProblems 0
226+
Icmp6InEchos 0
227+
Icmp6InEchoReplies 0
228+
Icmp6InGroupMembQueries 0
229+
Icmp6InGroupMembResponses 0
230+
Icmp6InGroupMembReductions 0
231+
Icmp6InRouterSolicits 0
232+
Icmp6InRouterAdvertisements 111
233+
Icmp6InNeighborSolicits 26
234+
Icmp6InNeighborAdvertisements 1
235+
Icmp6InRedirects 0
236+
Icmp6InMLDv2Reports 2
237+
Icmp6OutDestUnreachs 0
238+
Icmp6OutPktTooBigs 0
239+
Icmp6OutTimeExcds 0
240+
Icmp6OutParmProblems 0
241+
Icmp6OutEchos 0
242+
Icmp6OutEchoReplies 0
243+
Icmp6OutGroupMembQueries 0
244+
Icmp6OutGroupMembResponses 0
245+
Icmp6OutGroupMembReductions 0
246+
Icmp6OutRouterSolicits 2
247+
Icmp6OutRouterAdvertisements 0
248+
Icmp6OutNeighborSolicits 5
249+
Icmp6OutNeighborAdvertisements 26
250+
Icmp6OutRedirects 0
251+
Icmp6OutMLDv2Reports 25
252+
Icmp6InType1 2
253+
Icmp6InType134 111
254+
Icmp6InType135 26
255+
Icmp6InType136 1
256+
Icmp6InType143 2
257+
Icmp6OutType133 2
258+
Icmp6OutType135 5
259+
Icmp6OutType136 26
260+
Icmp6OutType143 25
261+
Udp6InDatagrams 2016
262+
Udp6NoPorts 0
263+
Udp6InErrors 0
264+
Udp6OutDatagrams 1546
265+
Udp6RcvbufErrors 0
266+
Udp6SndbufErrors 0
267+
Udp6InCsumErrors 0
268+
Udp6IgnoredMulti 12
269+
UdpLite6InDatagrams 0
270+
UdpLite6NoPorts 0
271+
UdpLite6InErrors 0
272+
UdpLite6OutDatagrams 0
273+
UdpLite6RcvbufErrors 0
274+
UdpLite6SndbufErrors 0
275+
UdpLite6InCsumErrors 0
276+
Mode: 644
277+
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
159278
Directory: fixtures/proc/26231/ns
160279
Mode: 755
161280
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.13
44

55
require (
66
github.com/google/go-cmp v0.5.4
7+
github.com/mitchellh/mapstructure v1.4.3
78
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a
89
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c
910
)

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M=
22
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
3+
github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
4+
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
35
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs=
46
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
57
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk=

proc_netstat.go

+223
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
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+
14+
package procfs
15+
16+
import (
17+
"bufio"
18+
"bytes"
19+
"fmt"
20+
"io"
21+
"strconv"
22+
"strings"
23+
24+
"github.com/mitchellh/mapstructure"
25+
"github.com/prometheus/procfs/internal/util"
26+
)
27+
28+
// ProcNetstat models the content of /proc/<pid>/net/netstat.
29+
type ProcNetstat struct {
30+
// The process ID.
31+
PID int
32+
TcpExt
33+
IpExt
34+
}
35+
36+
type TcpExt struct {
37+
SyncookiesSent float64
38+
SyncookiesRecv float64
39+
SyncookiesFailed float64
40+
EmbryonicRsts float64
41+
PruneCalled float64
42+
RcvPruned float64
43+
OfoPruned float64
44+
OutOfWindowIcmps float64
45+
LockDroppedIcmps float64
46+
ArpFilter float64
47+
TW float64
48+
TWRecycled float64
49+
TWKilled float64
50+
PAWSActive float64
51+
PAWSEstab float64
52+
DelayedACKs float64
53+
DelayedACKLocked float64
54+
DelayedACKLost float64
55+
ListenOverflows float64
56+
ListenDrops float64
57+
TCPHPHits float64
58+
TCPPureAcks float64
59+
TCPHPAcks float64
60+
TCPRenoRecovery float64
61+
TCPSackRecovery float64
62+
TCPSACKReneging float64
63+
TCPSACKReorder float64
64+
TCPRenoReorder float64
65+
TCPTSReorder float64
66+
TCPFullUndo float64
67+
TCPPartialUndo float64
68+
TCPDSACKUndo float64
69+
TCPLossUndo float64
70+
TCPLostRetransmit float64
71+
TCPRenoFailures float64
72+
TCPSackFailures float64
73+
TCPLossFailures float64
74+
TCPFastRetrans float64
75+
TCPSlowStartRetrans float64
76+
TCPTimeouts float64
77+
TCPLossProbes float64
78+
TCPLossProbeRecovery float64
79+
TCPRenoRecoveryFail float64
80+
TCPSackRecoveryFail float64
81+
TCPRcvCollapsed float64
82+
TCPDSACKOldSent float64
83+
TCPDSACKOfoSent float64
84+
TCPDSACKRecv float64
85+
TCPDSACKOfoRecv float64
86+
TCPAbortOnData float64
87+
TCPAbortOnClose float64
88+
TCPAbortOnMemory float64
89+
TCPAbortOnTimeout float64
90+
TCPAbortOnLinger float64
91+
TCPAbortFailed float64
92+
TCPMemoryPressures float64
93+
TCPMemoryPressuresChrono float64
94+
TCPSACKDiscard float64
95+
TCPDSACKIgnoredOld float64
96+
TCPDSACKIgnoredNoUndo float64
97+
TCPSpuriousRTOs float64
98+
TCPMD5NotFound float64
99+
TCPMD5Unexpected float64
100+
TCPMD5Failure float64
101+
TCPSackShifted float64
102+
TCPSackMerged float64
103+
TCPSackShiftFallback float64
104+
TCPBacklogDrop float64
105+
PFMemallocDrop float64
106+
TCPMinTTLDrop float64
107+
TCPDeferAcceptDrop float64
108+
IPReversePathFilter float64
109+
TCPTimeWaitOverflow float64
110+
TCPReqQFullDoCookies float64
111+
TCPReqQFullDrop float64
112+
TCPRetransFail float64
113+
TCPRcvCoalesce 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+
procNetstat := ProcNetstat{PID: p.PID}
175+
176+
data, err := util.ReadFileNoStat(filename)
177+
if err != nil {
178+
return procNetstat, err
179+
}
180+
181+
netStats, err := parseNetstat(bytes.NewReader(data), filename)
182+
if err != nil {
183+
return procNetstat, err
184+
}
185+
186+
mapStructureErr := mapstructure.Decode(netStats, &procNetstat)
187+
if mapStructureErr != nil {
188+
return procNetstat, mapStructureErr
189+
}
190+
191+
return procNetstat, nil
192+
}
193+
194+
// parseNetstat parses the metrics from proc/<pid>/net/netstat file
195+
// and returns a map contains those metrics (e.g. {"TcpExt": {"SyncookiesSent": 0}}).
196+
func parseNetstat(r io.Reader, fileName string) (map[string]map[string]float64, error) {
197+
var (
198+
netStats = map[string]map[string]float64{}
199+
scanner = bufio.NewScanner(r)
200+
)
201+
202+
for scanner.Scan() {
203+
nameParts := strings.Split(scanner.Text(), " ")
204+
scanner.Scan()
205+
valueParts := strings.Split(scanner.Text(), " ")
206+
// Remove trailing :.
207+
protocol := nameParts[0][:len(nameParts[0])-1]
208+
netStats[protocol] = map[string]float64{}
209+
if len(nameParts) != len(valueParts) {
210+
return nil, fmt.Errorf("mismatch field count mismatch in %s: %s",
211+
fileName, protocol)
212+
}
213+
for i := 1; i < len(nameParts); i++ {
214+
var err error
215+
netStats[protocol][nameParts[i]], err = strconv.ParseFloat(valueParts[i], 64)
216+
if err != nil {
217+
return nil, err
218+
}
219+
}
220+
}
221+
222+
return netStats, scanner.Err()
223+
}

0 commit comments

Comments
 (0)