@@ -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
3031type bondingCollector struct {
31- slaves , active typedDesc
32- logger * slog.Logger
32+ slaves , active , miimon typedDesc
33+ logger * slog.Logger
3334}
3435
3536func 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