mirror of https://github.com/kubernetes/kops.git
				
				
				
			
		
			
				
	
	
		
			382 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			382 lines
		
	
	
		
			11 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"
 | |
| 	"errors"
 | |
| 	"io"
 | |
| 	"os"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/prometheus/procfs/internal/util"
 | |
| )
 | |
| 
 | |
| // ProcSnmp6 models the content of /proc/<pid>/net/snmp6.
 | |
| type ProcSnmp6 struct {
 | |
| 	// The process ID.
 | |
| 	PID int
 | |
| 	Ip6
 | |
| 	Icmp6
 | |
| 	Udp6
 | |
| 	UdpLite6
 | |
| }
 | |
| 
 | |
| type Ip6 struct { // nolint:revive
 | |
| 	InReceives       float64
 | |
| 	InHdrErrors      float64
 | |
| 	InTooBigErrors   float64
 | |
| 	InNoRoutes       float64
 | |
| 	InAddrErrors     float64
 | |
| 	InUnknownProtos  float64
 | |
| 	InTruncatedPkts  float64
 | |
| 	InDiscards       float64
 | |
| 	InDelivers       float64
 | |
| 	OutForwDatagrams float64
 | |
| 	OutRequests      float64
 | |
| 	OutDiscards      float64
 | |
| 	OutNoRoutes      float64
 | |
| 	ReasmTimeout     float64
 | |
| 	ReasmReqds       float64
 | |
| 	ReasmOKs         float64
 | |
| 	ReasmFails       float64
 | |
| 	FragOKs          float64
 | |
| 	FragFails        float64
 | |
| 	FragCreates      float64
 | |
| 	InMcastPkts      float64
 | |
| 	OutMcastPkts     float64
 | |
| 	InOctets         float64
 | |
| 	OutOctets        float64
 | |
| 	InMcastOctets    float64
 | |
| 	OutMcastOctets   float64
 | |
| 	InBcastOctets    float64
 | |
| 	OutBcastOctets   float64
 | |
| 	InNoECTPkts      float64
 | |
| 	InECT1Pkts       float64
 | |
| 	InECT0Pkts       float64
 | |
| 	InCEPkts         float64
 | |
| }
 | |
| 
 | |
| type Icmp6 struct {
 | |
| 	InMsgs                    float64
 | |
| 	InErrors                  float64
 | |
| 	OutMsgs                   float64
 | |
| 	OutErrors                 float64
 | |
| 	InCsumErrors              float64
 | |
| 	InDestUnreachs            float64
 | |
| 	InPktTooBigs              float64
 | |
| 	InTimeExcds               float64
 | |
| 	InParmProblems            float64
 | |
| 	InEchos                   float64
 | |
| 	InEchoReplies             float64
 | |
| 	InGroupMembQueries        float64
 | |
| 	InGroupMembResponses      float64
 | |
| 	InGroupMembReductions     float64
 | |
| 	InRouterSolicits          float64
 | |
| 	InRouterAdvertisements    float64
 | |
| 	InNeighborSolicits        float64
 | |
| 	InNeighborAdvertisements  float64
 | |
| 	InRedirects               float64
 | |
| 	InMLDv2Reports            float64
 | |
| 	OutDestUnreachs           float64
 | |
| 	OutPktTooBigs             float64
 | |
| 	OutTimeExcds              float64
 | |
| 	OutParmProblems           float64
 | |
| 	OutEchos                  float64
 | |
| 	OutEchoReplies            float64
 | |
| 	OutGroupMembQueries       float64
 | |
| 	OutGroupMembResponses     float64
 | |
| 	OutGroupMembReductions    float64
 | |
| 	OutRouterSolicits         float64
 | |
| 	OutRouterAdvertisements   float64
 | |
| 	OutNeighborSolicits       float64
 | |
| 	OutNeighborAdvertisements float64
 | |
| 	OutRedirects              float64
 | |
| 	OutMLDv2Reports           float64
 | |
| 	InType1                   float64
 | |
| 	InType134                 float64
 | |
| 	InType135                 float64
 | |
| 	InType136                 float64
 | |
| 	InType143                 float64
 | |
| 	OutType133                float64
 | |
| 	OutType135                float64
 | |
| 	OutType136                float64
 | |
| 	OutType143                float64
 | |
| }
 | |
| 
 | |
| type Udp6 struct { // nolint:revive
 | |
| 	InDatagrams  float64
 | |
| 	NoPorts      float64
 | |
| 	InErrors     float64
 | |
| 	OutDatagrams float64
 | |
| 	RcvbufErrors float64
 | |
| 	SndbufErrors float64
 | |
| 	InCsumErrors float64
 | |
| 	IgnoredMulti float64
 | |
| }
 | |
