cubefs

Форк
0
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

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
// ProcSnmp models the content of /proc/<pid>/net/snmp.
28
type ProcSnmp struct {
29
	// The process ID.
30
	PID int
31
	Ip
32
	Icmp
33
	IcmpMsg
34
	Tcp
35
	Udp
36
	UdpLite
37
}
38

39
type Ip struct { // nolint:revive
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 { // nolint:revive
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 { // nolint:revive
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 { // nolint:revive
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
// parseSnmp parses the metrics from proc/<pid>/net/snmp file
148
// and returns a map contains those metrics (e.g. {"Ip": {"Forwarding": 2}}).
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
		// Remove trailing :.
160
		protocol := strings.TrimSuffix(nameParts[0], ":")
161
		if len(nameParts) != len(valueParts) {
162
			return procSnmp, fmt.Errorf("mismatch field count mismatch in %s: %s",
163
				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

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.