...

Source file src/github.com/prometheus/procfs/proc_snmp6.go

Documentation: github.com/prometheus/procfs

     1  // Copyright 2022 The Prometheus Authors
     2  // Licensed under the Apache License, Version 2.0 (the "License");
     3  // you may not use this file except in compliance with the License.
     4  // You may obtain a copy of the License at
     5  //
     6  // http://www.apache.org/licenses/LICENSE-2.0
     7  //
     8  // Unless required by applicable law or agreed to in writing, software
     9  // distributed under the License is distributed on an "AS IS" BASIS,
    10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package procfs
    15  
    16  import (
    17  	"bufio"
    18  	"bytes"
    19  	"errors"
    20  	"io"
    21  	"os"
    22  	"strconv"
    23  	"strings"
    24  
    25  	"github.com/prometheus/procfs/internal/util"
    26  )
    27  
    28  // ProcSnmp6 models the content of /proc/<pid>/net/snmp6.
    29  type ProcSnmp6 struct {
    30  	// The process ID.
    31  	PID int
    32  	Ip6
    33  	Icmp6
    34  	Udp6
    35  	UdpLite6
    36  }
    37  
    38  type Ip6 struct { // nolint:revive
    39  	InReceives       *float64
    40  	InHdrErrors      *float64
    41  	InTooBigErrors   *float64
    42  	InNoRoutes       *float64
    43  	InAddrErrors     *float64
    44  	InUnknownProtos  *float64
    45  	InTruncatedPkts  *float64
    46  	InDiscards       *float64
    47  	InDelivers       *float64
    48  	OutForwDatagrams *float64
    49  	OutRequests      *float64
    50  	OutDiscards      *float64
    51  	OutNoRoutes      *float64
    52  	ReasmTimeout     *float64
    53  	ReasmReqds       *float64
    54  	ReasmOKs         *float64
    55  	ReasmFails       *float64
    56  	FragOKs          *float64
    57  	FragFails        *float64
    58  	FragCreates      *float64
    59  	InMcastPkts      *float64
    60  	OutMcastPkts     *float64
    61  	InOctets         *float64
    62  	OutOctets        *float64
    63  	InMcastOctets    *float64
    64  	OutMcastOctets   *float64
    65  	InBcastOctets    *float64
    66  	OutBcastOctets   *float64
    67  	InNoECTPkts      *float64
    68  	InECT1Pkts       *float64
    69  	InECT0Pkts       *float64
    70  	InCEPkts         *float64
    71  }
    72  
    73  type Icmp6 struct {
    74  	InMsgs                    *float64
    75  	InErrors                  *float64
    76  	OutMsgs                   *float64
    77  	OutErrors                 *float64
    78  	InCsumErrors              *float64
    79  	InDestUnreachs            *float64
    80  	InPktTooBigs              *float64
    81  	InTimeExcds               *float64
    82  	InParmProblems            *float64
    83  	InEchos                   *float64
    84  	InEchoReplies             *float64
    85  	InGroupMembQueries        *float64
    86  	InGroupMembResponses      *float64
    87  	InGroupMembReductions     *float64
    88  	InRouterSolicits          *float64
    89  	InRouterAdvertisements    *float64
    90  	InNeighborSolicits        *float64
    91  	InNeighborAdvertisements  *float64
    92  	InRedirects               *float64
    93  	InMLDv2Reports            *float64
    94  	OutDestUnreachs           *float64
    95  	OutPktTooBigs             *float64
    96  	OutTimeExcds              *float64
    97  	OutParmProblems           *float64
    98  	OutEchos                  *float64
    99  	OutEchoReplies            *float64
   100  	OutGroupMembQueries       *float64
   101  	OutGroupMembResponses     *float64
   102  	OutGroupMembReductions    *float64
   103  	OutRouterSolicits         *float64
   104  	OutRouterAdvertisements   *float64
   105  	OutNeighborSolicits       *float64
   106  	OutNeighborAdvertisements *float64
   107  	OutRedirects              *float64
   108  	OutMLDv2Reports           *float64
   109  	InType1                   *float64
   110  	InType134                 *float64
   111  	InType135                 *float64
   112  	InType136                 *float64
   113  	InType143                 *float64
   114  	OutType133                *float64
   115  	OutType135                *float64
   116  	OutType136                *float64
   117  	OutType143                *float64
   118  }
   119  
   120  type Udp6 struct { // nolint:revive
   121  	InDatagrams  *float64
   122  	NoPorts      *float64
   123  	InErrors     *float64
   124  	OutDatagrams *float64
   125  	RcvbufErrors *float64
   126  	SndbufErrors *float64
   127  	InCsumErrors *float64
   128  	IgnoredMulti *float64
   129  }
   130  
   131  type UdpLite6 struct { // nolint:revive
   132  	InDatagrams  *float64
   133  	NoPorts      *float64
   134  	InErrors     *float64
   135  	OutDatagrams *float64
   136  	RcvbufErrors *float64
   137  	SndbufErrors *float64
   138  	InCsumErrors *float64
   139  }
   140  
   141  func (p Proc) Snmp6() (ProcSnmp6, error) {
   142  	filename := p.path("net/snmp6")
   143  	data, err := util.ReadFileNoStat(filename)
   144  	if err != nil {
   145  		// On systems with IPv6 disabled, this file won't exist.
   146  		// Do nothing.
   147  		if errors.Is(err, os.ErrNotExist) {
   148  			return ProcSnmp6{PID: p.PID}, nil
   149  		}
   150  
   151  		return ProcSnmp6{PID: p.PID}, err
   152  	}
   153  
   154  	procSnmp6, err := parseSNMP6Stats(bytes.NewReader(data))
   155  	procSnmp6.PID = p.PID
   156  	return procSnmp6, err
   157  }
   158  
   159  // parseSnmp6 parses the metrics from proc/<pid>/net/snmp6 file
   160  // and returns a map contains those metrics.
   161  func parseSNMP6Stats(r io.Reader) (ProcSnmp6, error) {
   162  	var (
   163  		scanner   = bufio.NewScanner(r)
   164  		procSnmp6 = ProcSnmp6{}
   165  	)
   166  
   167  	for scanner.Scan() {
   168  		stat := strings.Fields(scanner.Text())
   169  		if len(stat) < 2 {
   170  			continue
   171  		}
   172  		// Expect to have "6" in metric name, skip line otherwise
   173  		if sixIndex := strings.Index(stat[0], "6"); sixIndex != -1 {
   174  			protocol := stat[0][:sixIndex+1]
   175  			key := stat[0][sixIndex+1:]
   176  			value, err := strconv.ParseFloat(stat[1], 64)
   177  			if err != nil {
   178  				return procSnmp6, err
   179  			}
   180  
   181  			switch protocol {
   182  			case "Ip6":
   183  				switch key {
   184  				case "InReceives":
   185  					procSnmp6.Ip6.InReceives = &value
   186  				case "InHdrErrors":
   187  					procSnmp6.Ip6.InHdrErrors = &value
   188  				case "InTooBigErrors":
   189  					procSnmp6.Ip6.InTooBigErrors = &value
   190  				case "InNoRoutes":
   191  					procSnmp6.Ip6.InNoRoutes = &value
   192  				case "InAddrErrors":
   193  					procSnmp6.Ip6.InAddrErrors = &value
   194  				case "InUnknownProtos":
   195  					procSnmp6.Ip6.InUnknownProtos = &value
   196  				case "InTruncatedPkts":
   197  					procSnmp6.Ip6.InTruncatedPkts = &value
   198  				case "InDiscards":
   199  					procSnmp6.Ip6.InDiscards = &value
   200  				case "InDelivers":
   201  					procSnmp6.Ip6.InDelivers = &value
   202  				case "OutForwDatagrams":
   203  					procSnmp6.Ip6.OutForwDatagrams = &value
   204  				case "OutRequests":
   205  					procSnmp6.Ip6.OutRequests = &value
   206  				case "OutDiscards":
   207  					procSnmp6.Ip6.OutDiscards = &value
   208  				case "OutNoRoutes":
   209  					procSnmp6.Ip6.OutNoRoutes = &value
   210  				case "ReasmTimeout":
   211  					procSnmp6.Ip6.ReasmTimeout = &value
   212  				case "ReasmReqds":
   213  					procSnmp6.Ip6.ReasmReqds = &value
   214  				case "ReasmOKs":
   215  					procSnmp6.Ip6.ReasmOKs = &value
   216  				case "ReasmFails":
   217  					procSnmp6.Ip6.ReasmFails = &value
   218  				case "FragOKs":
   219  					procSnmp6.Ip6.FragOKs = &value
   220  				case "FragFails":
   221  					procSnmp6.Ip6.FragFails = &value
   222  				case "FragCreates":
   223  					procSnmp6.Ip6.FragCreates = &value
   224  				case "InMcastPkts":
   225  					procSnmp6.Ip6.InMcastPkts = &value
   226  				case "OutMcastPkts":
   227  					procSnmp6.Ip6.OutMcastPkts = &value
   228  				case "InOctets":
   229  					procSnmp6.Ip6.InOctets = &value
   230  				case "OutOctets":
   231  					procSnmp6.Ip6.OutOctets = &value
   232  				case "InMcastOctets":
   233  					procSnmp6.Ip6.InMcastOctets = &value
   234  				case "OutMcastOctets":
   235  					procSnmp6.Ip6.OutMcastOctets = &value
   236  				case "InBcastOctets":
   237  					procSnmp6.Ip6.InBcastOctets = &value
   238  				case "OutBcastOctets":
   239  					procSnmp6.Ip6.OutBcastOctets = &value
   240  				case "InNoECTPkts":
   241  					procSnmp6.Ip6.InNoECTPkts = &value
   242  				case "InECT1Pkts":
   243  					procSnmp6.Ip6.InECT1Pkts = &value
   244  				case "InECT0Pkts":
   245  					procSnmp6.Ip6.InECT0Pkts = &value
   246  				case "InCEPkts":
   247  					procSnmp6.Ip6.InCEPkts = &value
   248  
   249  				}
   250  			case "Icmp6":
   251  				switch key {
   252  				case "InMsgs":
   253  					procSnmp6.Icmp6.InMsgs = &value
   254  				case "InErrors":
   255  					procSnmp6.Icmp6.InErrors = &value
   256  				case "OutMsgs":
   257  					procSnmp6.Icmp6.OutMsgs = &value
   258  				case "OutErrors":
   259  					procSnmp6.Icmp6.OutErrors = &value
   260  				case "InCsumErrors":
   261  					procSnmp6.Icmp6.InCsumErrors = &value
   262  				case "InDestUnreachs":
   263  					procSnmp6.Icmp6.InDestUnreachs = &value
   264  				case "InPktTooBigs":
   265  					procSnmp6.Icmp6.InPktTooBigs = &value
   266  				case "InTimeExcds":
   267  					procSnmp6.Icmp6.InTimeExcds = &value
   268  				case "InParmProblems":
   269  					procSnmp6.Icmp6.InParmProblems = &value
   270  				case "InEchos":
   271  					procSnmp6.Icmp6.InEchos = &value
   272  				case "InEchoReplies":
   273  					procSnmp6.Icmp6.InEchoReplies = &value
   274  				case "InGroupMembQueries":
   275  					procSnmp6.Icmp6.InGroupMembQueries = &value
   276  				case "InGroupMembResponses":
   277  					procSnmp6.Icmp6.InGroupMembResponses = &value
   278  				case "InGroupMembReductions":
   279  					procSnmp6.Icmp6.InGroupMembReductions = &value
   280  				case "InRouterSolicits":
   281  					procSnmp6.Icmp6.InRouterSolicits = &value
   282  				case "InRouterAdvertisements":
   283  					procSnmp6.Icmp6.InRouterAdvertisements = &value
   284  				case "InNeighborSolicits":
   285  					procSnmp6.Icmp6.InNeighborSolicits = &value
   286  				case "InNeighborAdvertisements":
   287  					procSnmp6.Icmp6.InNeighborAdvertisements = &value
   288  				case "InRedirects":
   289  					procSnmp6.Icmp6.InRedirects = &value
   290  				case "InMLDv2Reports":
   291  					procSnmp6.Icmp6.InMLDv2Reports = &value
   292  				case "OutDestUnreachs":
   293  					procSnmp6.Icmp6.OutDestUnreachs = &value
   294  				case "OutPktTooBigs":
   295  					procSnmp6.Icmp6.OutPktTooBigs = &value
   296  				case "OutTimeExcds":
   297  					procSnmp6.Icmp6.OutTimeExcds = &value
   298  				case "OutParmProblems":
   299  					procSnmp6.Icmp6.OutParmProblems = &value
   300  				case "OutEchos":
   301  					procSnmp6.Icmp6.OutEchos = &value
   302  				case "OutEchoReplies":
   303  					procSnmp6.Icmp6.OutEchoReplies = &value
   304  				case "OutGroupMembQueries":
   305  					procSnmp6.Icmp6.OutGroupMembQueries = &value
   306  				case "OutGroupMembResponses":
   307  					procSnmp6.Icmp6.OutGroupMembResponses = &value
   308  				case "OutGroupMembReductions":
   309  					procSnmp6.Icmp6.OutGroupMembReductions = &value
   310  				case "OutRouterSolicits":
   311  					procSnmp6.Icmp6.OutRouterSolicits = &value
   312  				case "OutRouterAdvertisements":
   313  					procSnmp6.Icmp6.OutRouterAdvertisements = &value
   314  				case "OutNeighborSolicits":
   315  					procSnmp6.Icmp6.OutNeighborSolicits = &value
   316  				case "OutNeighborAdvertisements":
   317  					procSnmp6.Icmp6.OutNeighborAdvertisements = &value
   318  				case "OutRedirects":
   319  					procSnmp6.Icmp6.OutRedirects = &value
   320  				case "OutMLDv2Reports":
   321  					procSnmp6.Icmp6.OutMLDv2Reports = &value
   322  				case "InType1":
   323  					procSnmp6.Icmp6.InType1 = &value
   324  				case "InType134":
   325  					procSnmp6.Icmp6.InType134 = &value
   326  				case "InType135":
   327  					procSnmp6.Icmp6.InType135 = &value
   328  				case "InType136":
   329  					procSnmp6.Icmp6.InType136 = &value
   330  				case "InType143":
   331  					procSnmp6.Icmp6.InType143 = &value
   332  				case "OutType133":
   333  					procSnmp6.Icmp6.OutType133 = &value
   334  				case "OutType135":
   335  					procSnmp6.Icmp6.OutType135 = &value
   336  				case "OutType136":
   337  					procSnmp6.Icmp6.OutType136 = &value
   338  				case "OutType143":
   339  					procSnmp6.Icmp6.OutType143 = &value
   340  				}
   341  			case "Udp6":
   342  				switch key {
   343  				case "InDatagrams":
   344  					procSnmp6.Udp6.InDatagrams = &value
   345  				case "NoPorts":
   346  					procSnmp6.Udp6.NoPorts = &value
   347  				case "InErrors":
   348  					procSnmp6.Udp6.InErrors = &value
   349  				case "OutDatagrams":
   350  					procSnmp6.Udp6.OutDatagrams = &value
   351  				case "RcvbufErrors":
   352  					procSnmp6.Udp6.RcvbufErrors = &value
   353  				case "SndbufErrors":
   354  					procSnmp6.Udp6.SndbufErrors = &value
   355  				case "InCsumErrors":
   356  					procSnmp6.Udp6.InCsumErrors = &value
   357  				case "IgnoredMulti":
   358  					procSnmp6.Udp6.IgnoredMulti = &value
   359  				}
   360  			case "UdpLite6":
   361  				switch key {
   362  				case "InDatagrams":
   363  					procSnmp6.UdpLite6.InDatagrams = &value
   364  				case "NoPorts":
   365  					procSnmp6.UdpLite6.NoPorts = &value
   366  				case "InErrors":
   367  					procSnmp6.UdpLite6.InErrors = &value
   368  				case "OutDatagrams":
   369  					procSnmp6.UdpLite6.OutDatagrams = &value
   370  				case "RcvbufErrors":
   371  					procSnmp6.UdpLite6.RcvbufErrors = &value
   372  				case "SndbufErrors":
   373  					procSnmp6.UdpLite6.SndbufErrors = &value
   374  				case "InCsumErrors":
   375  					procSnmp6.UdpLite6.InCsumErrors = &value
   376  				}
   377  			}
   378  		}
   379  	}
   380  	return procSnmp6, scanner.Err()
   381  }
   382  

View as plain text