mirror of
https://github.com/mjl-/mox.git
synced 2024-12-29 18:03:48 +03:00
353 lines
9 KiB
Go
353 lines
9 KiB
Go
// Copyright 2022 The Prometheus Authors
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package procfs
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/prometheus/procfs/internal/util"
|
|
)
|
|
|
|
// ProcSnmp models the content of /proc/<pid>/net/snmp.
|
|
type ProcSnmp struct {
|
|
// The process ID.
|
|
PID int
|
|
Ip
|
|
Icmp
|
|
IcmpMsg
|
|
Tcp
|
|
Udp
|
|
UdpLite
|
|
}
|
|
|
|
type Ip struct { // nolint:revive
|
|
Forwarding float64
|
|
DefaultTTL float64
|
|
InReceives float64
|
|
InHdrErrors float64
|
|
InAddrErrors float64
|
|
ForwDatagrams float64
|
|
InUnknownProtos float64
|
|
InDiscards float64
|
|
InDelivers float64
|
|
OutRequests float64
|
|
OutDiscards float64
|
|
OutNoRoutes float64
|
|
ReasmTimeout float64
|
|
ReasmReqds float64
|
|
ReasmOKs float64
|
|
ReasmFails float64
|
|
FragOKs float64
|
|
FragFails float64
|
|
FragCreates float64
|
|
}
|
|
|
|
type Icmp struct {
|
|
InMsgs float64
|
|
InErrors float64
|
|
InCsumErrors float64
|
|
InDestUnreachs float64
|
|
InTimeExcds float64
|
|
InParmProbs float64
|
|
InSrcQuenchs float64
|
|
InRedirects float64
|
|
InEchos float64
|
|
InEchoReps float64
|
|
InTimestamps float64
|
|
InTimestampReps float64
|
|
InAddrMasks float64
|
|
InAddrMaskReps float64
|
|
OutMsgs float64
|
|
OutErrors float64
|
|
OutDestUnreachs float64
|
|
OutTimeExcds float64
|
|
OutParmProbs float64
|
|
OutSrcQuenchs float64
|
|
OutRedirects float64
|
|
OutEchos float64
|
|
OutEchoReps float64
|
|
OutTimestamps float64
|
|
OutTimestampReps float64
|
|
OutAddrMasks float64
|
|
OutAddrMaskReps float64
|
|
}
|
|
|
|
type IcmpMsg struct {
|
|
InType3 float64
|
|
OutType3 float64
|
|
}
|
|
|
|
type Tcp struct { // nolint:revive
|
|
RtoAlgorithm float64
|
|
RtoMin float64
|
|
RtoMax float64
|
|
MaxConn float64
|
|
ActiveOpens float64
|
|
PassiveOpens float64
|
|
AttemptFails float64
|
|
EstabResets float64
|
|
CurrEstab float64
|
|
InSegs float64
|
|
OutSegs float64
|
|
RetransSegs float64
|
|
InErrs float64
|
|
OutRsts float64
|
|
InCsumErrors float64
|
|
}
|
|
|
|
type Udp struct { // nolint:revive
|
|
InDatagrams float64
|
|
NoPorts float64
|
|
InErrors float64
|
|
OutDatagrams float64
|
|
RcvbufErrors float64
|
|
SndbufErrors float64
|
|
InCsumErrors float64
|
|
IgnoredMulti float64
|
|
}
|
|
|
|
type UdpLite struct { // nolint:revive
|
|
InDatagrams float64
|
|
NoPorts float64
|
|
InErrors float64
|
|
OutDatagrams float64
|
|
RcvbufErrors float64
|
|
SndbufErrors float64
|
|
InCsumErrors float64
|
|
IgnoredMulti float64
|
|
}
|
|
|
|
func (p Proc) Snmp() (ProcSnmp, error) {
|
|
filename := p.path("net/snmp")
|
|
data, err := util.ReadFileNoStat(filename)
|
|
if err != nil {
|
|
return ProcSnmp{PID: p.PID}, err
|
|
}
|
|
procSnmp, err := parseSnmp(bytes.NewReader(data), filename)
|
|
procSnmp.PID = p.PID
|
|
return procSnmp, err
|
|
}
|
|
|
|
// parseSnmp parses the metrics from proc/<pid>/net/snmp file
|
|
// and returns a map contains those metrics (e.g. {"Ip": {"Forwarding": 2}}).
|
|
func parseSnmp(r io.Reader, fileName string) (ProcSnmp, error) {
|
|
var (
|
|
scanner = bufio.NewScanner(r)
|
|
procSnmp = ProcSnmp{}
|
|
)
|
|
|
|
for scanner.Scan() {
|
|
nameParts := strings.Split(scanner.Text(), " ")
|
|
scanner.Scan()
|
|
valueParts := strings.Split(scanner.Text(), " ")
|
|
// Remove trailing :.
|
|
protocol := strings.TrimSuffix(nameParts[0], ":")
|
|
if len(nameParts) != len(valueParts) {
|
|
return procSnmp, fmt.Errorf("mismatch field count mismatch in %s: %s",
|
|
fileName, protocol)
|
|
}
|
|
for i := 1; i < len(nameParts); i++ {
|
|
value, err := strconv.ParseFloat(valueParts[i], 64)
|
|
if err != nil {
|
|
return procSnmp, err
|
|
}
|
|
key := nameParts[i]
|
|
|
|
switch protocol {
|
|
case "Ip":
|
|
switch key {
|
|
case "Forwarding":
|
|
procSnmp.Ip.Forwarding = value
|
|
case "DefaultTTL":
|
|
procSnmp.Ip.DefaultTTL = value
|
|
case "InReceives":
|
|
procSnmp.Ip.InReceives = value
|
|
case "InHdrErrors":
|
|
procSnmp.Ip.InHdrErrors = value
|
|
case "InAddrErrors":
|
|
procSnmp.Ip.InAddrErrors = value
|
|
case "ForwDatagrams":
|
|
procSnmp.Ip.ForwDatagrams = value
|
|
case "InUnknownProtos":
|
|
procSnmp.Ip.InUnknownProtos = value
|
|
case "InDiscards":
|
|
procSnmp.Ip.InDiscards = value
|
|
case "InDelivers":
|
|
procSnmp.Ip.InDelivers = value
|
|
case "OutRequests":
|
|
procSnmp.Ip.OutRequests = value
|
|
case "OutDiscards":
|
|
procSnmp.Ip.OutDiscards = value
|
|
case "OutNoRoutes":
|
|
procSnmp.Ip.OutNoRoutes = value
|
|
case "ReasmTimeout":
|
|
procSnmp.Ip.ReasmTimeout = value
|
|
case "ReasmReqds":
|
|
procSnmp.Ip.ReasmReqds = value
|
|
case "ReasmOKs":
|
|
procSnmp.Ip.ReasmOKs = value
|
|
case "ReasmFails":
|
|
procSnmp.Ip.ReasmFails = value
|
|
case "FragOKs":
|
|
procSnmp.Ip.FragOKs = value
|
|
case "FragFails":
|
|
procSnmp.Ip.FragFails = value
|
|
case "FragCreates":
|
|
procSnmp.Ip.FragCreates = value
|
|
}
|
|
case "Icmp":
|
|
switch key {
|
|
case "InMsgs":
|
|
procSnmp.Icmp.InMsgs = value
|
|
case "InErrors":
|
|
procSnmp.Icmp.InErrors = value
|
|
case "InCsumErrors":
|
|
procSnmp.Icmp.InCsumErrors = value
|
|
case "InDestUnreachs":
|
|
procSnmp.Icmp.InDestUnreachs = value
|
|
case "InTimeExcds":
|
|
procSnmp.Icmp.InTimeExcds = value
|
|
case "InParmProbs":
|
|
procSnmp.Icmp.InParmProbs = value
|
|
case "InSrcQuenchs":
|
|
procSnmp.Icmp.InSrcQuenchs = value
|
|
case "InRedirects":
|
|
procSnmp.Icmp.InRedirects = value
|
|
case "InEchos":
|
|
procSnmp.Icmp.InEchos = value
|
|
case "InEchoReps":
|
|
procSnmp.Icmp.InEchoReps = value
|
|
case "InTimestamps":
|
|
procSnmp.Icmp.InTimestamps = value
|
|
case "InTimestampReps":
|
|
procSnmp.Icmp.InTimestampReps = value
|
|
case "InAddrMasks":
|
|
procSnmp.Icmp.InAddrMasks = value
|
|
case "InAddrMaskReps":
|
|
procSnmp.Icmp.InAddrMaskReps = value
|
|
case "OutMsgs":
|
|
procSnmp.Icmp.OutMsgs = value
|
|
case "OutErrors":
|
|
procSnmp.Icmp.OutErrors = value
|
|
case "OutDestUnreachs":
|
|
procSnmp.Icmp.OutDestUnreachs = value
|
|
case "OutTimeExcds":
|
|
procSnmp.Icmp.OutTimeExcds = value
|
|
case "OutParmProbs":
|
|
procSnmp.Icmp.OutParmProbs = value
|
|
case "OutSrcQuenchs":
|
|
procSnmp.Icmp.OutSrcQuenchs = value
|
|
case "OutRedirects":
|
|
procSnmp.Icmp.OutRedirects = value
|
|
case "OutEchos":
|
|
procSnmp.Icmp.OutEchos = value
|
|
case "OutEchoReps":
|
|
procSnmp.Icmp.OutEchoReps = value
|
|
case "OutTimestamps":
|
|
procSnmp.Icmp.OutTimestamps = value
|
|
case "OutTimestampReps":
|
|
procSnmp.Icmp.OutTimestampReps = value
|
|
case "OutAddrMasks":
|
|
procSnmp.Icmp.OutAddrMasks = value
|
|
case "OutAddrMaskReps":
|
|
procSnmp.Icmp.OutAddrMaskReps = value
|
|
}
|
|
case "IcmpMsg":
|
|
switch key {
|
|
case "InType3":
|
|
procSnmp.IcmpMsg.InType3 = value
|
|
case "OutType3":
|
|
procSnmp.IcmpMsg.OutType3 = value
|
|
}
|
|
case "Tcp":
|
|
switch key {
|
|
case "RtoAlgorithm":
|
|
procSnmp.Tcp.RtoAlgorithm = value
|
|
case "RtoMin":
|
|
procSnmp.Tcp.RtoMin = value
|
|
case "RtoMax":
|
|
procSnmp.Tcp.RtoMax = value
|
|
case "MaxConn":
|
|
procSnmp.Tcp.MaxConn = value
|
|
case "ActiveOpens":
|
|
procSnmp.Tcp.ActiveOpens = value
|
|
case "PassiveOpens":
|
|
procSnmp.Tcp.PassiveOpens = value
|
|
case "AttemptFails":
|
|
procSnmp.Tcp.AttemptFails = value
|
|
case "EstabResets":
|
|
procSnmp.Tcp.EstabResets = value
|
|
case "CurrEstab":
|
|
procSnmp.Tcp.CurrEstab = value
|
|
case "InSegs":
|
|
procSnmp.Tcp.InSegs = value
|
|
case "OutSegs":
|
|
procSnmp.Tcp.OutSegs = value
|
|
case "RetransSegs":
|
|
procSnmp.Tcp.RetransSegs = value
|
|
case "InErrs":
|
|
procSnmp.Tcp.InErrs = value
|
|
case "OutRsts":
|
|
procSnmp.Tcp.OutRsts = value
|
|
case "InCsumErrors":
|
|
procSnmp.Tcp.InCsumErrors = value
|
|
}
|
|
case "Udp":
|
|
switch key {
|
|
case "InDatagrams":
|
|
procSnmp.Udp.InDatagrams = value
|
|
case "NoPorts":
|
|
procSnmp.Udp.NoPorts = value
|
|
case "InErrors":
|
|
procSnmp.Udp.InErrors = value
|
|
case "OutDatagrams":
|
|
procSnmp.Udp.OutDatagrams = value
|
|
case "RcvbufErrors":
|
|
procSnmp.Udp.RcvbufErrors = value
|
|
case "SndbufErrors":
|
|
procSnmp.Udp.SndbufErrors = value
|
|
case "InCsumErrors":
|
|
procSnmp.Udp.InCsumErrors = value
|
|
case "IgnoredMulti":
|
|
procSnmp.Udp.IgnoredMulti = value
|
|
}
|
|
case "UdpLite":
|
|
switch key {
|
|
case "InDatagrams":
|
|
procSnmp.UdpLite.InDatagrams = value
|
|
case "NoPorts":
|
|
procSnmp.UdpLite.NoPorts = value
|
|
case "InErrors":
|
|
procSnmp.UdpLite.InErrors = value
|
|
case "OutDatagrams":
|
|
procSnmp.UdpLite.OutDatagrams = value
|
|
case "RcvbufErrors":
|
|
procSnmp.UdpLite.RcvbufErrors = value
|
|
case "SndbufErrors":
|
|
procSnmp.UdpLite.SndbufErrors = value
|
|
case "InCsumErrors":
|
|
procSnmp.UdpLite.InCsumErrors = value
|
|
case "IgnoredMulti":
|
|
procSnmp.UdpLite.IgnoredMulti = value
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return procSnmp, scanner.Err()
|
|
}
|