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