mirror of https://github.com/docker/cli.git
441 lines
14 KiB
Go
441 lines
14 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"
|
|
)
|
|
|
|
// 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
|
|
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
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
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 := parseNetstat(bytes.NewReader(data), filename)
|
|
procNetstat.PID = p.PID
|
|
return procNetstat, err
|
|
}
|
|
|
|
// parseNetstat parses the metrics from proc/<pid>/net/netstat file
|
|
// and returns a ProcNetstat structure.
|
|
func parseNetstat(r io.Reader, fileName string) (ProcNetstat, error) {
|
|
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("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 procNetstat, err
|
|
}
|
|
key := nameParts[i]
|
|
|
|
switch protocol {
|
|
case "TcpExt":
|
|
switch key {
|
|
case "SyncookiesSent":
|
|
procNetstat.TcpExt.SyncookiesSent = value
|
|
case "SyncookiesRecv":
|
|
procNetstat.TcpExt.SyncookiesRecv = value
|
|
case "SyncookiesFailed":
|
|
procNetstat.TcpExt.SyncookiesFailed = value
|
|
case "EmbryonicRsts":
|
|
procNetstat.TcpExt.EmbryonicRsts = value
|
|
case "PruneCalled":
|
|
procNetstat.TcpExt.PruneCalled = value
|
|
case "RcvPruned":
|
|
procNetstat.TcpExt.RcvPruned = value
|
|
case "OfoPruned":
|
|
procNetstat.TcpExt.OfoPruned = value
|
|
case "OutOfWindowIcmps":
|
|
procNetstat.TcpExt.OutOfWindowIcmps = value
|
|
case "LockDroppedIcmps":
|
|
procNetstat.TcpExt.LockDroppedIcmps = value
|
|
case "ArpFilter":
|
|
procNetstat.TcpExt.ArpFilter = value
|
|
case "TW":
|
|
procNetstat.TcpExt.TW = value
|
|
case "TWRecycled":
|
|
procNetstat.TcpExt.TWRecycled = value
|
|
case "TWKilled":
|
|
procNetstat.TcpExt.TWKilled = value
|
|
case "PAWSActive":
|
|
procNetstat.TcpExt.PAWSActive = value
|
|
case "PAWSEstab":
|
|
procNetstat.TcpExt.PAWSEstab = value
|
|
case "DelayedACKs":
|
|
procNetstat.TcpExt.DelayedACKs = value
|
|
case "DelayedACKLocked":
|
|
procNetstat.TcpExt.DelayedACKLocked = value
|
|
case "DelayedACKLost":
|
|
procNetstat.TcpExt.DelayedACKLost = value
|
|
case "ListenOverflows":
|
|
procNetstat.TcpExt.ListenOverflows = value
|
|
case "ListenDrops":
|
|
procNetstat.TcpExt.ListenDrops = value
|
|
case "TCPHPHits":
|
|
procNetstat.TcpExt.TCPHPHits = value
|
|
case "TCPPureAcks":
|
|
procNetstat.TcpExt.TCPPureAcks = value
|
|
case "TCPHPAcks":
|
|
procNetstat.TcpExt.TCPHPAcks = value
|
|
case "TCPRenoRecovery":
|
|
procNetstat.TcpExt.TCPRenoRecovery = value
|
|
case "TCPSackRecovery":
|
|
procNetstat.TcpExt.TCPSackRecovery = value
|
|
case "TCPSACKReneging":
|
|
procNetstat.TcpExt.TCPSACKReneging = value
|
|
case "TCPSACKReorder":
|
|
procNetstat.TcpExt.TCPSACKReorder = value
|
|
case "TCPRenoReorder":
|
|
procNetstat.TcpExt.TCPRenoReorder = value
|
|
case "TCPTSReorder":
|
|
procNetstat.TcpExt.TCPTSReorder = value
|
|
case "TCPFullUndo":
|
|
procNetstat.TcpExt.TCPFullUndo = value
|
|
case "TCPPartialUndo":
|
|
procNetstat.TcpExt.TCPPartialUndo = value
|
|
case "TCPDSACKUndo":
|
|
procNetstat.TcpExt.TCPDSACKUndo = value
|
|
case "TCPLossUndo":
|
|
procNetstat.TcpExt.TCPLossUndo = value
|
|
case "TCPLostRetransmit":
|
|
procNetstat.TcpExt.TCPLostRetransmit = value
|
|
case "TCPRenoFailures":
|
|
procNetstat.TcpExt.TCPRenoFailures = value
|
|
case "TCPSackFailures":
|
|
procNetstat.TcpExt.TCPSackFailures = value
|
|
case "TCPLossFailures":
|
|
procNetstat.TcpExt.TCPLossFailures = value
|
|
case "TCPFastRetrans":
|
|
procNetstat.TcpExt.TCPFastRetrans = value
|
|
case "TCPSlowStartRetrans":
|
|
procNetstat.TcpExt.TCPSlowStartRetrans = value
|
|
case "TCPTimeouts":
|
|
procNetstat.TcpExt.TCPTimeouts = value
|
|
case "TCPLossProbes":
|
|
procNetstat.TcpExt.TCPLossProbes = value
|
|
case "TCPLossProbeRecovery":
|
|
procNetstat.TcpExt.TCPLossProbeRecovery = value
|
|
case "TCPRenoRecoveryFail":
|
|
procNetstat.TcpExt.TCPRenoRecoveryFail = value
|
|
case "TCPSackRecoveryFail":
|
|
procNetstat.TcpExt.TCPSackRecoveryFail = value
|
|
case "TCPRcvCollapsed":
|
|
procNetstat.TcpExt.TCPRcvCollapsed = value
|
|
case "TCPDSACKOldSent":
|
|
procNetstat.TcpExt.TCPDSACKOldSent = value
|
|
case "TCPDSACKOfoSent":
|
|
procNetstat.TcpExt.TCPDSACKOfoSent = value
|
|
case "TCPDSACKRecv":
|
|
procNetstat.TcpExt.TCPDSACKRecv = value
|
|
case "TCPDSACKOfoRecv":
|
|
procNetstat.TcpExt.TCPDSACKOfoRecv = value
|
|
case "TCPAbortOnData":
|
|
procNetstat.TcpExt.TCPAbortOnData = value
|
|
case "TCPAbortOnClose":
|
|
procNetstat.TcpExt.TCPAbortOnClose = value
|
|
case "TCPDeferAcceptDrop":
|
|
procNetstat.TcpExt.TCPDeferAcceptDrop = value
|
|
case "IPReversePathFilter":
|
|
procNetstat.TcpExt.IPReversePathFilter = value
|
|
case "TCPTimeWaitOverflow":
|
|
procNetstat.TcpExt.TCPTimeWaitOverflow = value
|
|
case "TCPReqQFullDoCookies":
|
|
procNetstat.TcpExt.TCPReqQFullDoCookies = value
|
|
case "TCPReqQFullDrop":
|
|
procNetstat.TcpExt.TCPReqQFullDrop = value
|
|
case "TCPRetransFail":
|
|
procNetstat.TcpExt.TCPRetransFail = value
|
|
case "TCPRcvCoalesce":
|
|
procNetstat.TcpExt.TCPRcvCoalesce = value
|
|
case "TCPOFOQueue":
|
|
procNetstat.TcpExt.TCPOFOQueue = value
|
|
case "TCPOFODrop":
|
|
procNetstat.TcpExt.TCPOFODrop = value
|
|
case "TCPOFOMerge":
|
|
procNetstat.TcpExt.TCPOFOMerge = value
|
|
case "TCPChallengeACK":
|
|
procNetstat.TcpExt.TCPChallengeACK = value
|
|
case "TCPSYNChallenge":
|
|
procNetstat.TcpExt.TCPSYNChallenge = value
|
|
case "TCPFastOpenActive":
|
|
procNetstat.TcpExt.TCPFastOpenActive = value
|
|
case "TCPFastOpenActiveFail":
|
|
procNetstat.TcpExt.TCPFastOpenActiveFail = value
|
|
case "TCPFastOpenPassive":
|
|
procNetstat.TcpExt.TCPFastOpenPassive = value
|
|
case "TCPFastOpenPassiveFail":
|
|
procNetstat.TcpExt.TCPFastOpenPassiveFail = value
|
|
case "TCPFastOpenListenOverflow":
|
|
procNetstat.TcpExt.TCPFastOpenListenOverflow = value
|
|
case "TCPFastOpenCookieReqd":
|
|
procNetstat.TcpExt.TCPFastOpenCookieReqd = value
|
|
case "TCPFastOpenBlackhole":
|
|
procNetstat.TcpExt.TCPFastOpenBlackhole = value
|
|
case "TCPSpuriousRtxHostQueues":
|
|
procNetstat.TcpExt.TCPSpuriousRtxHostQueues = value
|
|
case "BusyPollRxPackets":
|
|
procNetstat.TcpExt.BusyPollRxPackets = value
|
|
case "TCPAutoCorking":
|
|
procNetstat.TcpExt.TCPAutoCorking = value
|
|
case "TCPFromZeroWindowAdv":
|
|
procNetstat.TcpExt.TCPFromZeroWindowAdv = value
|
|
case "TCPToZeroWindowAdv":
|
|
procNetstat.TcpExt.TCPToZeroWindowAdv = value
|
|
case "TCPWantZeroWindowAdv":
|
|
procNetstat.TcpExt.TCPWantZeroWindowAdv = value
|
|
case "TCPSynRetrans":
|
|
procNetstat.TcpExt.TCPSynRetrans = value
|
|
case "TCPOrigDataSent":
|
|
procNetstat.TcpExt.TCPOrigDataSent = value
|
|
case "TCPHystartTrainDetect":
|
|
procNetstat.TcpExt.TCPHystartTrainDetect = value
|
|
case "TCPHystartTrainCwnd":
|
|
procNetstat.TcpExt.TCPHystartTrainCwnd = value
|
|
case "TCPHystartDelayDetect":
|
|
procNetstat.TcpExt.TCPHystartDelayDetect = value
|
|
case "TCPHystartDelayCwnd":
|
|
procNetstat.TcpExt.TCPHystartDelayCwnd = value
|
|
case "TCPACKSkippedSynRecv":
|
|
procNetstat.TcpExt.TCPACKSkippedSynRecv = value
|
|
case "TCPACKSkippedPAWS":
|
|
procNetstat.TcpExt.TCPACKSkippedPAWS = value
|
|
case "TCPACKSkippedSeq":
|
|
procNetstat.TcpExt.TCPACKSkippedSeq = value
|
|
case "TCPACKSkippedFinWait2":
|
|
procNetstat.TcpExt.TCPACKSkippedFinWait2 = value
|
|
case "TCPACKSkippedTimeWait":
|
|
procNetstat.TcpExt.TCPACKSkippedTimeWait = value
|
|
case "TCPACKSkippedChallenge":
|
|
procNetstat.TcpExt.TCPACKSkippedChallenge = value
|
|
case "TCPWinProbe":
|
|
procNetstat.TcpExt.TCPWinProbe = value
|
|
case "TCPKeepAlive":
|
|
procNetstat.TcpExt.TCPKeepAlive = value
|
|
case "TCPMTUPFail":
|
|
procNetstat.TcpExt.TCPMTUPFail = value
|
|
case "TCPMTUPSuccess":
|
|
procNetstat.TcpExt.TCPMTUPSuccess = value
|
|
case "TCPWqueueTooBig":
|
|
procNetstat.TcpExt.TCPWqueueTooBig = value
|
|
}
|
|
case "IpExt":
|
|
switch key {
|
|
case "InNoRoutes":
|
|
procNetstat.IpExt.InNoRoutes = value
|
|
case "InTruncatedPkts":
|
|
procNetstat.IpExt.InTruncatedPkts = value
|
|
case "InMcastPkts":
|
|
procNetstat.IpExt.InMcastPkts = value
|
|
case "OutMcastPkts":
|
|
procNetstat.IpExt.OutMcastPkts = value
|
|
case "InBcastPkts":
|
|
procNetstat.IpExt.InBcastPkts = value
|
|
case "OutBcastPkts":
|
|
procNetstat.IpExt.OutBcastPkts = value
|
|
case "InOctets":
|
|
procNetstat.IpExt.InOctets = value
|
|
case "OutOctets":
|
|
procNetstat.IpExt.OutOctets = value
|
|
case "InMcastOctets":
|
|
procNetstat.IpExt.InMcastOctets = value
|
|
case "OutMcastOctets":
|
|
procNetstat.IpExt.OutMcastOctets = value
|
|
case "InBcastOctets":
|
|
procNetstat.IpExt.InBcastOctets = value
|
|
case "OutBcastOctets":
|
|
procNetstat.IpExt.OutBcastOctets = value
|
|
case "InCsumErrors":
|
|
procNetstat.IpExt.InCsumErrors = value
|
|
case "InNoECTPkts":
|
|
procNetstat.IpExt.InNoECTPkts = value
|
|
case "InECT1Pkts":
|
|
procNetstat.IpExt.InECT1Pkts = value
|
|
case "InECT0Pkts":
|
|
procNetstat.IpExt.InECT0Pkts = value
|
|
case "InCEPkts":
|
|
procNetstat.IpExt.InCEPkts = value
|
|
case "ReasmOverlaps":
|
|
procNetstat.IpExt.ReasmOverlaps = value
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return procNetstat, scanner.Err()
|
|
}
|