From 30fdddac62426a893b4292e5d207fb0220609f72 Mon Sep 17 00:00:00 2001 From: Julian Jeggle Date: Thu, 23 Jul 2026 15:44:25 +0200 Subject: [PATCH] cpufreq_linux: fix race with cpu_linux collector for node_cpu_frequency_hertz metric Signed-off-by: Julian Jeggle --- collector/cpu_linux.go | 19 +++++++------------ collector/cpufreq_linux.go | 13 ++++++++++++- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/collector/cpu_linux.go b/collector/cpu_linux.go index f7b0c3ef1f..e08e252e79 100644 --- a/collector/cpu_linux.go +++ b/collector/cpu_linux.go @@ -219,18 +219,13 @@ func (c *cpuCollector) updateInfo(ch chan<- prometheus.Metric) error { cpu.CacheSize) } - cpuFreqEnabled, ok := collectorState["cpufreq"] - if !ok || cpuFreqEnabled == nil { - c.logger.Debug("cpufreq key missing or nil value in collectorState map") - } else if *cpuFreqEnabled { - for _, cpu := range info { - ch <- prometheus.MustNewConstMetric(c.cpuFrequencyHz, - prometheus.GaugeValue, - cpu.CPUMHz*1e6, - cpu.PhysicalID, - cpu.CoreID, - strconv.Itoa(int(cpu.Processor))) - } + for _, cpu := range info { + ch <- prometheus.MustNewConstMetric(c.cpuFrequencyHz, + prometheus.GaugeValue, + cpu.CPUMHz*1e6, + cpu.PhysicalID, + cpu.CoreID, + strconv.Itoa(int(cpu.Processor))) } if len(info) != 0 { diff --git a/collector/cpufreq_linux.go b/collector/cpufreq_linux.go index fbefdcf899..b5fb0f1251 100644 --- a/collector/cpufreq_linux.go +++ b/collector/cpufreq_linux.go @@ -53,10 +53,21 @@ func (c *cpuFreqCollector) Update(ch chan<- prometheus.Metric) error { return err } + // The current frequency metric is also provided by the cpuinfo-based collector. + // If that collector is enabled and set to provide frequency information, + // we skip this metric here (otherwise the two collectors would race for it) + cpuCollectorEnabled, ok := collectorState["cpu"] + skipCurrentFreq := false + if !ok || cpuCollectorEnabled == nil { + c.logger.Debug("cpu key missing or nil value in collectorState map") + } else { + skipCurrentFreq = *cpuCollectorEnabled && *enableCPUInfo + } + // sysfs cpufreq values are kHz, thus multiply by 1000 to export base units (hz). // See https://www.kernel.org/doc/Documentation/cpu-freq/user-guide.txt for _, stats := range cpuFreqs { - if stats.CpuinfoCurrentFrequency != nil { + if stats.CpuinfoCurrentFrequency != nil && !skipCurrentFreq { ch <- prometheus.MustNewConstMetric( cpuFreqHertzDesc, prometheus.GaugeValue,