123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- // 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()
- }
|