From 66c4826b4b497574777e7f31f5611efde3b62a8b Mon Sep 17 00:00:00 2001 From: Joe Stringer Date: Thu, 7 Nov 2024 17:06:36 -0800 Subject: [PATCH] hubble: Lock exporters while gathering metrics This code seems to access a variable without holding a lock, when that variable can be modified at runtime by other logic. Add locking to avoid weird and wonderful race conditions. Found by code inspection. Signed-off-by: Joe Stringer --- pkg/hubble/exporter/metrics.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/hubble/exporter/metrics.go b/pkg/hubble/exporter/metrics.go index 861f56a0f343b..280a428067e05 100644 --- a/pkg/hubble/exporter/metrics.go +++ b/pkg/hubble/exporter/metrics.go @@ -82,6 +82,7 @@ func (d *dynamicExporterGaugeCollector) Describe(ch chan<- *prometheus.Desc) { func (d *dynamicExporterGaugeCollector) Collect(ch chan<- prometheus.Metric) { var activeExporters, inactiveExporters float64 + d.exporter.mutex.RLock() for name, me := range d.exporter.managedExporters { var value float64 if me.config.End == nil || me.config.End.After(time.Now()) { @@ -94,6 +95,7 @@ func (d *dynamicExporterGaugeCollector) Collect(ch chan<- prometheus.Metric) { individualExportersDesc, prometheus.GaugeValue, value, name, ) } + d.exporter.mutex.RUnlock() ch <- prometheus.MustNewConstMetric( exportersDesc, prometheus.GaugeValue, activeExporters, "active",