Skip to content

Commit 322c35d

Browse files
Remove report per cpu config option & cleanup tests (#1326)
1 parent e54f55d commit 322c35d

File tree

8 files changed

+68
-90
lines changed

8 files changed

+68
-90
lines changed

receiver/hostmetricsreceiver/config_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal/scraper/loadscraper"
3333
"go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal/scraper/memoryscraper"
3434
"go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal/scraper/networkscraper"
35+
"go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal/scraper/processesscraper"
3536
"go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal/scraper/processscraper"
3637
"go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal/scraper/swapscraper"
3738
)
@@ -65,21 +66,20 @@ func TestLoadConfig(t *testing.T) {
6566
},
6667
CollectionInterval: 30 * time.Second,
6768
Scrapers: map[string]internal.Config{
68-
cpuscraper.TypeStr: &cpuscraper.Config{
69-
ReportPerCPU: true,
70-
},
69+
cpuscraper.TypeStr: &cpuscraper.Config{},
7170
diskscraper.TypeStr: &diskscraper.Config{},
7271
loadscraper.TypeStr: &loadscraper.Config{},
7372
filesystemscraper.TypeStr: &filesystemscraper.Config{},
7473
memoryscraper.TypeStr: &memoryscraper.Config{},
7574
networkscraper.TypeStr: &networkscraper.Config{},
75+
processesscraper.TypeStr: &processesscraper.Config{},
76+
swapscraper.TypeStr: &swapscraper.Config{},
7677
processscraper.TypeStr: &processscraper.Config{
7778
Include: processscraper.MatchConfig{
7879
Names: []string{"test1", "test2"},
7980
Config: filterset.Config{MatchType: "regexp"},
8081
},
8182
},
82-
swapscraper.TypeStr: &swapscraper.Config{},
8383
},
8484
}
8585