| 
 | |
| type UdpLite6 struct { // nolint:revive
 | |
| 	InDatagrams  float64
 | |
| 	NoPorts      float64
 | |
| 	InErrors     float64
 | |
| 	OutDatagrams float64
 | |
| 	RcvbufErrors float64
 | |
| 	SndbufErrors float64
 | |
| 	InCsumErrors float64
 | |
| }
 | |
| 
 | |
| func (p Proc) Snmp6() (ProcSnmp6, error) {
 | |
| 	filename := p.path("net/snmp6")
 | |
| 	data, err := util.ReadFileNoStat(filename)
 | |
| 	if err != nil {
 | |
| 		// On systems with IPv6 disabled, this file won't exist.
 | |
| 		// Do nothing.
 | |
| 		if errors.Is(err, os.ErrNotExist) {
 | |
| 			return ProcSnmp6{PID: p.PID}, nil
 | |
| 		}
 | |
| 
 | |
| 		return ProcSnmp6{PID: p.PID}, err
 | |
| 	}
 | |
| 
 | |
| 	procSnmp6, err := parseSNMP6Stats(bytes.NewReader(data))
 | |
| 	procSnmp6.PID = p.PID
 | |
| 	return procSnmp6, err
 | |
| }
 | |
| 
 | |
| // parseSnmp6 parses the metrics from proc/<pid>/net/snmp6 file
 | |
| // and returns a map contains those metrics.
 | |
