...
1
2
3
4
5
6
7
8
9
10
11
12
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
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
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