Skip to content

Revert dup cpu frequency, add node_cpufreq flag - #3795

Open
rtreffer wants to merge 1 commit into
prometheus:masterfrom
rtreffer:cpufreq-prefix-flag
Open

Revert dup cpu frequency, add node_cpufreq flag#3795
rtreffer wants to merge 1 commit into
prometheus:masterfrom
rtreffer:cpufreq-prefix-flag

Conversation

@rtreffer

Copy link
Copy Markdown
Contributor

Both cpu_linux and cpufreq export cpu frequencies under the same name. This makes the metric mutually exclusive.

A previous PR made it possible to enable both which can cause flapping help texts.

This PR re-introduces mutual-exclusive behavior for the frequencies. A new flag collector.cpufreq.enable-cpufreq-prefix can be used to migrate all cpufreq metrics to node_cpufreq to avoid the collision.

Signed-off-by: René Treffer <treffer@measite.de>

See #3689

Reviewers

AI disclosure: This was written with Claude/Fable.
I did a pass over the outcome (this is under my name).
I couldn't find anything obviously wrong. I would like to highlight a few pieces though....

New flag:

      --[no-]collector.cpufreq.enable-cpufreq-prefix  
                                 Expose cpufreq metrics with the node_cpufreq_
                                 prefix instead of node_cpu_. This avoids a
                                 metric name collision with the cpu collector
                                 and will be the default behavior in 2.x.

This promises a future behavior change. Please check if this is the intended direction.
It might be worth a CHANGELOG entry, too.

The descs pattern used to generalize over the prefix switch is rather unique.
Other collectors use descs or metricDescs as well, but often in an untyped way.
Typed + constructor time looks like a decent trade-off in this context but I would be happy to change it for a more simplistic or different approach.

Code snippets:

type cpuFreqDescs struct {
	hertz           *prometheus.Desc
	avgHertz        *prometheus.Desc
	minHertz        *prometheus.Desc
	maxHertz        *prometheus.Desc
...
}

func newCPUFreqDescs() cpuFreqDescs {
	subsystem := cpuCollectorSubsystem
	if *useCPUFreqPrefix {
		subsystem = cpuFreqCollectorSubsystem
	}
	return cpuFreqDescs{
		hertz: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, subsystem, "frequency_hertz"),
			"Current CPU thread frequency in hertz.",
			[]string{"cpu"}, nil,
		),
....
}

...
	return &cpuFreqCollector{
		fs:     fs,
		descs:  newCPUFreqDescs(),
		logger: logger,
	}, ...

This all leads to a very neat diff in the end:

		if stats.CpuinfoMinimumFrequency != nil {
			ch <- prometheus.MustNewConstMetric(
-				cpuFreqMinDesc,
+				c.descs.minHertz,
				prometheus.GaugeValue,
				float64(*stats.CpuinfoMinimumFrequency)*1000.0,
				stats.Name,
			)
		}

Both cpu_linux and cpufreq export cpu frequencies under the same name.
This makes the metric mutually exclusive.

A previous PR made it possible to enable both which can cause flapping
help texts.

This PR re-introduces mutual-exclusive behavior for the frequencies.
A new flag `collector.cpufreq.enable-cpufreq-prefix` can be used to
migrate all cpufreq metrics to node_cpufreq to avoid the collision.

Signed-off-by: René Treffer <treffer@measite.de>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant