mox/vendor/github.com/prometheus/procfs/proc_netstat.go

444 lines
15 KiB
Go
Raw Normal View History

2023-01-30 16:27:06 +03:00
// 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"
)
// ProcNetstat models the content of /proc/<pid>/net/netstat.
type ProcNetstat struct {
// The process ID.
PID int
TcpExt
IpExt
}
type TcpExt struct { // nolint:revive
SyncookiesSent *float64
SyncookiesRecv *float64
SyncookiesFailed *float64
EmbryonicRsts *float64
PruneCalled *float64
RcvPruned *float64
OfoPruned *float64
OutOfWindowIcmps *float64
LockDroppedIcmps *float64
ArpFilter *float64
TW *float64
TWRecycled *float64
TWKilled *float64
PAWSActive *float64
PAWSEstab *float64
DelayedACKs *float64
DelayedACKLocked *float64
DelayedACKLost *float64
ListenOverflows *float64
ListenDrops *float64
TCPHPHits *float64
TCPPureAcks *float64
TCPHPAcks *float64
TCPRenoRecovery *float64
TCPSackRecovery *float64
TCPSACKReneging *float64
TCPSACKReorder *float64
TCPRenoReorder *float64
TCPTSReorder *float64
TCPFullUndo *float64
TCPPartialUndo *float64
TCPDSACKUndo *float64
TCPLossUndo *float64
TCPLostRetransmit *float64
TCPRenoFailures *float64
TCPSackFailures *float64
TCPLossFailures *float64
TCPFastRetrans *float64
TCPSlowStartRetrans *float64
TCPTimeouts *float64
TCPLossProbes *float64
TCPLossProbeRecovery *float64
TCPRenoRecoveryFail *float64
TCPSackRecoveryFail *float64
TCPRcvCollapsed *float64
TCPDSACKOldSent *float64
TCPDSACKOfoSent *float64
TCPDSACKRecv *float64
TCPDSACKOfoRecv *float64
TCPAbortOnData *float64
TCPAbortOnClose *float64
TCPAbortOnMemory *float64
TCPAbortOnTimeout *float64
TCPAbortOnLinger *float64
TCPAbortFailed *float64
TCPMemoryPressures *float64
TCPMemoryPressuresChrono *float64
TCPSACKDiscard *float64
TCPDSACKIgnoredOld *float64
TCPDSACKIgnoredNoUndo *float64
TCPSpuriousRTOs *float64
TCPMD5NotFound *float64
TCPMD5Unexpected *float64
TCPMD5Failure *float64
TCPSackShifted *float64
TCPSackMerged *float64
TCPSackShiftFallback *float64
TCPBacklogDrop *float64
PFMemallocDrop *float64
TCPMinTTLDrop *float64
TCPDeferAcceptDrop *float64
IPReversePathFilter *float64
TCPTimeWaitOverflow *float64
TCPReqQFullDoCookies *float64
TCPReqQFullDrop *float64
TCPRetransFail *float64
TCPRcvCoalesce *float64
TCPRcvQDrop *float64
TCPOFOQueue *float64
TCPOFODrop *float64
TCPOFOMerge *float64
TCPChallengeACK *float64
TCPSYNChallenge *float64
TCPFastOpenActive *float64
TCPFastOpenActiveFail *float64
TCPFastOpenPassive *float64
TCPFastOpenPassiveFail *float64
TCPFastOpenListenOverflow *float64
TCPFastOpenCookieReqd *float64
TCPFastOpenBlackhole *float64
TCPSpuriousRtxHostQueues *float64
BusyPollRxPackets *float64
TCPAutoCorking *float64
TCPFromZeroWindowAdv *float64
TCPToZeroWindowAdv *float64
TCPWantZeroWindowAdv *float64
TCPSynRetrans *float64
TCPOrigDataSent *float64
TCPHystartTrainDetect *float64
TCPHystartTrainCwnd *float64
TCPHystartDelayDetect *float64
TCPHystartDelayCwnd *float64
TCPACKSkippedSynRecv *float64
TCPACKSkippedPAWS *float64
TCPACKSkippedSeq *float64
TCPACKSkippedFinWait2 *float64
TCPACKSkippedTimeWait *float64
TCPACKSkippedChallenge *float64
TCPWinProbe *float64
TCPKeepAlive *float64
TCPMTUPFail *float64
TCPMTUPSuccess *float64
TCPWqueueTooBig *float64
2023-01-30 16:27:06 +03:00
}
type IpExt struct { // nolint:revive
InNoRoutes *float64
InTruncatedPkts *float64
InMcastPkts *float64
OutMcastPkts *float64
InBcastPkts *float64
OutBcastPkts *float64
InOctets *float64
OutOctets *float64
InMcastOctets *float64
OutMcastOctets *float64
InBcastOctets *float64
OutBcastOctets *float64
InCsumErrors *float64
InNoECTPkts *float64
InECT1Pkts *float64
InECT0Pkts *float64
InCEPkts *float64
ReasmOverlaps *float64
2023-01-30 16:27:06 +03:00
}
func (p Proc) Netstat() (ProcNetstat, error) {
filename := p.path("net/netstat")
data, err := util.ReadFileNoStat(filename)
if err != nil {
return ProcNetstat{PID: p.PID}, err
}
procNetstat, err := parseProcNetstat(bytes.NewReader(data), filename)
2023-01-30 16:27:06 +03:00
procNetstat.PID = p.PID
return procNetstat, err
}
// parseProcNetstat parses the metrics from proc/<pid>/net/netstat file
2023-01-30 16:27:06 +03:00
// and returns a ProcNetstat structure.
func parseProcNetstat(r io.Reader, fileName string) (ProcNetstat, error) {
2023-01-30 16:27:06 +03:00
var (
scanner = bufio.NewScanner(r)
procNetstat = ProcNetstat{}
)
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 procNetstat, fmt.Errorf("%w: mismatch field count mismatch in %s: %s",
ErrFileParse, fileName, protocol)
2023-01-30 16:27:06 +03:00
}
for i := 1; i < len(nameParts); i++ {
value, err := strconv.ParseFloat(valueParts[i], 64)
if err != nil {
return procNetstat, err
}
key := nameParts[i]
switch protocol {
case "TcpExt":
switch key {
case "SyncookiesSent":
procNetstat.TcpExt.SyncookiesSent = &value
2023-01-30 16:27:06 +03:00
case "SyncookiesRecv":
procNetstat.TcpExt.SyncookiesRecv = &value
2023-01-30 16:27:06 +03:00
case "SyncookiesFailed":
procNetstat.TcpExt.SyncookiesFailed = &value
2023-01-30 16:27:06 +03:00
case "EmbryonicRsts":
procNetstat.TcpExt.EmbryonicRsts = &value
2023-01-30 16:27:06 +03:00
case "PruneCalled":
procNetstat.TcpExt.PruneCalled = &value
2023-01-30 16:27:06 +03:00
case "RcvPruned":
procNetstat.TcpExt.RcvPruned = &value
2023-01-30 16:27:06 +03:00
case "OfoPruned":
procNetstat.TcpExt.OfoPruned = &value
2023-01-30 16:27:06 +03:00
case "OutOfWindowIcmps":
procNetstat.TcpExt.OutOfWindowIcmps = &value
2023-01-30 16:27:06 +03:00
case "LockDroppedIcmps":
procNetstat.TcpExt.LockDroppedIcmps = &value
2023-01-30 16:27:06 +03:00
case "ArpFilter":
procNetstat.TcpExt.ArpFilter = &value
2023-01-30 16:27:06 +03:00
case "TW":
procNetstat.TcpExt.TW = &value
2023-01-30 16:27:06 +03:00
case "TWRecycled":
procNetstat.TcpExt.TWRecycled = &value
2023-01-30 16:27:06 +03:00
case "TWKilled":
procNetstat.TcpExt.TWKilled = &value
2023-01-30 16:27:06 +03:00
case "PAWSActive":
procNetstat.TcpExt.PAWSActive = &value
2023-01-30 16:27:06 +03:00
case "PAWSEstab":
procNetstat.TcpExt.PAWSEstab = &value
2023-01-30 16:27:06 +03:00
case "DelayedACKs":
procNetstat.TcpExt.DelayedACKs = &value
2023-01-30 16:27:06 +03:00
case "DelayedACKLocked":
procNetstat.TcpExt.DelayedACKLocked = &value
2023-01-30 16:27:06 +03:00
case "DelayedACKLost":
procNetstat.TcpExt.DelayedACKLost = &value
2023-01-30 16:27:06 +03:00
case "ListenOverflows":
procNetstat.TcpExt.ListenOverflows = &value
2023-01-30 16:27:06 +03:00
case "ListenDrops":
procNetstat.TcpExt.ListenDrops = &value
2023-01-30 16:27:06 +03:00
case "TCPHPHits":
procNetstat.TcpExt.TCPHPHits = &value
2023-01-30 16:27:06 +03:00
case "TCPPureAcks":
procNetstat.TcpExt.TCPPureAcks = &value
2023-01-30 16:27:06 +03:00
case "TCPHPAcks":
procNetstat.TcpExt.TCPHPAcks = &value
2023-01-30 16:27:06 +03:00
case "TCPRenoRecovery":
procNetstat.TcpExt.TCPRenoRecovery = &value
2023-01-30 16:27:06 +03:00
case "TCPSackRecovery":
procNetstat.TcpExt.TCPSackRecovery = &value
2023-01-30 16:27:06 +03:00
case "TCPSACKReneging":
procNetstat.TcpExt.TCPSACKReneging = &value
2023-01-30 16:27:06 +03:00
case "TCPSACKReorder":
procNetstat.TcpExt.TCPSACKReorder = &value
2023-01-30 16:27:06 +03:00
case "TCPRenoReorder":
procNetstat.TcpExt.TCPRenoReorder = &value
2023-01-30 16:27:06 +03:00
case "TCPTSReorder":
procNetstat.TcpExt.TCPTSReorder = &value
2023-01-30 16:27:06 +03:00
case "TCPFullUndo":
procNetstat.TcpExt.TCPFullUndo = &value
2023-01-30 16:27:06 +03:00
case "TCPPartialUndo":
procNetstat.TcpExt.TCPPartialUndo = &value
2023-01-30 16:27:06 +03:00
case "TCPDSACKUndo":
procNetstat.TcpExt.TCPDSACKUndo = &value
2023-01-30 16:27:06 +03:00
case "TCPLossUndo":
procNetstat.TcpExt.TCPLossUndo = &value
2023-01-30 16:27:06 +03:00
case "TCPLostRetransmit":
procNetstat.TcpExt.TCPLostRetransmit = &value
2023-01-30 16:27:06 +03:00
case "TCPRenoFailures":
procNetstat.TcpExt.TCPRenoFailures = &value
2023-01-30 16:27:06 +03:00
case "TCPSackFailures":
procNetstat.TcpExt.TCPSackFailures = &value
2023-01-30 16:27:06 +03:00
case "TCPLossFailures":
procNetstat.TcpExt.TCPLossFailures = &value
2023-01-30 16:27:06 +03:00
case "TCPFastRetrans":
procNetstat.TcpExt.TCPFastRetrans = &value
2023-01-30 16:27:06 +03:00
case "TCPSlowStartRetrans":
procNetstat.TcpExt.TCPSlowStartRetrans = &value
2023-01-30 16:27:06 +03:00
case "TCPTimeouts":
procNetstat.TcpExt.TCPTimeouts = &value
2023-01-30 16:27:06 +03:00
case "TCPLossProbes":
procNetstat.TcpExt.TCPLossProbes = &value
2023-01-30 16:27:06 +03:00
case "TCPLossProbeRecovery":
procNetstat.TcpExt.TCPLossProbeRecovery = &value
2023-01-30 16:27:06 +03:00
case "TCPRenoRecoveryFail":
procNetstat.TcpExt.TCPRenoRecoveryFail = &value
2023-01-30 16:27:06 +03:00
case "TCPSackRecoveryFail":
procNetstat.TcpExt.TCPSackRecoveryFail = &value
2023-01-30 16:27:06 +03:00
case "TCPRcvCollapsed":
procNetstat.TcpExt.TCPRcvCollapsed = &value
2023-01-30 16:27:06 +03:00
case "TCPDSACKOldSent":
procNetstat.TcpExt.TCPDSACKOldSent = &value
2023-01-30 16:27:06 +03:00
case "TCPDSACKOfoSent":
procNetstat.TcpExt.TCPDSACKOfoSent = &value
2023-01-30 16:27:06 +03:00
case "TCPDSACKRecv":
procNetstat.TcpExt.TCPDSACKRecv = &value
2023-01-30 16:27:06 +03:00
case "TCPDSACKOfoRecv":
procNetstat.TcpExt.TCPDSACKOfoRecv = &value
2023-01-30 16:27:06 +03:00
case "TCPAbortOnData":
procNetstat.TcpExt.TCPAbortOnData = &value
2023-01-30 16:27:06 +03:00
case "TCPAbortOnClose":
procNetstat.TcpExt.TCPAbortOnClose = &value
2023-01-30 16:27:06 +03:00
case "TCPDeferAcceptDrop":
procNetstat.TcpExt.TCPDeferAcceptDrop = &value
2023-01-30 16:27:06 +03:00
case "IPReversePathFilter":
procNetstat.TcpExt.IPReversePathFilter = &value
2023-01-30 16:27:06 +03:00
case "TCPTimeWaitOverflow":
procNetstat.TcpExt.TCPTimeWaitOverflow = &value
2023-01-30 16:27:06 +03:00
case "TCPReqQFullDoCookies":
procNetstat.TcpExt.TCPReqQFullDoCookies = &value
2023-01-30 16:27:06 +03:00
case "TCPReqQFullDrop":
procNetstat.TcpExt.TCPReqQFullDrop = &value
2023-01-30 16:27:06 +03:00
case "TCPRetransFail":
procNetstat.TcpExt.TCPRetransFail = &value
2023-01-30 16:27:06 +03:00
case "TCPRcvCoalesce":
procNetstat.TcpExt.TCPRcvCoalesce = &value
case "TCPRcvQDrop":
procNetstat.TcpExt.TCPRcvQDrop = &value
2023-01-30 16:27:06 +03:00
case "TCPOFOQueue":
procNetstat.TcpExt.TCPOFOQueue = &value
2023-01-30 16:27:06 +03:00
case "TCPOFODrop":
procNetstat.TcpExt.TCPOFODrop = &value
2023-01-30 16:27:06 +03:00
case "TCPOFOMerge":
procNetstat.TcpExt.TCPOFOMerge = &value
2023-01-30 16:27:06 +03:00
case "TCPChallengeACK":
procNetstat.TcpExt.TCPChallengeACK = &value
2023-01-30 16:27:06 +03:00
case "TCPSYNChallenge":
procNetstat.TcpExt.TCPSYNChallenge = &value
2023-01-30 16:27:06 +03:00
case "TCPFastOpenActive":
procNetstat.TcpExt.TCPFastOpenActive = &value
2023-01-30 16:27:06 +03:00
case "TCPFastOpenActiveFail":
procNetstat.TcpExt.TCPFastOpenActiveFail = &value
2023-01-30 16:27:06 +03:00
case "TCPFastOpenPassive":
procNetstat.TcpExt.TCPFastOpenPassive = &value
2023-01-30 16:27:06 +03:00
case "TCPFastOpenPassiveFail":
procNetstat.TcpExt.TCPFastOpenPassiveFail = &value
2023-01-30 16:27:06 +03:00
case "TCPFastOpenListenOverflow":
procNetstat.TcpExt.TCPFastOpenListenOverflow = &value
2023-01-30 16:27:06 +03:00
case "TCPFastOpenCookieReqd":
procNetstat.TcpExt.TCPFastOpenCookieReqd = &value
2023-01-30 16:27:06 +03:00
case "TCPFastOpenBlackhole":
procNetstat.TcpExt.TCPFastOpenBlackhole = &value
2023-01-30 16:27:06 +03:00
case "TCPSpuriousRtxHostQueues":
procNetstat.TcpExt.TCPSpuriousRtxHostQueues = &value
2023-01-30 16:27:06 +03:00
case "BusyPollRxPackets":
procNetstat.TcpExt.BusyPollRxPackets = &value
2023-01-30 16:27:06 +03:00
case "TCPAutoCorking":
procNetstat.TcpExt.TCPAutoCorking = &value
2023-01-30 16:27:06 +03:00
case "TCPFromZeroWindowAdv":
procNetstat.TcpExt.TCPFromZeroWindowAdv = &value
2023-01-30 16:27:06 +03:00
case "TCPToZeroWindowAdv":
procNetstat.TcpExt.TCPToZeroWindowAdv = &value
2023-01-30 16:27:06 +03:00
case "TCPWantZeroWindowAdv":
procNetstat.TcpExt.TCPWantZeroWindowAdv = &value
2023-01-30 16:27:06 +03:00
case "TCPSynRetrans":
procNetstat.TcpExt.TCPSynRetrans = &value
2023-01-30 16:27:06 +03:00
case "TCPOrigDataSent":
procNetstat.TcpExt.TCPOrigDataSent = &value
2023-01-30 16:27:06 +03:00
case "TCPHystartTrainDetect":
procNetstat.TcpExt.TCPHystartTrainDetect = &value
2023-01-30 16:27:06 +03:00
case "TCPHystartTrainCwnd":
procNetstat.TcpExt.TCPHystartTrainCwnd = &value
2023-01-30 16:27:06 +03:00
case "TCPHystartDelayDetect":
procNetstat.TcpExt.TCPHystartDelayDetect = &value
2023-01-30 16:27:06 +03:00
case "TCPHystartDelayCwnd":
procNetstat.TcpExt.TCPHystartDelayCwnd = &value
2023-01-30 16:27:06 +03:00
case "TCPACKSkippedSynRecv":
procNetstat.TcpExt.TCPACKSkippedSynRecv = &value
2023-01-30 16:27:06 +03:00
case "TCPACKSkippedPAWS":
procNetstat.TcpExt.TCPACKSkippedPAWS = &value
2023-01-30 16:27:06 +03:00
case "TCPACKSkippedSeq":
procNetstat.TcpExt.TCPACKSkippedSeq = &value
2023-01-30 16:27:06 +03:00
case "TCPACKSkippedFinWait2":
procNetstat.TcpExt.TCPACKSkippedFinWait2 = &value
2023-01-30 16:27:06 +03:00
case "TCPACKSkippedTimeWait":
procNetstat.TcpExt.TCPACKSkippedTimeWait = &value
2023-01-30 16:27:06 +03:00
case "TCPACKSkippedChallenge":
procNetstat.TcpExt.TCPACKSkippedChallenge = &value
2023-01-30 16:27:06 +03:00
case "TCPWinProbe":
procNetstat.TcpExt.TCPWinProbe = &value
2023-01-30 16:27:06 +03:00
case "TCPKeepAlive":
procNetstat.TcpExt.TCPKeepAlive = &value
2023-01-30 16:27:06 +03:00
case "TCPMTUPFail":
procNetstat.TcpExt.TCPMTUPFail = &value
2023-01-30 16:27:06 +03:00
case "TCPMTUPSuccess":
procNetstat.TcpExt.TCPMTUPSuccess = &value
2023-01-30 16:27:06 +03:00
case "TCPWqueueTooBig":
procNetstat.TcpExt.TCPWqueueTooBig = &value
2023-01-30 16:27:06 +03:00
}
case "IpExt":
switch key {
case "InNoRoutes":
procNetstat.IpExt.InNoRoutes = &value
2023-01-30 16:27:06 +03:00
case "InTruncatedPkts":
procNetstat.IpExt.InTruncatedPkts = &value
2023-01-30 16:27:06 +03:00
case "InMcastPkts":
procNetstat.IpExt.InMcastPkts = &value
2023-01-30 16:27:06 +03:00
case "OutMcastPkts":
procNetstat.IpExt.OutMcastPkts = &value
2023-01-30 16:27:06 +03:00
case "InBcastPkts":
procNetstat.IpExt.InBcastPkts = &value
2023-01-30 16:27:06 +03:00
case "OutBcastPkts":
procNetstat.IpExt.OutBcastPkts = &value
2023-01-30 16:27:06 +03:00
case "InOctets":
procNetstat.IpExt.InOctets = &value
2023-01-30 16:27:06 +03:00
case "OutOctets":
procNetstat.IpExt.OutOctets = &value
2023-01-30 16:27:06 +03:00
case "InMcastOctets":
procNetstat.IpExt.InMcastOctets = &value
2023-01-30 16:27:06 +03:00
case "OutMcastOctets":
procNetstat.IpExt.OutMcastOctets = &value
2023-01-30 16:27:06 +03:00
case "InBcastOctets":
procNetstat.IpExt.InBcastOctets = &value
2023-01-30 16:27:06 +03:00
case "OutBcastOctets":
procNetstat.IpExt.OutBcastOctets = &value
2023-01-30 16:27:06 +03:00
case "InCsumErrors":
procNetstat.IpExt.InCsumErrors = &value
2023-01-30 16:27:06 +03:00
case "InNoECTPkts":
procNetstat.IpExt.InNoECTPkts = &value
2023-01-30 16:27:06 +03:00
case "InECT1Pkts":
procNetstat.IpExt.InECT1Pkts = &value
2023-01-30 16:27:06 +03:00
case "InECT0Pkts":
procNetstat.IpExt.InECT0Pkts = &value
2023-01-30 16:27:06 +03:00
case "InCEPkts":
procNetstat.IpExt.InCEPkts = &value
2023-01-30 16:27:06 +03:00
case "ReasmOverlaps":
procNetstat.IpExt.ReasmOverlaps = &value
2023-01-30 16:27:06 +03:00
}
}
}
}
return procNetstat, scanner.Err()
}