Skip to content

Commit 696572c

Browse files
pjanottivincentfree
authored andcommitted
[chore] Add tests for scrapers using Windows perfcounters (open-telemetry#39690)
Adding tests collecting the actual Windows performance counters for scrapers using `internal/perfcounters`. The intent of these tests is to facilitate the migration from the vendored code of `internal/perfcounters` to the existing implementation in `github.com/open-telemetry/opentelemetry-collector-contrib/pkg/winperfcounters`, see open-telemetry#38858 (comment) for details.
1 parent 9ed6e4e commit 696572c

File tree

4 files changed

+133
-0
lines changed

4 files changed

+133
-0
lines changed

receiver/hostmetricsreceiver/internal/scraper/diskscraper/disk_scraper_windows_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,39 @@ import (
1616
"go.opentelemetry.io/collector/scraper/scrapererror"
1717
"go.opentelemetry.io/collector/scraper/scrapertest"
1818

19+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal"
1920
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/perfcounters"
2021
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/diskscraper/internal/metadata"
2122
)
2223

24+
// TestDiskScrapeWithRealData validates that the disk scraper can collect actual disk metrics from Windows performance counters.
25+
func TestDiskScrapeWithRealData(t *testing.T) {
26+
config := Config{
27+
MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(),
28+
}
29+
scraper, err := newDiskScraper(context.Background(), scrapertest.NewNopSettings(metadata.Type), &config)
30+
require.NoError(t, err, "Failed to create disk scraper")
31+
32+
err = scraper.start(context.Background(), componenttest.NewNopHost())
33+
require.NoError(t, err, "Failed to start the disk scraper")
34+
35+
metrics, err := scraper.scrape(context.Background())
36+
require.NoError(t, err, "Failed to scrape metrics")
37+
require.NotNil(t, metrics, "Metrics cannot be nil")
38+
39+
// Expected metric names for disk scraper. Note that these metrics are not all enabled by the default configuration.
40+
// These are the metrics collected by the Windows disk scraper.scrape.
41+
expectedMetrics := map[string]bool{
42+
"system.disk.io": false,
43+
"system.disk.io_time": false,
44+
"system.disk.operation_time": false,
45+
"system.disk.operations": false,
46+
"system.disk.pending_operations": false,
47+
}
48+
49+
internal.AssertExpectedMetrics(t, expectedMetrics, metrics)
50+
}
51+
2352
func TestScrape_Error(t *testing.T) {
2453
type testCase struct {
2554
name string

receiver/hostmetricsreceiver/internal/scraper/loadscraper/load_scraper_windows_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@ import (
1212

1313
"github.com/stretchr/testify/assert"
1414
"github.com/stretchr/testify/require"
15+
"go.opentelemetry.io/collector/component/componenttest"
16+
"go.opentelemetry.io/collector/scraper/scrapertest"
1517
"go.uber.org/zap"
1618

19+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal"
1720
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/perfcounters"
21+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/loadscraper/internal/metadata"
1822
)
1923

2024
func TestStopSamplingWithoutStart(t *testing.T) {
@@ -120,3 +124,29 @@ func Benchmark_SampleLoad(b *testing.B) {
120124
s.sampleLoad()
121125
}
122126
}
127+
128+
func TestLoadScrapeWithRealData(t *testing.T) {
129+
config := Config{
130+
MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(),
131+
}
132+
scraper := newLoadScraper(context.Background(), scrapertest.NewNopSettings(metadata.Type), &config)
133+
134+
err := scraper.start(context.Background(), componenttest.NewNopHost())
135+
require.NoError(t, err, "Failed to start the load scraper")
136+
defer func() {
137+
assert.NoError(t, scraper.shutdown(context.Background()), "Failed to shutdown the load scraper")
138+
}()
139+
140+
metrics, err := scraper.scrape(context.Background())
141+
require.NoError(t, err, "Failed to scrape metrics")
142+
require.NotNil(t, metrics, "Metrics cannot be nil")
143+
144+
// Expected metric names for load scraper
145+
expectedMetrics := map[string]bool{
146+
"system.cpu.load_average.1m": false,
147+
"system.cpu.load_average.5m": false,
148+
"system.cpu.load_average.15m": false,
149+
}
150+
151+
internal.AssertExpectedMetrics(t, expectedMetrics, metrics)
152+
}

receiver/hostmetricsreceiver/internal/scraper/pagingscraper/paging_scraper_windows_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"go.opentelemetry.io/collector/scraper/scrapererror"
1717
"go.opentelemetry.io/collector/scraper/scrapertest"
1818

19+
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal"
1920
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/perfcounters"
2021
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/hostmetricsreceiver/internal/scraper/pagingscraper/internal/metadata"
2122
)
@@ -137,6 +138,29 @@ func TestScrape_Errors(t *testing.T) {
137138
}
138139
}
139140

141+
func TestPagingScrapeWithRealData(t *testing.T) {
142+
config := Config{
143+
MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(),
144+
}
145+
scraper := newPagingScraper(context.Background(), scrapertest.NewNopSettings(metadata.Type), &config)
146+
147+
err := scraper.start(context.Background(), componenttest.NewNopHost())
148+
require.NoError(t, err, "Failed to start the paging scraper")
149+
150+
metrics, err := scraper.scrape(context.Background())
151+
require.NoError(t, err, "Failed to scrape metrics")
152+
require.NotNil(t, metrics, "Metrics cannot be nil")
153+
154+
// Expected metric names for paging scraper.
155+
// Note: the `system.paging.faults` is enabled by default, but is not being collected on Windows.
156+
expectedMetrics := map[string]bool{
157+
"system.paging.operations": false,
158+
"system.paging.usage": false,
159+
}
160+
161+
internal.AssertExpectedMetrics(t, expectedMetrics, metrics)
162+
}
163+
140164
func TestStart_Error(t *testing.T) {
141165
testCases := []struct {
142166
name string

receiver/hostmetricsreceiver/internal/testutils.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,53 @@ func AssertSameTimeStampForMetrics(t *testing.T, metrics pmetric.MetricSlice, st
7474
}
7575
}
7676
}
77+
78+
// AssertExpectedMetrics checks that metrics contains expected metrics and no other metrics.
79+
// It also checks that each expected metric has at least one data point.
80+
func AssertExpectedMetrics(t *testing.T, expectedMetrics map[string]bool, actualMetrics pmetric.Metrics) {
81+
unexpectedMetrics := map[string]bool{}
82+
83+
metricsCount := 0
84+
totalDataPointCount := 0
85+
86+
metricsSlice := actualMetrics.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics()
87+
for i := 0; i < metricsSlice.Len(); i++ {
88+
metricsCount++
89+
metricsSlice.At(i)
90+
metric := metricsSlice.At(i)
91+
switch metric.Type() {
92+
case pmetric.MetricTypeSum:
93+
totalDataPointCount += metric.Sum().DataPoints().Len()
94+
case pmetric.MetricTypeGauge:
95+
totalDataPointCount += metric.Gauge().DataPoints().Len()
96+
case pmetric.MetricTypeHistogram:
97+
totalDataPointCount += metric.Histogram().DataPoints().Len()
98+
case pmetric.MetricTypeExponentialHistogram:
99+
totalDataPointCount += metric.ExponentialHistogram().DataPoints().Len()
100+
case pmetric.MetricTypeSummary:
101+
totalDataPointCount += metric.Summary().DataPoints().Len()
102+
default:
103+
assert.Fail(t, "Unexpected metric type")
104+
}
105+
106+
metricName := metric.Name()
107+
if _, ok := expectedMetrics[metricName]; ok {
108+
expectedMetrics[metricName] = true
109+
} else {
110+
unexpectedMetrics[metricName] = true
111+
}
112+
}
113+
114+
// Check that we have some metrics and data points
115+
assert.Positive(t, metricsCount, "No metrics were collected")
116+
assert.Positive(t, totalDataPointCount, "No data points were collected")
117+
118+
// Check that each expected metric has at least one data point
119+
for metricName, hasDataPoints := range expectedMetrics {
120+
assert.True(t, hasDataPoints, "Metric %s has no data points", metricName)
121+
}
122+
// Check that no unexpected metrics were collected
123+
for metricName := range unexpectedMetrics {
124+
assert.Fail(t, "Unexpected metric was collected", metricName)
125+
}
126+
}

0 commit comments

Comments
 (0)