blob: 57bb4a35858c2528a2eacd81a4fc5309d5f37571 [file] [log] [blame]
khenaidooffe076b2019-01-15 16:08:08 -05001// 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
14package nfs
15
16import (
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
26func 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}