1 | // 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 |
|
---|
14 | package procfs
|
---|
15 |
|
---|
16 | import (
|
---|
17 | "bufio"
|
---|
18 | "os"
|
---|
19 | "path/filepath"
|
---|
20 | "strconv"
|
---|
21 | "strings"
|
---|
22 | )
|
---|
23 |
|
---|
24 | // NetStat contains statistics for all the counters from one file.
|
---|
25 | type NetStat struct {
|
---|
26 | Stats map[string][]uint64
|
---|
27 | Filename string
|
---|
28 | }
|
---|
29 |
|
---|
30 | // NetStat retrieves stats from `/proc/net/stat/`.
|
---|
31 | func (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 | file, err := os.Open(filePath)
|
---|
41 | if err != nil {
|
---|
42 | return nil, err
|
---|
43 | }
|
---|
44 |
|
---|
45 | netStatFile := NetStat{
|
---|
46 | Filename: filepath.Base(filePath),
|
---|
47 | Stats: make(map[string][]uint64),
|
---|
48 | }
|
---|
49 | scanner := bufio.NewScanner(file)
|
---|
50 | scanner.Scan()
|
---|
51 | // First string is always a header for stats
|
---|
52 | var headers []string
|
---|
53 | headers = append(headers, strings.Fields(scanner.Text())...)
|
---|
54 |
|
---|
55 | // Other strings represent per-CPU counters
|
---|
56 | for scanner.Scan() {
|
---|
57 | for num, counter := range strings.Fields(scanner.Text()) {
|
---|
58 | value, err := strconv.ParseUint(counter, 16, 64)
|
---|
59 | if err != nil {
|
---|
60 | return nil, err
|
---|
61 | }
|
---|
62 | netStatFile.Stats[headers[num]] = append(netStatFile.Stats[headers[num]], value)
|
---|
63 | }
|
---|
64 | }
|
---|
65 | netStatsTotal = append(netStatsTotal, netStatFile)
|
---|
66 | }
|
---|
67 | return netStatsTotal, nil
|
---|
68 | }
|
---|