github.com/hellobchain/third_party@v0.0.0-20230331131523-deb0478a2e52/prometheus/procfs/nfs/parse_nfsd.go (about) 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/hellobchain/third_party/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: %s", 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 default: 77 return nil, fmt.Errorf("unknown NFSd metric line %q", metricLine) 78 } 79 if err != nil { 80 return nil, fmt.Errorf("errors parsing NFSd metric line: %s", err) 81 } 82 } 83 84 if err := scanner.Err(); err != nil { 85 return nil, fmt.Errorf("error scanning NFSd file: %s", err) 86 } 87 88 return stats, nil 89 }