Skip to content

Commit 56b8a6d

Browse files
committed
Add Miimon metrics
1 parent 38d32a3 commit 56b8a6d

File tree

1 file changed

+43
-2
lines changed

1 file changed

+43
-2
lines changed

collector/bonding_linux.go

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ import (
2222
"log/slog"
2323
"os"
2424
"path/filepath"
25+
"strconv"
2526
"strings"
2627

2728
"github.com/prometheus/client_golang/prometheus"
2829
)
2930

3031
type bondingCollector struct {
31-
slaves, active typedDesc
32-
logger *slog.Logger
32+
slaves, active, miimon typedDesc
33+
logger *slog.Logger
3334
}
3435

3536
func init() {
@@ -50,6 +51,11 @@ func NewBondingCollector(logger *slog.Logger) (Collector, error) {
5051
"Number of active slaves per bonding interface.",
5152
[]string{"master"}, nil,
5253
), prometheus.GaugeValue},
54+
miimon: typedDesc{prometheus.NewDesc(
55+
prometheus.BuildFQName(namespace, "bonding", "miimon"),
56+
"MII link monitoring frequency in milliseconds.",
57+
[]string{"master"}, nil,
58+
), prometheus.GaugeValue},
5359
logger: logger,
5460
}, nil
5561
}
@@ -69,6 +75,18 @@ func (c *bondingCollector) Update(ch chan<- prometheus.Metric) error {
6975
ch <- c.slaves.mustNewConstMetric(float64(status[0]), master)
7076
ch <- c.active.mustNewConstMetric(float64(status[1]), master)
7177
}
78+
79+
bondingMiimon, err := readBondingMiimon(statusfile)
80+
if err != nil {
81+
if errors.Is(err, os.ErrNotExist) {
82+
c.logger.Debug("Not collecting bonding, file does not exist", "file", statusfile)
83+
return ErrNoData
84+
}
85+
return err
86+
}
87+
for bond, miimon := range bondingMiimon {
88+
ch <- c.miimon.mustNewConstMetric(float64(miimon), bond)
89+
}
7290
return nil
7391
}
7492

@@ -102,3 +120,26 @@ func readBondingStats(root string) (status map[string][2]int, err error) {
102120
}
103121
return status, err
104122
}
123+
124+
func readBondingMiimon(root string) (status map[string]int, err error) {
125+
status = map[string]int{}
126+
masters, err := os.ReadFile(filepath.Join(root, "bonding_masters"))
127+
if err != nil {
128+
return nil, err
129+
}
130+
131+
for _, master := range strings.Fields(string(masters)) {
132+
miimon, err := os.ReadFile(filepath.Join(root, master, "bonding", "miimon"))
133+
if err != nil {
134+
return nil, err
135+
}
136+
137+
intMiimon, err := strconv.Atoi(strings.TrimSpace(string(miimon)))
138+
if err != nil {
139+
return nil, err
140+
}
141+
142+
status[master] = intMiimon
143+
}
144+
return status, err
145+
}

0 commit comments

Comments
 (0)