mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-30 22:22:25 -05:00 
			
		
		
		
	* feat: Initial OTEL metrics * docs: add metrics documentation * fix: metrics endpoint conditional check * feat: metrics endpoint basic auth * fix: make metrics-auth-enabled default false * fix: go fmt helpers.gen.go * fix: add metric-related env vars to envparsing.sh * fix: metrics docs * fix: metrics related stuff in envparsing.sh * fix: metrics docs * chore: metrics docs wording * fix: metrics stuff in envparsing? * bump otel versions --------- Co-authored-by: Tsuribori <user@acertaindebian> Co-authored-by: Tsuribori <none@example.org> Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
		
			
				
	
	
		
			443 lines
		
	
	
	
		
			15 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			443 lines
		
	
	
	
		
			15 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
 | |
| 	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
 | |
| }
 | |
| 
 | |
| 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 := parseProcNetstat(bytes.NewReader(data), filename)
 | |
| 	procNetstat.PID = p.PID
 | |
| 	return procNetstat, err
 | |
| }
 | |
| 
 | |
| // parseProcNetstat parses the metrics from proc/<pid>/net/netstat file
 | |
| // and returns a ProcNetstat structure.
 | |
| func parseProcNetstat(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("%w: mismatch field count mismatch in %s: %s",
 | |
| 				ErrFileParse, 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 "TCPRcvQDrop":
 | |
| 					procNetstat.TcpExt.TCPRcvQDrop = &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()
 | |
| }
 |