Merge pull request #2267 from bison/netdev-lock

netdev_common: Add mutex around metricDescs access
pull/2327/head
Ben Kochie 2022-03-22 04:27:37 -07:00 committed by GitHub
commit 086fdfed24
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 23 additions and 14 deletions

View File

@ -22,6 +22,7 @@ import (
"fmt" "fmt"
"net" "net"
"strconv" "strconv"
"sync"
"github.com/go-kit/log" "github.com/go-kit/log"
"github.com/go-kit/log/level" "github.com/go-kit/log/level"
@ -38,10 +39,11 @@ var (
) )
type netDevCollector struct { type netDevCollector struct {
subsystem string subsystem string
deviceFilter netDevFilter deviceFilter netDevFilter
metricDescs map[string]*prometheus.Desc metricDescsMutex sync.Mutex
logger log.Logger metricDescs map[string]*prometheus.Desc
logger log.Logger
} }
type netDevStats map[string]map[string]uint64 type netDevStats map[string]map[string]uint64
@ -90,6 +92,22 @@ func NewNetDevCollector(logger log.Logger) (Collector, error) {
}, nil }, nil
} }
func (c *netDevCollector) metricDesc(key string) *prometheus.Desc {
c.metricDescsMutex.Lock()
defer c.metricDescsMutex.Unlock()
if _, ok := c.metricDescs[key]; !ok {
c.metricDescs[key] = prometheus.NewDesc(
prometheus.BuildFQName(namespace, c.subsystem, key+"_total"),
fmt.Sprintf("Network device statistic %s.", key),
[]string{"device"},
nil,
)
}
return c.metricDescs[key]
}
func (c *netDevCollector) Update(ch chan<- prometheus.Metric) error { func (c *netDevCollector) Update(ch chan<- prometheus.Metric) error {
netDev, err := getNetDevStats(&c.deviceFilter, c.logger) netDev, err := getNetDevStats(&c.deviceFilter, c.logger)
if err != nil { if err != nil {
@ -97,16 +115,7 @@ func (c *netDevCollector) Update(ch chan<- prometheus.Metric) error {
} }
for dev, devStats := range netDev { for dev, devStats := range netDev {
for key, value := range devStats { for key, value := range devStats {
desc, ok := c.metricDescs[key] desc := c.metricDesc(key)
if !ok {
desc = prometheus.NewDesc(
prometheus.BuildFQName(namespace, c.subsystem, key+"_total"),
fmt.Sprintf("Network device statistic %s.", key),
[]string{"device"},
nil,
)
c.metricDescs[key] = desc
}
ch <- prometheus.MustNewConstMetric(desc, prometheus.CounterValue, float64(value), dev) ch <- prometheus.MustNewConstMetric(desc, prometheus.CounterValue, float64(value), dev)
} }
} }