| func parseSNMP6Stats(r io.Reader) (ProcSnmp6, error) {
 | |
| 	var (
 | |
| 		scanner   = bufio.NewScanner(r)
 | |
| 		procSnmp6 = ProcSnmp6{}
 | |
| 	)
 | |
| 
 | |
| 	for scanner.Scan() {
 | |
| 		stat := strings.Fields(scanner.Text())
 | |
| 		if len(stat) < 2 {
 | |
| 			continue
 | |
| 		}
 | |
| 		// Expect to have "6" in metric name, skip line otherwise
 | |
| 		if sixIndex := strings.Index(stat[0], "6"); sixIndex != -1 {
 | |
| 			protocol := stat[0][:sixIndex+1]
 | |
| 			key := stat[0][sixIndex+1:]
 | |
| 			value, err := strconv.ParseFloat(stat[1], 64)
 | |
| 			if err != nil {
 | |
| 				return procSnmp6, err
 | |
| 			}
 | |
| 
 | |
| 			switch protocol {
 | |
| 			case "Ip6":
 | |
| 				switch key {
 | |
| 				case "InReceives":
 | |
| 					procSnmp6.Ip6.InReceives = value
 | |
| 				case "InHdrErrors":
 | |
| 					procSnmp6.Ip6.InHdrErrors = value
 | |
| 				case "InTooBigErrors":
 | |
| 					procSnmp6.Ip6.InTooBigErrors = value
 | |
| 				case "InNoRoutes":
 | |
| 					procSnmp6.Ip6.InNoRoutes = value
 | |
| 				case "InAddrErrors":
 | |
| 					procSnmp6.Ip6.InAddrErrors = value
 | |
| 				case "InUnknownProtos":
 | |
| 					procSnmp6.Ip6.InUnknownProtos = value
 | |
| 				case "InTruncatedPkts":
 | |
| 					procSnmp6.Ip6.InTruncatedPkts = value
 | |
| 				case "InDiscards":
 | |
| 					procSnmp6.Ip6.InDiscards = value
 | |
| 				case "InDelivers":
 | |
| 					procSnmp6.Ip6.InDelivers = value
 | |
| 				case "OutForwDatagrams":
 | |
| 					procSnmp6.Ip6.OutForwDatagrams = value
 | |
| 				case "OutRequests":
 | |
| 					procSnmp6.Ip6.OutRequests = value
 | |
| 				case "OutDiscards":
 | |
| 					procSnmp6.Ip6.OutDiscards = value
 | |
| 				case "OutNoRoutes":
 | |
| 					procSnmp6.Ip6.OutNoRoutes = value
 | |
| 				case "ReasmTimeout":
 | |
| 					procSnmp6.Ip6.ReasmTimeout = value
 | |
| 				case "ReasmReqds":
 | |
| 					procSnmp6.Ip6.ReasmReqds = value
 | |
| 				case "ReasmOKs":
 | |
| 					procSnmp6.Ip6.ReasmOKs = value
 | |
| 				case "ReasmFails":
 | |
| 					procSnmp6.Ip6.ReasmFails = value
 | |
| 				case "FragOKs":
 | |
| 					procSnmp6.Ip6.FragOKs = value
 | |
| 				case "FragFails":
 | |
| 					procSnmp6.Ip6.FragFails = value
 | |
| 				case "FragCreates":
 | |
| 					procSnmp6.Ip6.FragCreates = value
 | |
| 				case "InMcastPkts":
 | |
| 					procSnmp6.Ip6.InMcastPkts = value
 | |
| 				case "OutMcastPkts":
 | |
| 					procSnmp6.Ip6.OutMcastPkts = value
 | |
| 				case "InOctets":
 | |
| 					procSnmp6.Ip6.InOctets = value
 | |
| 				case "OutOctets":
 | |
| 					procSnmp6.Ip6.OutOctets = value
 | |
| 				case "InMcastOctets":
 | |
| 					procSnmp6.Ip6.InMcastOctets = value
 | |
| 				case "OutMcastOctets":
 | |
| 					procSnmp6.Ip6.OutMcastOctets = value
 | |
| 				case "InBcastOctets":
 | |
| 					procSnmp6.Ip6.InBcastOctets = value
 | |
| 				case "OutBcastOctets":
 | |
| 					procSnmp6.Ip6.OutBcastOctets = value
 | |
| 				case "InNoECTPkts":
 | |
| 					procSnmp6.Ip6.InNoECTPkts = value
 | |
| 				case "InECT1Pkts":
 | |
| 					procSnmp6.Ip6.InECT1Pkts = value
 | |
| 				case "InECT0Pkts":
 | |
| 					procSnmp6.Ip6.InECT0Pkts = value
 | |
| 				case "InCEPkts":
 | |
| 					procSnmp6.Ip6.InCEPkts = value
 | |
| 
 | |
| 				}
 | |
| 			case "Icmp6":
 | |
| 				switch key {
 | |
| 				case "InMsgs":
 | |
| 					procSnmp6.Icmp6.InMsgs = value
 | |
| 				case "InErrors":
 | |
| 					procSnmp6.Icmp6.InErrors = value
 | |
| 				case "OutMsgs":
 | |
| 					procSnmp6.Icmp6.OutMsgs = value
 | |
| 				case "OutErrors":
 | |
| 					procSnmp6.Icmp6.OutErrors = value
 | |
| 				case "InCsumErrors":
 | |
| 					procSnmp6.Icmp6.InCsumErrors = value
 | |
| 				case "InDestUnreachs":
 | |
| 					procSnmp6.Icmp6.InDestUnreachs = value
 | |
| 				case "InPktTooBigs":
 | |
| 					procSnmp6.Icmp6.InPktTooBigs = value
 | |
| 				case "InTimeExcds":
 | |
| 					procSnmp6.Icmp6.InTimeExcds = value
 | |
| 				case "InParmProblems":
 | |
| 					procSnmp6.Icmp6.InParmProblems = value
 | |
| 				case "InEchos":
 | |
| 					procSnmp6.Icmp6.InEchos = value
 | |
| 				case "InEchoReplies":
 | |
| 					procSnmp6.Icmp6.InEchoReplies = value
 | |
| 				case "InGroupMembQueries":
 | |
| 					procSnmp6.Icmp6.InGroupMembQueries = value
 | |
| 				case "InGroupMembResponses":
 | |
| 					procSnmp6.Icmp6.InGroupMembResponses = value
 | |
| 				case "InGroupMembReductions":
 | |
| 					procSnmp6.Icmp6.InGroupMembReductions = value
 | |
| 				case "InRouterSolicits":
 | |
| 					procSnmp6.Icmp6.InRouterSolicits = value
 | |
| 				case "InRouterAdvertisements":
 | |
| 					procSnmp6.Icmp6.InRouterAdvertisements = value
 | |
| 				case "InNeighborSolicits":
 | |
| 					procSnmp6.Icmp6.InNeighborSolicits = value
 | |
| 				case "InNeighborAdvertisements":
 | |
| 					procSnmp6.Icmp6.InNeighborAdvertisements = value
 | |
| 				case "InRedirects":
 | |
| 					procSnmp6.Icmp6.InRedirects = value
 | |
| 				case "InMLDv2Reports":
 | |
| 					procSnmp6.Icmp6.InMLDv2Reports = value
 | |
| 				case "OutDestUnreachs":
 | |
| 					procSnmp6.Icmp6.OutDestUnreachs = value
 | |
| 				case "OutPktTooBigs":
 | |
| 					procSnmp6.Icmp6.OutPktTooBigs = value
 | |
| 				case "OutTimeExcds":
 | |
| 					procSnmp6.Icmp6.OutTimeExcds = value
 | |
| 				case "OutParmProblems":
 | |
| 					procSnmp6.Icmp6.OutParmProblems = value
 | |
| 				case "OutEchos":
 | |
| 					procSnmp6.Icmp6.OutEchos = value
 | |
| 				case "OutEchoReplies":
 | |
| 					procSnmp6.Icmp6.OutEchoReplies = value
 | |
| 				case "OutGroupMembQueries":
 | |
| 					procSnmp6.Icmp6.OutGroupMembQueries = value
 | |
| 				case "OutGroupMembResponses":
 | |
| 					procSnmp6.Icmp6.OutGroupMembResponses = value
 | |
| 				case "OutGroupMembReductions":
 | |
| 					procSnmp6.Icmp6.OutGroupMembReductions = value
 | |
| 				case "OutRouterSolicits":
 | |
| 					procSnmp6.Icmp6.OutRouterSolicits = value
 | |
| 				case "OutRouterAdvertisements":
 | |
| 					procSnmp6.Icmp6.OutRouterAdvertisements = value
 | |
| 				case "OutNeighborSolicits":
 | |
| 					procSnmp6.Icmp6.OutNeighborSolicits = value
 | |
| 				case "OutNeighborAdvertisements":
 | |
| 					procSnmp6.Icmp6.OutNeighborAdvertisements = value
 | |
| 				case "OutRedirects":
 | |
| 					procSnmp6.Icmp6.OutRedirects = value
 | |
| 				case "OutMLDv2Reports":
 | |
| 					procSnmp6.Icmp6.OutMLDv2Reports = value
 | |
| 				case "InType1":
 | |
| 					procSnmp6.Icmp6.InType1 = value
 | |
| 				case "InType134":
 | |
| 					procSnmp6.Icmp6.InType134 = value
 | |
| 				case "InType135":
 | |
| 					procSnmp6.Icmp6.InType135 = value
 | |
| 				case "InType136":
 | |
| 					procSnmp6.Icmp6.InType136 = value
 | |
| 				case "InType143":
 | |
| 					procSnmp6.Icmp6.InType143 = value
 | |
| 				case "OutType133":
 | |
| 					procSnmp6.Icmp6.OutType133 = value
 | |
| 				case "OutType135":
 | |
| 					procSnmp6.Icmp6.OutType135 = value
 | |
| 				case "OutType136":
 | |
| 					procSnmp6.Icmp6.OutType136 = value
 | |
| 				case "OutType143":
 | |
| 					procSnmp6.Icmp6.OutType143 = value
 | |
| 				}
 | |
| 			case "Udp6":
 | |
| 				switch key {
 | |
| 				case "InDatagrams":
 | |
| 					procSnmp6.Udp6.InDatagrams = value
 | |
| 				case "NoPorts":
 | |
| 					procSnmp6.Udp6.NoPorts = value
 | |
| 				case "InErrors":
 | |
| 					procSnmp6.Udp6.InErrors = value
 | |
| 				case "OutDatagrams":
 | |
| 					procSnmp6.Udp6.OutDatagrams = value
 | |
| 				case "RcvbufErrors":
 | |
| 					procSnmp6.Udp6.RcvbufErrors = value
 | |
| 				case "SndbufErrors":
 | |
| 					procSnmp6.Udp6.SndbufErrors = value
 | |
| 				case "InCsumErrors":
 | |
| 					procSnmp6.Udp6.InCsumErrors = value
 | |
| 				case "IgnoredMulti":
 | |
| 					procSnmp6.Udp6.IgnoredMulti = value
 | |
| 				}
 | |
| 			case "UdpLite6":
 | |
| 				switch key {
 | |
| 				case "InDatagrams":
 | |
| 					procSnmp6.UdpLite6.InDatagrams = value
 | |
| 				case "NoPorts":
 | |
| 					procSnmp6.UdpLite6.NoPorts = value
 | |
| 				case "InErrors":
 | |
| 					procSnmp6.UdpLite6.InErrors = value
 | |
| 				case "OutDatagrams":
 | |
| 					procSnmp6.UdpLite6.OutDatagrams = value
 | |
| 				case "RcvbufErrors":
 | |
| 					procSnmp6.UdpLite6.RcvbufErrors = value
 | |
| 				case "SndbufErrors":
 | |
| 					procSnmp6.UdpLite6.SndbufErrors = value
 | |
| 				case "InCsumErrors":
 | |
| 					procSnmp6.UdpLite6.InCsumErrors = value
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	return procSnmp6, scanner.Err()
 | |
| }
 |