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