Skip to content

Commit

Permalink
[chore] Change receiver config tests to unmarshal config only for tha…
Browse files Browse the repository at this point in the history
…t component. (part6)

- [x] dockerstatsreceiver
- [x] receivercreator
- [x] expvarreceiver
- [x] googlecloudpubsubreceiver
- [x] googlecloudspannerreceiver
- [x] prometheusreceiver
- [x] windowseventlogreceiver
  • Loading branch information
kovrus committed Oct 4, 2022
1 parent 7429ab6 commit 36703a8
Show file tree
Hide file tree
Showing 40 changed files with 806 additions and 1,135 deletions.
125 changes: 70 additions & 55 deletions receiver/dockerstatsreceiver/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,66 +21,81 @@ import (

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/confmap/confmaptest"
"go.opentelemetry.io/collector/receiver/scraperhelper"
"go.opentelemetry.io/collector/service/servicetest"

"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/dockerstatsreceiver/internal/metadata"
)

func TestLoadConfig(t *testing.T) {
factories, err := componenttest.NopFactories()
assert.NoError(t, err)

factory := NewFactory()
factories.Receivers[typeStr] = factory
cfg, err := servicetest.LoadConfigAndValidate(filepath.Join("testdata", "config.yaml"), factories)

require.NoError(t, err)
require.NotNil(t, cfg)
assert.Equal(t, 2, len(cfg.Receivers))

defaultConfig := cfg.Receivers[config.NewComponentID(typeStr)]
assert.Equal(t, factory.CreateDefaultConfig(), defaultConfig)

dcfg := defaultConfig.(*Config)
assert.Equal(t, "docker_stats", dcfg.ID().String())
assert.Equal(t, "unix:///var/run/docker.sock", dcfg.Endpoint)
assert.Equal(t, 10*time.Second, dcfg.CollectionInterval)
assert.Equal(t, 5*time.Second, dcfg.Timeout)
assert.Equal(t, defaultDockerAPIVersion, dcfg.DockerAPIVersion)

assert.Nil(t, dcfg.ExcludedImages)
assert.Nil(t, dcfg.ContainerLabelsToMetricLabels)
assert.Nil(t, dcfg.EnvVarsToMetricLabels)

assert.False(t, dcfg.ProvidePerCoreCPUMetrics)

ascfg := cfg.Receivers[config.NewComponentIDWithName(typeStr, "allsettings")].(*Config)
assert.Equal(t, "docker_stats/allsettings", ascfg.ID().String())
assert.Equal(t, "http://example.com/", ascfg.Endpoint)
assert.Equal(t, 2*time.Second, ascfg.CollectionInterval)
assert.Equal(t, 20*time.Second, ascfg.Timeout)
assert.Equal(t, 1.24, ascfg.DockerAPIVersion)

assert.Equal(t, []string{
"undesired-container",
"another-*-container",
}, ascfg.ExcludedImages)

assert.Equal(t, map[string]string{
"my.container.label": "my-metric-label",
"my.other.container.label": "my-other-metric-label",
}, ascfg.ContainerLabelsToMetricLabels)

assert.Equal(t, map[string]string{
"MY_ENVIRONMENT_VARIABLE": "my-metric-label",
"MY_OTHER_ENVIRONMENT_VARIABLE": "my-other-metric-label",
}, ascfg.EnvVarsToMetricLabels)

assert.True(t, ascfg.ProvidePerCoreCPUMetrics)

assert.False(t, ascfg.MetricsConfig.ContainerCPUUsageSystem.Enabled)
assert.True(t, ascfg.MetricsConfig.ContainerMemoryTotalRss.Enabled)
t.Parallel()

tests := []struct {
id config.ComponentID
expected config.Receiver
}{
{
id: config.NewComponentIDWithName(typeStr, ""),
expected: createDefaultConfig(),
},
{
id: config.NewComponentIDWithName(typeStr, "allsettings"),
expected: &Config{
ScraperControllerSettings: scraperhelper.ScraperControllerSettings{
ReceiverSettings: config.NewReceiverSettings(config.NewComponentID(typeStr)),
CollectionInterval: 2 * time.Second,
},

Endpoint: "http://example.com/",
Timeout: 20 * time.Second,
DockerAPIVersion: 1.24,

ProvidePerCoreCPUMetrics: true,
ExcludedImages: []string{
"undesired-container",
"another-*-container",
},

ContainerLabelsToMetricLabels: map[string]string{
"my.container.label": "my-metric-label",
"my.other.container.label": "my-other-metric-label",
},

EnvVarsToMetricLabels: map[string]string{
"MY_ENVIRONMENT_VARIABLE": "my-metric-label",
"MY_OTHER_ENVIRONMENT_VARIABLE": "my-other-metric-label",
},
MetricsConfig: func() metadata.MetricsSettings {
m := metadata.DefaultMetricsSettings()
m.ContainerCPUUsageSystem = metadata.MetricSettings{
Enabled: false,
}
m.ContainerMemoryTotalRss = metadata.MetricSettings{
Enabled: true,
}
return m
}(),
},
},
}

for _, tt := range tests {
t.Run(tt.id.String(), func(t *testing.T) {
cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config.yaml"))
require.NoError(t, err)

factory := NewFactory()
cfg := factory.CreateDefaultConfig()

sub, err := cm.Sub(tt.id.String())
require.NoError(t, err)
require.NoError(t, config.UnmarshalReceiver(sub, cfg))

assert.NoError(t, cfg.Validate())
assert.Equal(t, tt.expected, cfg)
})
}
}

