...
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 ProcSnmp struct {
29
30 PID int
31 Ip
32 Icmp
33 IcmpMsg
34 Tcp
35 Udp
36 UdpLite
37 }
38
39 type Ip struct {
40 Forwarding *float64
41 DefaultTTL *float64
42 InReceives *float64
43 InHdrErrors *float64
44 InAddrErrors *float64
45 ForwDatagrams *float64
46 InUnknownProtos *float64
47 InDiscards *float64
48 InDelivers *float64
49 OutRequests *float64
50 OutDiscards *float64
51 OutNoRoutes *float64
52 ReasmTimeout *float64
53 ReasmReqds *float64
54 ReasmOKs *float64
55 ReasmFails *float64
56 FragOKs *float64
57 FragFails *float64
58 FragCreates *float64
59 }
60
61 type Icmp struct {
62 InMsgs *float64
63 InErrors *float64
64 InCsumErrors *float64
65 InDestUnreachs *float64
66 InTimeExcds *float64
67 InParmProbs *float64
68 InSrcQuenchs *float64
69 InRedirects *float64
70 InEchos *float64
71 InEchoReps *float64
72 InTimestamps *float64
73 InTimestampReps *float64
74 InAddrMasks *float64
75 InAddrMaskReps *float64
76 OutMsgs *float64
77 OutErrors *float64
78 OutDestUnreachs *float64
79 OutTimeExcds *float64
80 OutParmProbs *float64
81 OutSrcQuenchs *float64
82 OutRedirects *float64
83 OutEchos *float64
84 OutEchoReps *float64
85 OutTimestamps *float64
86 OutTimestampReps *float64
87 OutAddrMasks *float64
88 OutAddrMaskReps *float64
89 }
90
91 type IcmpMsg struct {
92 InType3 *float64
93 OutType3 *float64
94 }
95
96 type Tcp struct {
97 RtoAlgorithm *float64
98 RtoMin *float64
99 RtoMax *float64
100 MaxConn *float64
101 ActiveOpens *float64
102 PassiveOpens *float64
103 AttemptFails *float64
104 EstabResets *float64
105 CurrEstab *float64
106 InSegs *float64
107 OutSegs *float64
108 RetransSegs *float64
109 InErrs *float64
110 OutRsts *float64
111 InCsumErrors *float64
112 }
113
114 type Udp struct {
115 InDatagrams *float64
116 NoPorts *float64
117 InErrors *float64
118 OutDatagrams *float64
119 RcvbufErrors *float64
120 SndbufErrors *float64
121 InCsumErrors *float64
122 IgnoredMulti *float64
123 }
124
125 type UdpLite struct {
126 InDatagrams *float64
127 NoPorts *float64
128 InErrors *float64
129 OutDatagrams *float64
130 RcvbufErrors *float64
131 SndbufErrors *float64
132 InCsumErrors *float64
133 IgnoredMulti *float64
134 }
135
136 func (p Proc) Snmp() (ProcSnmp, error) {
137 filename := p.path("net/snmp")
138 data, err := util.ReadFileNoStat(filename)
139 if err != nil {
140 return ProcSnmp{PID: p.PID}, err
141 }
142 procSnmp, err := parseSnmp(bytes.NewReader(data), filename)
143 procSnmp.PID = p.PID
144 return procSnmp, err
145 }
146
147
148
149 func parseSnmp(r io.Reader, fileName string) (ProcSnmp, error) {
150 var (
151 scanner = bufio.NewScanner(r)
152 procSnmp = ProcSnmp{}
153 )
154
155 for scanner.Scan() {
156 nameParts := strings.Split(scanner.Text(), " ")
157 scanner.Scan()
158 valueParts := strings.Split(scanner.Text(), " ")
159
160 protocol := strings.TrimSuffix(nameParts[0], ":")
161 if len(nameParts) != len(valueParts) {
162 return procSnmp, fmt.Errorf("%w: mismatch field count mismatch in %s: %s",
163 ErrFileParse, fileName, protocol)
164 }
165 for i := 1; i < len(nameParts); i++ {
166 value, err := strconv.ParseFloat(valueParts[i], 64)
167 if err != nil {
168 return procSnmp, err
169 }
170 key := nameParts[i]
171
172 switch protocol {
173 case "Ip":
174 switch key {
175 case "Forwarding":
176 procSnmp.Ip.Forwarding = &value
177 case "DefaultTTL":
178 procSnmp.Ip.DefaultTTL = &value
179 case "InReceives":
180 procSnmp.Ip.InReceives = &value
181 case "InHdrErrors":
182 procSnmp.Ip.InHdrErrors = &value
183 case "InAddrErrors":
184 procSnmp.Ip.InAddrErrors = &value
185 case "ForwDatagrams":
186 procSnmp.Ip.ForwDatagrams = &value
187 case "InUnknownProtos":
188 procSnmp.Ip.InUnknownProtos = &value
189 case "InDiscards":
190 procSnmp.Ip.InDiscards = &value
191 case "InDelivers":
192 procSnmp.Ip.InDelivers = &value
193 case "OutRequests":
194 procSnmp.Ip.OutRequests = &value
195 case "OutDiscards":
196 procSnmp.Ip.OutDiscards = &value
197 case "OutNoRoutes":
198 procSnmp.Ip.OutNoRoutes = &value
199 case "ReasmTimeout":
200 procSnmp.Ip.ReasmTimeout = &value
201 case "ReasmReqds":
202 procSnmp.Ip.ReasmReqds = &value
203 case "ReasmOKs":
204 procSnmp.Ip.ReasmOKs = &value
205 case "ReasmFails":
206 procSnmp.Ip.ReasmFails = &value
207 case "FragOKs":
208 procSnmp.Ip.FragOKs = &value
209 case "FragFails":
210 procSnmp.Ip.FragFails = &value
211 case "FragCreates":
212 procSnmp.Ip.FragCreates = &value
213 }
214 case "Icmp":
215 switch key {
216 case "InMsgs":
217 procSnmp.Icmp.InMsgs = &value
218 case "InErrors":
219 procSnmp.Icmp.InErrors = &value
220 case "InCsumErrors":
221 procSnmp.Icmp.InCsumErrors = &value
222 case "InDestUnreachs":
223 procSnmp.Icmp.InDestUnreachs = &value
224 case "InTimeExcds":
225 procSnmp.Icmp.InTimeExcds = &value
226 case "InParmProbs":
227 procSnmp.Icmp.InParmProbs = &value
228 case "InSrcQuenchs":
229 procSnmp.Icmp.InSrcQuenchs = &value
230 case "InRedirects":
231 procSnmp.Icmp.InRedirects = &value
232 case "InEchos":
233 procSnmp.Icmp.InEchos = &value
234 case "InEchoReps":
235 procSnmp.Icmp.InEchoReps = &value
236 case "InTimestamps":
237 procSnmp.Icmp.InTimestamps = &value
238 case "InTimestampReps":
239 procSnmp.Icmp.InTimestampReps = &value
240 case "InAddrMasks":
241 procSnmp.Icmp.InAddrMasks = &value
242 case "InAddrMaskReps":
243 procSnmp.Icmp.InAddrMaskReps = &value
244 case "OutMsgs":
245 procSnmp.Icmp.OutMsgs = &value
246 case "OutErrors":
247 procSnmp.Icmp.OutErrors = &value
248 case "OutDestUnreachs":
249 procSnmp.Icmp.OutDestUnreachs = &value
250 case "OutTimeExcds":
251 procSnmp.Icmp.OutTimeExcds = &value
252 case "OutParmProbs":
253 procSnmp.Icmp.OutParmProbs = &value
254 case "OutSrcQuenchs":
255 procSnmp.Icmp.OutSrcQuenchs = &value
256 case "OutRedirects":
257 procSnmp.Icmp.OutRedirects = &value
258 case "OutEchos":
259 procSnmp.Icmp.OutEchos = &value
260 case "OutEchoReps":
261 procSnmp.Icmp.OutEchoReps = &value
262 case "OutTimestamps":
263 procSnmp.Icmp.OutTimestamps = &value
264 case "OutTimestampReps":
265 procSnmp.Icmp.OutTimestampReps = &value
266 case "OutAddrMasks":
267 procSnmp.Icmp.OutAddrMasks = &value
268 case "OutAddrMaskReps":
269 procSnmp.Icmp.OutAddrMaskReps = &value
270 }
271 case "IcmpMsg":
272 switch key {
273 case "InType3":
274 procSnmp.IcmpMsg.InType3 = &value
275 case "OutType3":
276 procSnmp.IcmpMsg.OutType3 = &value
277 }
278 case "Tcp":
279 switch key {
280 case "RtoAlgorithm":
281 procSnmp.Tcp.RtoAlgorithm = &value
282 case "RtoMin":
283 procSnmp.Tcp.RtoMin = &value
284 case "RtoMax":
285 procSnmp.Tcp.RtoMax = &value
286 case "MaxConn":
287 procSnmp.Tcp.MaxConn = &value
288 case "ActiveOpens":
289 procSnmp.Tcp.ActiveOpens = &value
290 case "PassiveOpens":
291 procSnmp.Tcp.PassiveOpens = &value
292 case "AttemptFails":
293 procSnmp.Tcp.AttemptFails = &value
294 case "EstabResets":
295 procSnmp.Tcp.EstabResets = &value
296 case "CurrEstab":
297 procSnmp.Tcp.CurrEstab = &value
298 case "InSegs":
299 procSnmp.Tcp.InSegs = &value
300 case "OutSegs":
301 procSnmp.Tcp.OutSegs = &value
302 case "RetransSegs":
303 procSnmp.Tcp.RetransSegs = &value
304 case "InErrs":
305 procSnmp.Tcp.InErrs = &value
306 case "OutRsts":
307 procSnmp.Tcp.OutRsts = &value
308 case "InCsumErrors":
309 procSnmp.Tcp.InCsumErrors = &value
310 }
311 case "Udp":
312 switch key {
313 case "InDatagrams":
314 procSnmp.Udp.InDatagrams = &value
315 case "NoPorts":
316 procSnmp.Udp.NoPorts = &value
317 case "InErrors":
318 procSnmp.Udp.InErrors = &value
319 case "OutDatagrams":
320 procSnmp.Udp.OutDatagrams = &value
321 case "RcvbufErrors":
322 procSnmp.Udp.RcvbufErrors = &value
323 case "SndbufErrors":
324 procSnmp.Udp.SndbufErrors = &value
325 case "InCsumErrors":
326 procSnmp.Udp.InCsumErrors = &value
327 case "IgnoredMulti":
328 procSnmp.Udp.IgnoredMulti = &value
329 }
330 case "UdpLite":
331 switch key {
332 case "InDatagrams":
333 procSnmp.UdpLite.InDatagrams = &value
334 case "NoPorts":
335 procSnmp.UdpLite.NoPorts = &value
336 case "InErrors":
337 procSnmp.UdpLite.InErrors = &value
338 case "OutDatagrams":
339 procSnmp.UdpLite.OutDatagrams = &value
340 case "RcvbufErrors":
341 procSnmp.UdpLite.RcvbufErrors = &value
342 case "SndbufErrors":
343 procSnmp.UdpLite.SndbufErrors = &value
344 case "InCsumErrors":
345 procSnmp.UdpLite.InCsumErrors = &value
346 case "IgnoredMulti":
347 procSnmp.UdpLite.IgnoredMulti = &value
348 }
349 }
350 }
351 }
352 return procSnmp, scanner.Err()
353 }
354
View as plain text