...

Source file src/github.com/prometheus/procfs/nfs/parse_nfsd.go

Documentation: github.com/prometheus/procfs/nfs

     1  // Copyright 2018 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 nfs
    15  
    16  import (
    17  	"bufio"
    18  	"fmt"
    19  	"io"
    20  	"strings"
    21  
    22  	"github.com/prometheus/procfs/internal/util"
    23  )
    24  
    25  // ParseServerRPCStats returns stats read from /proc/net/rpc/nfsd.
    26  func ParseServerRPCStats(r io.Reader) (*ServerRPCStats, error) {
    27  	stats := &ServerRPCStats{}
    28  
    29  	scanner := bufio.NewScanner(r)
    30  	for scanner.Scan() {
    31  		line := scanner.Text()
    32  		parts := strings.Fields(scanner.Text())
    33  		// require at least <key> <value>
    34  		if len(parts) < 2 {
    35  			return nil, fmt.Errorf("invalid NFSd metric line %q", line)
    36  		}
    37  		label := parts[0]
    38  
    39  		var values []uint64
    40  		var err error
    41  		if label == "th" {
    42  			if len(parts) < 3 {
    43  				return nil, fmt.Errorf("invalid NFSd th metric line %q", line)
    44  			}
    45  			values, err = util.ParseUint64s(parts[1:3])
    46  		} else {
    47  			values, err = util.ParseUint64s(parts[1:])
    48  		}
    49  		if err != nil {
    50  			return nil, fmt.Errorf("error parsing NFSd metric line: %w", err)
    51  		}
    52  
    53  		switch metricLine := parts[0]; metricLine {
    54  		case "rc":
    55  			stats.ReplyCache, err = parseReplyCache(values)
    56  		case "fh":
    57  			stats.FileHandles, err = parseFileHandles(values)
    58  		case "io":
    59  			stats.InputOutput, err = parseInputOutput(values)
    60  		case "th":
    61  			stats.Threads, err = parseThreads(values)
    62  		case "ra":
    63  			stats.ReadAheadCache, err = parseReadAheadCache(values)
    64  		case "net":
    65  			stats.Network, err = parseNetwork(values)
    66  		case "rpc":
    67  			stats.ServerRPC, err = parseServerRPC(values)
    68  		case "proc2":
    69  			stats.V2Stats, err = parseV2Stats(values)
    70  		case "proc3":
    71  			stats.V3Stats, err = parseV3Stats(values)
    72  		case "proc4":
    73  			stats.ServerV4Stats, err = parseServerV4Stats(values)
    74  		case "proc4ops":
    75  			stats.V4Ops, err = parseV4Ops(values)
    76  		case "wdeleg_getattr":
    77  			stats.WdelegGetattr = values[0]
    78  		default:
    79  			return nil, fmt.Errorf("unknown NFSd metric line %q", metricLine)
    80  		}
    81  		if err != nil {
    82  			return nil, fmt.Errorf("errors parsing NFSd metric line: %w", err)
    83  		}
    84  	}
    85  
    86  	if err := scanner.Err(); err != nil {
    87  		return nil, fmt.Errorf("error scanning NFSd file: %w", err)
    88  	}
    89  
    90  	return stats, nil
    91  }
    92  

View as plain text