func TestValidateErrors(t *testing.T) {
Expand Down
56 changes: 21 additions & 35 deletions receiver/dockerstatsreceiver/testdata/config.yaml
Original file line number Diff line number Diff line change
@@ -1,35 +1,21 @@
receivers:
docker_stats:
docker_stats/allsettings:
endpoint: http://example.com/
collection_interval: 2s
timeout: 20s
api_version: 1.24
container_labels_to_metric_labels:
my.container.label: my-metric-label
my.other.container.label: my-other-metric-label
env_vars_to_metric_labels:
MY_ENVIRONMENT_VARIABLE: my-metric-label
MY_OTHER_ENVIRONMENT_VARIABLE: my-other-metric-label
excluded_images:
- undesired-container
- another-*-container
provide_per_core_cpu_metrics: true
metrics:
container.cpu.usage.system:
enabled: false
container.memory.total_rss:
enabled: true

processors:
nop:

exporters:
nop:

service:
pipelines:
metrics:
receivers: [docker_stats, docker_stats/allsettings]
processors: [nop]
exporters: [nop]
docker_stats:
docker_stats/allsettings:
endpoint: http://example.com/
collection_interval: 2s
timeout: 20s
api_version: 1.24
container_labels_to_metric_labels:
my.container.label: my-metric-label
my.other.container.label: my-other-metric-label
env_vars_to_metric_labels:
MY_ENVIRONMENT_VARIABLE: my-metric-label
MY_OTHER_ENVIRONMENT_VARIABLE: my-other-metric-label
excluded_images:
- undesired-container
- another-*-container
provide_per_core_cpu_metrics: true
metrics:
container.cpu.usage.system:
enabled: false
container.memory.total_rss:
enabled: true
119 changes: 65 additions & 54 deletions receiver/expvarreceiver/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,66 +21,77 @@ import (

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/component/componenttest"
"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/service/servicetest"
"go.opentelemetry.io/collector/config/confighttp"
"go.opentelemetry.io/collector/confmap/confmaptest"
"go.opentelemetry.io/collector/receiver/scraperhelper"

"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/expvarreceiver/internal/metadata"
)

func TestLoadConfig(t *testing.T) {
factories, err := componenttest.NopFactories()
assert.NoError(t, err)
t.Parallel()

factory := NewFactory()
factories.Receivers[typeStr] = factory
cfg, err := servicetest.LoadConfigAndValidate(filepath.Join("testdata", "config", "config.yaml"), factories)

require.NoError(t, err)
require.NotNil(t, cfg)
assert.Equal(t, 2, len(cfg.Receivers))

// Validate default config
expectedCfg := factory.CreateDefaultConfig().(*Config)
expectedCfg.SetIDName("default")

assert.Equal(t, expectedCfg, cfg.Receivers[config.NewComponentIDWithName(typeStr, "default")])

// Validate custom config
expectedCfg = factory.CreateDefaultConfig().(*Config)
expectedCfg.SetIDName("custom")
expectedCfg.CollectionInterval = time.Second * 30
expectedCfg.Endpoint = "http://localhost:8000/custom/path"
expectedCfg.Timeout = time.Second * 5
expectedCfg.MetricsConfig = metadata.DefaultMetricsSettings()
expectedCfg.MetricsConfig.ProcessRuntimeMemstatsTotalAlloc.Enabled = true
expectedCfg.MetricsConfig.ProcessRuntimeMemstatsMallocs.Enabled = false

assert.Equal(t, expectedCfg, cfg.Receivers[config.NewComponentIDWithName(typeStr, "custom")])
}

func TestFailedLoadConfig(t *testing.T) {
factories, err := componenttest.NopFactories()
assert.NoError(t, err)

factory := NewFactory()
factories.Receivers[typeStr] = factory

_, err = servicetest.LoadConfigAndValidate(filepath.Join("testdata", "config", "bad_schemeless_endpoint_config.yaml"), factories)
assert.EqualError(t, err, "receiver \"expvar\" has invalid configuration: scheme must be 'http' or 'https', but was 'localhost'")

_, err = servicetest.LoadConfigAndValidate(filepath.Join("testdata", "config", "bad_hostless_endpoint_config.yaml"), factories)
assert.EqualError(t, err, "receiver \"expvar\" has invalid configuration: host not found in HTTP endpoint")

_, err = servicetest.LoadConfigAndValidate(filepath.Join("testdata", "config", "bad_invalid_url_config.yaml"), factories)
assert.EqualError(t, err, "receiver \"expvar\" has invalid configuration: endpoint is not a valid URL: parse \"#$%^&*()_\": invalid URL escape \"%^&\"")

_, err = servicetest.LoadConfigAndValidate(filepath.Join("testdata", "config", "bad_collection_interval_config.yaml"), factories)
assert.EqualError(t, err, "error reading receivers configuration for \"expvar\": 1 error(s) decoding:\n\n* error decoding 'collection_interval': time: invalid duration \"fourminutes\"")

_, err = servicetest.LoadConfigAndValidate(filepath.Join("testdata", "config", "bad_metric_config.yaml"), factories)
assert.EqualError(t, err, "error reading receivers configuration for \"expvar\": 1 error(s) decoding:\n\n* 'metrics.process.runtime.memstats.total_alloc' has invalid keys: invalid_field")

_, err = servicetest.LoadConfigAndValidate(filepath.Join("testdata", "config", "bad_metric_name.yaml"), factories)
assert.EqualError(t, err, "error reading receivers configuration for \"expvar\": 1 error(s) decoding:\n\n* 'metrics' has invalid keys: bad_metric.name")
metricCfg := metadata.DefaultMetricsSettings()
metricCfg.ProcessRuntimeMemstatsTotalAlloc.Enabled = true
metricCfg.ProcessRuntimeMemstatsMallocs.Enabled = false

tests := []struct {
id config.ComponentID
expected config.Receiver
errorMessage string
}{
{
id: config.NewComponentIDWithName(typeStr, "default"),
expected: factory.CreateDefaultConfig(),
},
{
id: config.NewComponentIDWithName(typeStr, "custom"),
expected: &Config{
ScraperControllerSettings: scraperhelper.ScraperControllerSettings{
ReceiverSettings: config.NewReceiverSettings(config.NewComponentID(typeStr)),
CollectionInterval: 30 * time.Second,
},
HTTPClientSettings: confighttp.HTTPClientSettings{
Endpoint: "http://localhost:8000/custom/path",
Timeout: time.Second * 5,
},
MetricsConfig: metricCfg,
},
},
{
id: config.NewComponentIDWithName(typeStr, "bad_schemeless_endpoint"),
errorMessage: "scheme must be 'http' or 'https', but was 'localhost'",
},
{
id: config.NewComponentIDWithName(typeStr, "bad_hostless_endpoint"),
errorMessage: "host not found in HTTP endpoint",
},
{
id: config.NewComponentIDWithName(typeStr, "bad_invalid_url"),
errorMessage: "endpoint is not a valid URL: parse \"#$%^&*()_\": invalid URL escape \"%^&\"",
},
}

for _, tt := range tests {
t.Run(tt.id.String(), func(t *testing.T) {
cm, err := confmaptest.LoadConf(filepath.Join("testdata", "config", "config.yaml"))
require.NoError(t, err)

factory := NewFactory()
cfg := factory.CreateDefaultConfig()

sub, err := cm.Sub(tt.id.String())
require.NoError(t, err)
require.NoError(t, config.UnmarshalReceiver(sub, cfg))

if tt.expected == nil {
assert.EqualError(t, cfg.Validate(), tt.errorMessage)
return
}
assert.NoError(t, cfg.Validate())
assert.Equal(t, tt.expected, cfg)
})
}
}

This file was deleted.

This file was deleted.

This file was deleted.

19 changes: 0 additions & 19 deletions receiver/expvarreceiver/testdata/config/bad_metric_config.yaml

This file was deleted.

Loading

0 comments on commit 36703a8

Please sign in to comment.