This commit is contained in:
Aldin Setiawan 2025-08-18 21:10:13 +08:00 committed by GitHub
commit f03f1540bb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 56 additions and 14 deletions

View file

@ -22,16 +22,22 @@ import (
"log/slog" "log/slog"
"os" "os"
"path/filepath" "path/filepath"
"strconv"
"strings" "strings"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
) )
type bondingCollector struct { type bondingCollector struct {
slaves, active typedDesc slaves, active, miimon typedDesc
logger *slog.Logger logger *slog.Logger
} }
type bondingStats struct {
name string
slaves, active, miimon int
}
func init() { func init() {
registerCollector("bonding", defaultEnabled, NewBondingCollector) registerCollector("bonding", defaultEnabled, NewBondingCollector)
} }
@ -50,6 +56,11 @@ func NewBondingCollector(logger *slog.Logger) (Collector, error) {
"Number of active slaves per bonding interface.", "Number of active slaves per bonding interface.",
[]string{"master"}, nil, []string{"master"}, nil,
), prometheus.GaugeValue}, ), prometheus.GaugeValue},
miimon: typedDesc{prometheus.NewDesc(
prometheus.BuildFQName(namespace, "bonding", "miimon"),
"MII link monitoring frequency in milliseconds.",
[]string{"master"}, nil,
), prometheus.GaugeValue},
logger: logger, logger: logger,
}, nil }, nil
} }
@ -65,15 +76,16 @@ func (c *bondingCollector) Update(ch chan<- prometheus.Metric) error {
} }
return err return err
} }
for master, status := range bondingStats { for _, bond := range bondingStats {
ch <- c.slaves.mustNewConstMetric(float64(status[0]), master) ch <- c.slaves.mustNewConstMetric(float64(bond.slaves), bond.name)
ch <- c.active.mustNewConstMetric(float64(status[1]), master) ch <- c.active.mustNewConstMetric(float64(bond.active), bond.name)
ch <- c.miimon.mustNewConstMetric(float64(bond.miimon), bond.name)
} }
return nil return nil
} }
func readBondingStats(root string) (status map[string][2]int, err error) { func readBondingStats(root string) (status []bondingStats, err error) {
status = map[string][2]int{} status = []bondingStats{}
masters, err := os.ReadFile(filepath.Join(root, "bonding_masters")) masters, err := os.ReadFile(filepath.Join(root, "bonding_masters"))
if err != nil { if err != nil {
return nil, err return nil, err
@ -98,7 +110,22 @@ func readBondingStats(root string) (status map[string][2]int, err error) {
sstat[1]++ sstat[1]++
} }
} }
status[master] = sstat
miimon, err := os.ReadFile(filepath.Join(root, master, "bonding", "miimon"))
if err != nil {
return nil, err
}
intMiimon, err := strconv.Atoi(strings.TrimSpace(string(miimon)))
if err != nil {
return nil, err
}
status = append(status, bondingStats{
name: master,
slaves: sstat[0],
active: sstat[1],
miimon: intMiimon,
})
} }
return status, err return status, err
} }

View file

@ -25,15 +25,15 @@ func TestBonding(t *testing.T) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
if bondingStats["bond0"][0] != 0 || bondingStats["bond0"][1] != 0 { if bondingStats[0].name != "bond0" || bondingStats[0].slaves != 0 || bondingStats[0].active != 0 || bondingStats[0].miimon != 100 {
t.Fatal("bond0 in unexpected state") t.Fatal("bond0 in unexpected state")
} }
if bondingStats["int"][0] != 2 || bondingStats["int"][1] != 1 { if bondingStats[1].name != "dmz" || bondingStats[1].slaves != 2 || bondingStats[1].active != 2 || bondingStats[1].miimon != 0 {
t.Fatal("int in unexpected state")
}
if bondingStats["dmz"][0] != 2 || bondingStats["dmz"][1] != 2 {
t.Fatal("dmz in unexpected state") t.Fatal("dmz in unexpected state")
} }
if bondingStats[2].name != "int" || bondingStats[2].slaves != 2 || bondingStats[2].active != 1 || bondingStats[2].miimon != 200 {
t.Fatal("int in unexpected state")
}
} }

View file

@ -1723,6 +1723,11 @@ Path: sys/class/net/bond0/bonding/slaves
Lines: 0 Lines: 0
Mode: 644 Mode: 644
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/class/net/bond0/bonding/miimon
Lines: 1
100
Mode: 644
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/class/net/bond0/broadcast Path: sys/class/net/bond0/broadcast
Lines: 1 Lines: 1
ff:ff:ff:ff:ff:ff ff:ff:ff:ff:ff:ff
@ -1865,6 +1870,11 @@ Lines: 1
eth0 eth4 eth0 eth4
Mode: 644 Mode: 644
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/class/net/dmz/bonding/miimon
Lines: 1
0
Mode: 644
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/class/net/dmz/broadcast Path: sys/class/net/dmz/broadcast
Lines: 1 Lines: 1
ff:ff:ff:ff:ff:ff ff:ff:ff:ff:ff:ff
@ -2037,6 +2047,11 @@ Lines: 1
eth5 eth1 eth5 eth1
Mode: 644 Mode: 644
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/class/net/int/bonding/miimon
Lines: 1
200
Mode: 644
# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Path: sys/class/net/int/broadcast Path: sys/class/net/int/broadcast
Lines: 1 Lines: 1
ff:ff:ff:ff:ff:ff ff:ff:ff:ff:ff:ff