Skip to content

Commit d342215

Browse files
committed
Avoid new CPU logical metadata attribute
Use the existing cpu metadata attribute as opt-in instead of introducing cpu.logical_number. Add a changelog entry with config to restore per-CPU output and update frequency tests for the shared opt-in CPU attribute. Assisted-by: GPT-5
1 parent eaa6188 commit d342215

9 files changed

Lines changed: 87 additions & 47 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
change_type: breaking
2+
component: receiver/host_metrics
3+
note: Make the `cpu` attribute opt-in for hostmetrics CPU scraper metrics.
4+
issues: [49161]
5+
subtext: |
6+
By default, `system.cpu.time` and `system.cpu.utilization` are now aggregated across logical CPUs and no longer include the `cpu` attribute.
7+
To restore the previous per-logical-CPU output, configure:
8+
```yaml
9+
receivers:
10+
hostmetrics:
11+
scrapers:
12+
cpu:
13+
metrics:
14+
system.cpu.time:
15+
attributes: [cpu, state]
16+
system.cpu.utilization:
17+
attributes: [cpu, state]
18+
```
19+
If `system.cpu.frequency` is enabled and the per-CPU label is required, also configure:
20+
```yaml
21+
receivers:
22+
hostmetrics:
23+
scrapers:
24+
cpu:
25+
metrics:
26+
system.cpu.frequency:
27+
attributes: [cpu]
28+
```
29+
change_logs: [user]

