...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package procfs
15
16 import (
17 "bufio"
18 "bytes"
19 "fmt"
20 "strconv"
21 "strings"
22
23 "github.com/prometheus/procfs/internal/util"
24 )
25
26
27
28
29
30 type CgroupSummary struct {
31
32 SubsysName string
33
34 Hierarchy int
35
36 Cgroups int
37
38 Enabled int
39 }
40
41
42
43 func parseCgroupSummaryString(CgroupSummaryStr string) (*CgroupSummary, error) {
44 var err error
45
46 fields := strings.Fields(CgroupSummaryStr)
47
48 if len(fields) < 4 {
49 return nil, fmt.Errorf("%w: 4+ fields required, found %d fields in cgroup info string: %s", ErrFileParse, len(fields), CgroupSummaryStr)
50 }
51
52 CgroupSummary := &CgroupSummary{
53 SubsysName: fields[0],
54 }
55 CgroupSummary.Hierarchy, err = strconv.Atoi(fields[1])
56 if err != nil {
57 return nil, fmt.Errorf("%w: Unable to parse hierarchy ID from %q", ErrFileParse, fields[1])
58 }
59 CgroupSummary.Cgroups, err = strconv.Atoi(fields[2])
60 if err != nil {
61 return nil, fmt.Errorf("%w: Unable to parse Cgroup Num from %q", ErrFileParse, fields[2])
62 }
63 CgroupSummary.Enabled, err = strconv.Atoi(fields[3])
64 if err != nil {
65 return nil, fmt.Errorf("%w: Unable to parse Enabled from %q", ErrFileParse, fields[3])
66 }
67 return CgroupSummary, nil
68 }
69
70
71 func parseCgroupSummary(data []byte) ([]CgroupSummary, error) {
72 var CgroupSummarys []CgroupSummary
73 scanner := bufio.NewScanner(bytes.NewReader(data))
74 for scanner.Scan() {
75 CgroupSummaryString := scanner.Text()
76
77 if strings.HasPrefix(CgroupSummaryString, "#") {
78 continue
79 }
80 CgroupSummary, err := parseCgroupSummaryString(CgroupSummaryString)
81 if err != nil {
82 return nil, err
83 }
84 CgroupSummarys = append(CgroupSummarys, *CgroupSummary)
85 }
86
87 err := scanner.Err()
88 return CgroupSummarys, err
89 }
90
91
92 func (fs FS) CgroupSummarys() ([]CgroupSummary, error) {
93 data, err := util.ReadFileNoStat(fs.proc.Path("cgroups"))
94 if err != nil {
95 return nil, err
96 }
97 return parseCgroupSummary(data)
98 }
99
View as plain text