receiver/hostmetricsreceiver/hostmetrics_receiver_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func TestGatherMetrics_EndToEnd(t *testing.T) {
9595
config := &Config{
9696
CollectionInterval: 100 * time.Millisecond,
9797
Scrapers: map[string]internal.Config{
98-
cpuscraper.TypeStr: &cpuscraper.Config{ReportPerCPU: true},
98+
cpuscraper.TypeStr: &cpuscraper.Config{},
9999
diskscraper.TypeStr: &diskscraper.Config{},
100100
filesystemscraper.TypeStr: &filesystemscraper.Config{},
101101
loadscraper.TypeStr: &loadscraper.Config{},
@@ -323,7 +323,7 @@ func Benchmark_ScrapeSwapMetrics(b *testing.B) {
323323
benchmarkScrapeMetrics(b, cfg)
324324
}
325325

326-
func Benchmark_ScrapeDefaultMetrics(b *testing.B) {
326+
func Benchmark_ScrapeSystemMetrics(b *testing.B) {
327327
cfg := &Config{
328328
Scrapers: map[string]internal.Config{
329329
cpuscraper.TypeStr: (&cpuscraper.Factory{}).CreateDefaultConfig(),
@@ -340,10 +340,10 @@ func Benchmark_ScrapeDefaultMetrics(b *testing.B) {
340340
benchmarkScrapeMetrics(b, cfg)
341341
}
342342

343-
func Benchmark_ScrapeAllMetrics(b *testing.B) {
343+
func Benchmark_ScrapeSystemAndProcessMetrics(b *testing.B) {
344344
cfg := &Config{
345345
Scrapers: map[string]internal.Config{
346-
cpuscraper.TypeStr: &cpuscraper.Config{ReportPerCPU: true},
346+
cpuscraper.TypeStr: &cpuscraper.Config{},
347347
diskscraper.TypeStr: &diskscraper.Config{},
348348
filesystemscraper.TypeStr: &filesystemscraper.Config{},
349349
loadscraper.TypeStr: &loadscraper.Config{},

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,4 @@ import "go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal"
1919
// Config relating to CPU Metric Scraper.
2020
type Config struct {
2121
internal.ConfigSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct
22-
23-
// If `true`, stats will be generated for the system as a whole _as well
24-
// as_ for each individual CPU/core in the system and will be distinguished
25-
// by the `cpu` dimension. If `false`, stats will only be generated for
26-
// the system as a whole that will not include a `cpu` dimension.
27-
ReportPerCPU bool `mapstructure:"report_per_cpu"`
2822
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,14 @@ import (
2828
type scraper struct {
2929
config *Config
3030
startTime pdata.TimestampUnixNano
31+
32+
// for mocking gopsutil cpu.Times
33+
times func(bool) ([]cpu.TimesStat, error)
3134
}
3235

3336
// newCPUScraper creates a set of CPU related metrics
3437
func newCPUScraper(_ context.Context, cfg *Config) *scraper {
35-
return &scraper{config: cfg}
38+
return &scraper{config: cfg, times: cpu.Times}
3639
}
3740

3841
// Initialize
@@ -55,7 +58,7 @@ func (s *scraper) Close(_ context.Context) error {
5558
func (s *scraper) ScrapeMetrics(_ context.Context) (pdata.MetricSlice, error) {
5659
metrics := pdata.NewMetricSlice()
5760

58-
cpuTimes, err := cpu.Times(s.config.ReportPerCPU)
61+
cpuTimes, err := s.times( /*percpu=*/ true)
5962
if err != nil {
6063
return metrics, err
6164
}

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

Lines changed: 54 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -16,86 +16,78 @@ package cpuscraper
1616

1717
import (
1818
"context"
19+
"errors"
1920
"runtime"
2021
"testing"
2122

23+
"github.com/shirou/gopsutil/cpu"
2224
"github.com/stretchr/testify/assert"
2325
"github.com/stretchr/testify/require"
2426

2527
"go.opentelemetry.io/collector/consumer/pdata"
2628
"go.opentelemetry.io/collector/receiver/hostmetricsreceiver/internal"
2729
)
2830

29-
type validationFn func(*testing.T, pdata.MetricSlice)
31+
func TestScrapeMetrics(t *testing.T) {
32+
type testCase struct {
33+
name string
34+
timesFunc func(bool) ([]cpu.TimesStat, error)
35+
expectedErr string
36+
}
3037

31-
func TestScrapeMetrics_MinimalData(t *testing.T) {
32-
createScraperAndValidateScrapedMetrics(t, &Config{}, func(t *testing.T, metrics pdata.MetricSlice) {
33-
// expect 1 metric
34-
assert.Equal(t, 1, metrics.Len())
38+
testCases := []testCase{
39+
{
40+
name: "Standard",
41+
},
42+
{
43+
name: "Error",
44+
timesFunc: func(bool) ([]cpu.TimesStat, error) { return nil, errors.New("err1") },
45+
expectedErr: "err1",
46+
},
47+
}
3548

36-
// for cpu seconds metric, expect a datapoint for each state label, including at least 4 standard states
37-
cpuTimeMetric := metrics.At(0)
38-
internal.AssertDescriptorEqual(t, cpuTimeDescriptor, cpuTimeMetric.MetricDescriptor())
39-
assert.GreaterOrEqual(t, cpuTimeMetric.DoubleDataPoints().Len(), 4)
40-
internal.AssertDoubleMetricLabelDoesNotExist(t, cpuTimeMetric, 0, cpuLabelName)
41-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 0, stateLabelName, userStateLabelValue)
42-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 1, stateLabelName, systemStateLabelValue)
43-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 2, stateLabelName, idleStateLabelValue)
44-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 3, stateLabelName, interruptStateLabelValue)
45-
})
46-
}
49+
for _, test := range testCases {
50+
t.Run(test.name, func(t *testing.T) {
51+
scraper := newCPUScraper(context.Background(), &Config{})
52+
if test.timesFunc != nil {
53+
scraper.times = test.timesFunc
54+
}
4755

48-
func TestScrapeMetrics_AllData(t *testing.T) {
49-
config := &Config{
50-
ReportPerCPU: true,
51-
}
56+
err := scraper.Initialize(context.Background())
57+
require.NoError(t, err, "Failed to initialize cpu scraper: %v", err)
58+
defer func() { assert.NoError(t, scraper.Close(context.Background())) }()
5259

53-
createScraperAndValidateScrapedMetrics(t, config, func(t *testing.T, metrics pdata.MetricSlice) {
54-
// expect 1 metric
55-
assert.Equal(t, 1, metrics.Len())
60+
metrics, err := scraper.ScrapeMetrics(context.Background())
61+
if test.expectedErr != "" {
62+
assert.EqualError(t, err, test.expectedErr)
63+
return
64+
}
65+
require.NoError(t, err, "Failed to scrape metrics: %v", err)
5666

57-
// for cpu seconds metric, expect a datapoint for each state label & core combination with at least 4 standard states
58-
cpuTimeMetric := metrics.At(0)
59-
internal.AssertDescriptorEqual(t, cpuTimeDescriptor, cpuTimeMetric.MetricDescriptor())
60-
assert.GreaterOrEqual(t, cpuTimeMetric.DoubleDataPoints().Len(), runtime.NumCPU()*4)
61-
internal.AssertDoubleMetricLabelExists(t, cpuTimeMetric, 0, cpuLabelName)
62-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 0, stateLabelName, userStateLabelValue)
63-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 1, stateLabelName, systemStateLabelValue)
64-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 2, stateLabelName, idleStateLabelValue)
65-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 3, stateLabelName, interruptStateLabelValue)
66-
})
67-
}
67+
assert.Equal(t, 1, metrics.Len())
6868

69-
func TestScrapeMetrics_Linux(t *testing.T) {
70-
if runtime.GOOS != "linux" {
71-
return
72-
}
69+
assertCPUMetricValid(t, metrics.At(0), cpuTimeDescriptor)
7370

74-
createScraperAndValidateScrapedMetrics(t, &Config{}, func(t *testing.T, metrics pdata.MetricSlice) {
75-
// for cpu seconds metric, expect a datapoint for all 8 state labels
76-
cpuTimeMetric := metrics.At(0)
77-
internal.AssertDescriptorEqual(t, cpuTimeDescriptor, cpuTimeMetric.MetricDescriptor())
78-
assert.Equal(t, 8, cpuTimeMetric.DoubleDataPoints().Len())
79-
internal.AssertDoubleMetricLabelDoesNotExist(t, cpuTimeMetric, 0, cpuLabelName)
80-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 0, stateLabelName, userStateLabelValue)
81-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 1, stateLabelName, systemStateLabelValue)
82-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 2, stateLabelName, idleStateLabelValue)
83-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 3, stateLabelName, interruptStateLabelValue)
84-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 4, stateLabelName, niceStateLabelValue)
85-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 5, stateLabelName, softIRQStateLabelValue)
86-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 6, stateLabelName, stealStateLabelValue)
87-
internal.AssertDoubleMetricLabelHasValue(t, cpuTimeMetric, 7, stateLabelName, waitStateLabelValue)
88-
})
71+
if runtime.GOOS == "linux" {
72+
assertCPUMetricHasLinuxSpecificStateLabels(t, metrics.At(0))
73+
}
74+
})
75+
}
8976
}
9077

91-
func createScraperAndValidateScrapedMetrics(t *testing.T, config *Config, assertFn validationFn) {
92-
scraper := newCPUScraper(context.Background(), config)
93-
err := scraper.Initialize(context.Background())
94-
require.NoError(t, err, "Failed to initialize cpu scraper: %v", err)
95-
defer func() { assert.NoError(t, scraper.Close(context.Background())) }()
96-
97-
metrics, err := scraper.ScrapeMetrics(context.Background())
98-
require.NoError(t, err, "Failed to scrape metrics: %v", err)
78+
func assertCPUMetricValid(t *testing.T, metric pdata.Metric, descriptor pdata.MetricDescriptor) {
79+
internal.AssertDescriptorEqual(t, descriptor, metric.MetricDescriptor())
80+
assert.GreaterOrEqual(t, metric.DoubleDataPoints().Len(), 4*runtime.NumCPU())
81+
internal.AssertDoubleMetricLabelExists(t, metric, 0, cpuLabelName)
82+
internal.AssertDoubleMetricLabelHasValue(t, metric, 0, stateLabelName, userStateLabelValue)
83+
internal.AssertDoubleMetricLabelHasValue(t, metric, 1, stateLabelName, systemStateLabelValue)
84+
internal.AssertDoubleMetricLabelHasValue(t, metric, 2, stateLabelName, idleStateLabelValue)
85+
internal.AssertDoubleMetricLabelHasValue(t, metric, 3, stateLabelName, interruptStateLabelValue)
86+
}
9987

100-
assertFn(t, metrics)
88+
func assertCPUMetricHasLinuxSpecificStateLabels(t *testing.T, metric pdata.Metric) {
89+
internal.AssertDoubleMetricLabelHasValue(t, metric, 4, stateLabelName, niceStateLabelValue)
90+
internal.AssertDoubleMetricLabelHasValue(t, metric, 5, stateLabelName, softIRQStateLabelValue)
91+
internal.AssertDoubleMetricLabelHasValue(t, metric, 6, stateLabelName, stealStateLabelValue)
92+
internal.AssertDoubleMetricLabelHasValue(t, metric, 7, stateLabelName, waitStateLabelValue)
10193
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ func TestCreateDefaultConfig(t *testing.T) {
2626
factory := &Factory{}
2727
cfg := factory.CreateDefaultConfig()
2828
assert.IsType(t, &Config{}, cfg)
29-
assert.Equal(t, false, cfg.(*Config).ReportPerCPU)
3029
}
3130

3231
func TestCreateMetricsScraper(t *testing.T) {

receiver/hostmetricsreceiver/internal/testutils.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,3 @@ func AssertDoubleMetricLabelExists(t *testing.T, metric pdata.Metric, index int,
5555
_, ok := metric.DoubleDataPoints().At(index).LabelsMap().Get(labelName)
5656
assert.Truef(t, ok, "Missing label %q in metric %q", labelName, metric.MetricDescriptor().Name())
5757
}
58-
59-
func AssertInt64MetricLabelDoesNotExist(t *testing.T, metric pdata.Metric, index int, labelName string) {
60-
_, ok := metric.Int64DataPoints().At(index).LabelsMap().Get(labelName)
61-
assert.Falsef(t, ok, "Unexpected label %q in metric %q", labelName, metric.MetricDescriptor().Name())
62-
}
63-
64-
func AssertDoubleMetricLabelDoesNotExist(t *testing.T, metric pdata.Metric, index int, labelName string) {
65-
_, ok := metric.DoubleDataPoints().At(index).LabelsMap().Get(labelName)
66-
assert.Falsef(t, ok, "Unexpected label %q in metric %q", labelName, metric.MetricDescriptor().Name())
67-
}

receiver/hostmetricsreceiver/testdata/config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ receivers:
66
collection_interval: 30s
77
scrapers:
88
cpu:
9-
report_per_cpu: true
109
disk:
1110
load:
1211
filesystem:
1312
memory:
1413
network:
14+
processes:
1515
swap:
1616
process:
1717
include:

0 commit comments

Comments
 (0)