blob: 742dff453ba8958fea62e2baf0206b07247bfce7 [file] [log] [blame]
Abhay Kumara61c5222025-11-10 07:32:50 +00001// Copyright 2020 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 procfs
15
16import (
17 "bufio"
18 "os"
19 "path/filepath"
20 "strconv"
21 "strings"
22)
23
24// NetStat contains statistics for all the counters from one file.
25type NetStat struct {
26 Stats map[string][]uint64
27 Filename string
28}
29
30// NetStat retrieves stats from `/proc/net/stat/`.
31func (fs FS) NetStat() ([]NetStat, error) {
32 statFiles, err := filepath.Glob(fs.proc.Path("net/stat/*"))
33 if err != nil {
34 return nil, err
35 }
36
37 var netStatsTotal []NetStat
38
39 for _, filePath := range statFiles {
40 procNetstat, err := parseNetstat(filePath)
41 if err != nil {
42 return nil, err
43 }
44 procNetstat.Filename = filepath.Base(filePath)
45
46 netStatsTotal = append(netStatsTotal, procNetstat)
47 }
48 return netStatsTotal, nil
49}
50
51// parseNetstat parses the metrics from `/proc/net/stat/` file
52// and returns a NetStat structure.
53func parseNetstat(filePath string) (NetStat, error) {
54 netStat := NetStat{
55 Stats: make(map[string][]uint64),
56 }
57 file, err := os.Open(filePath)
58 if err != nil {
59 return netStat, err
60 }
61 defer file.Close()
62
63 scanner := bufio.NewScanner(file)
64 scanner.Scan()
65
66 // First string is always a header for stats
67 var headers []string
68 headers = append(headers, strings.Fields(scanner.Text())...)
69
70 // Other strings represent per-CPU counters
71 for scanner.Scan() {
72 for num, counter := range strings.Fields(scanner.Text()) {
73 value, err := strconv.ParseUint(counter, 16, 64)
74 if err != nil {
75 return NetStat{}, err
76 }
77 netStat.Stats[headers[num]] = append(netStat.Stats[headers[num]], value)
78 }
79 }
80
81 return netStat, nil
82}