receiver/hostmetricsreceiver/internal/scraper/cpuscraper/cpu_scraper_linux_test.go

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,25 @@ import (
2020

2121
func TestScrape_CpuFrequency(t *testing.T) {
2222
type testCase struct {
23-
name string
24-
enabledFrequency bool
23+
name string
24+
enabledFrequency bool
25+
enabledAttributes []metadata.SystemCPUFrequencyMetricAttributeKey
26+
expectCPUAttr bool
2527
}
2628

2729
testCases := []testCase{
2830
{
2931
name: "System CPU Frequency enabled",
3032
enabledFrequency: true,
3133
},
34+
{
35+
name: "System CPU Frequency enabled with CPU attribute",
36+
enabledFrequency: true,
37+
enabledAttributes: []metadata.SystemCPUFrequencyMetricAttributeKey{
38+
metadata.SystemCPUFrequencyMetricAttributeKeyCPU,
39+
},
40+
expectCPUAttr: true,
41+
},
3242
{
3343
name: "System CPU Frequency disabled",
3444
enabledFrequency: false,
@@ -42,6 +52,7 @@ func TestScrape_CpuFrequency(t *testing.T) {
4252
cfg := metadata.NewDefaultMetricsBuilderConfig()
4353
cfg.Metrics.SystemCPUTime.Enabled = false
4454
cfg.Metrics.SystemCPUFrequency.Enabled = test.enabledFrequency
55+
cfg.Metrics.SystemCPUFrequency.EnabledAttributes = test.enabledAttributes
4556

4657
scraper := newCPUScraper(t.Context(), scrapertest.NewNopSettings(metadata.Type),
4758
&Config{MetricsBuilderConfig: cfg})
@@ -66,12 +77,12 @@ func TestScrape_CpuFrequency(t *testing.T) {
6677

6778
metrics := md.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics()
6879
metric := metrics.At(0)
69-
assertCPUFrequencyMetricValid(t, metric)
80+
assertCPUFrequencyMetricValid(t, metric, test.expectCPUAttr)
7081
})
7182
}
7283
}
7384

74-
func assertCPUFrequencyMetricValid(t *testing.T, metric pmetric.Metric) {
85+
func assertCPUFrequencyMetricValid(t *testing.T, metric pmetric.Metric, expectCPUAttr bool) {
7586
expected := pmetric.NewMetric()
7687
expected.SetName("system.cpu.frequency")
7788
expected.SetDescription("Current frequency of the CPU core in Hz.")
@@ -80,15 +91,24 @@ func assertCPUFrequencyMetricValid(t *testing.T, metric pmetric.Metric) {
8091
internal.AssertDescriptorEqual(t, expected, metric)
8192

8293
numCPUs := runtime.NumCPU()
83-
require.GreaterOrEqual(t, metric.Gauge().DataPoints().Len(), numCPUs,
84-
"Should have at least one frequency data point per CPU")
94+
if expectCPUAttr {
95+
require.GreaterOrEqual(t, metric.Gauge().DataPoints().Len(), numCPUs,
96+
"Should have at least one frequency data point per CPU")
97+
} else {
98+
require.Equal(t, 1, metric.Gauge().DataPoints().Len(),
99+
"Should aggregate frequency data points across CPUs by default")
100+
}
85101

86102
if metric.Gauge().DataPoints().Len() > 0 {
87103
dp := metric.Gauge().DataPoints().At(0)
88104

89105
cpuAttr, exists := dp.Attributes().Get("cpu")
90-
require.True(t, exists, "Data point should have 'cpu' attribute")
91-
require.Contains(t, cpuAttr.Str(), "cpu", "CPU attribute should contain 'cpu' prefix")
106+
if expectCPUAttr {
107+
require.True(t, exists, "Data point should have 'cpu' attribute")
108+
require.Contains(t, cpuAttr.Str(), "cpu", "CPU attribute should contain 'cpu' prefix")
109+
} else {
110+
require.False(t, exists, "Data point should not have 'cpu' attribute by default")
111+
}
92112

93113
require.GreaterOrEqual(t, dp.DoubleValue(), 0.0, "CPU frequency should be non-negative")
94114
}

receiver/hostmetricsreceiver/internal/scraper/cpuscraper/cpu_scraper_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ func TestScrape_CPUTimeAttributeConfiguration(t *testing.T) {
355355
metricsConfig: func() metadata.MetricsBuilderConfig {
356356
cfg := metadata.NewDefaultMetricsBuilderConfig()
357357
cfg.Metrics.SystemCPUTime.EnabledAttributes = []metadata.SystemCPUTimeMetricAttributeKey{
358-
metadata.SystemCPUTimeMetricAttributeKeyCPULogicalNumber,
358+
metadata.SystemCPUTimeMetricAttributeKeyCPU,
359359
metadata.SystemCPUTimeMetricAttributeKeyState,
360360
}
361361
return cfg
@@ -460,7 +460,7 @@ func TestScrape_CpuUtilizationStandard(t *testing.T) {
460460
cfg.Metrics.SystemCPUUtilization.Enabled = true
461461
cfg.Metrics.SystemCPUTime.Enabled = false
462462
cfg.Metrics.SystemCPUUtilization.EnabledAttributes = []metadata.SystemCPUUtilizationMetricAttributeKey{
463-
metadata.SystemCPUUtilizationMetricAttributeKeyCPULogicalNumber,
463+
metadata.SystemCPUUtilizationMetricAttributeKeyCPU,
464464
metadata.SystemCPUUtilizationMetricAttributeKeyState,
465465
}
466466
return cfg

receiver/hostmetricsreceiver/internal/scraper/cpuscraper/documentation.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ Current frequency of the CPU core in Hz.
4949
5050
| Name | Description | Values | Requirement Level | Semantic Convention |
5151
| ---- | ----------- | ------ | ----------------- | ------------------- |
52-
| cpu | Logical CPU number starting at 0. | Any Str | Recommended | - |
52+
| cpu | Logical CPU number starting at 0. | Any Str | Opt-In | - |
5353
5454
### system.cpu.logical.count
5555

receiver/hostmetricsreceiver/internal/scraper/cpuscraper/internal/metadata/generated_config.go

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receiver/hostmetricsreceiver/internal/scraper/cpuscraper/internal/metadata/generated_config_test.go

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receiver/hostmetricsreceiver/internal/scraper/cpuscraper/internal/metadata/generated_metrics.go

Lines changed: 10 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receiver/hostmetricsreceiver/internal/scraper/cpuscraper/internal/metadata/generated_metrics_test.go

Lines changed: 4 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

receiver/hostmetricsreceiver/internal/scraper/cpuscraper/metadata.yaml

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,6 @@ sem_conv_version: 1.9.0
1212

1313
attributes:
1414
cpu:
15-
description: Logical CPU number starting at 0.
16-
type: string
17-
requirement_level: recommended
18-
19-
cpu.logical_number:
20-
name_override: cpu
2115
description: Logical CPU number starting at 0.
2216
type: string
2317
requirement_level: opt_in
@@ -67,7 +61,7 @@ metrics:
6761
value_type: double
6862
aggregation_temporality: cumulative
6963
monotonic: true
70-
attributes: [cpu.logical_number, state]
64+
attributes: [cpu, state]
7165

7266
system.cpu.utilization:
7367
enabled: false
@@ -76,4 +70,4 @@ metrics:
7670
stability: development
7771
gauge:
7872
value_type: double
79-
attributes: [cpu.logical_number, state]
73+
attributes: [cpu, state]

0 commit comments

Comments
 (0)