diff --git a/exporter/exporterhelper/factory.go b/exporter/exporterhelper/factory.go index fc5d6517d86..da1a4c59d45 100644 --- a/exporter/exporterhelper/factory.go +++ b/exporter/exporterhelper/factory.go @@ -39,7 +39,6 @@ type CreateMetricsExporter func(context.Context, component.ExporterCreateParams, // CreateMetricsExporter is the equivalent of component.ExporterFactory.CreateLogsExporter() type CreateLogsExporter func(context.Context, component.ExporterCreateParams, configmodels.Exporter) (component.LogsExporter, error) -// factory is the factory for Jaeger gRPC exporter. type factory struct { cfgType configmodels.Type customUnmarshaler component.CustomUnmarshaler @@ -72,14 +71,14 @@ func WithLogs(createLogsExporter CreateLogsExporter) FactoryOption { } } -// WithCustomUnmarshaler overrides the default "not available" CustomUnmarshaler. +// WithCustomUnmarshaler implements component.ConfigUnmarshaler. func WithCustomUnmarshaler(customUnmarshaler component.CustomUnmarshaler) FactoryOption { return func(o *factory) { o.customUnmarshaler = customUnmarshaler } } -// NewFactory returns a component.ExporterFactory that only supports all types. +// NewFactory returns a component.ExporterFactory. func NewFactory( cfgType configmodels.Type, createDefaultConfig CreateDefaultConfig, @@ -150,8 +149,7 @@ type factoryWithUnmarshaler struct { *factory } -// CustomUnmarshaler returns a custom unmarshaler for the configuration or nil if -// there is no need for custom unmarshaling. +// Unmarshal un-marshals the config using the provided custom unmarshaler. func (f *factoryWithUnmarshaler) Unmarshal(componentViperSection *viper.Viper, intoCfg interface{}) error { return f.customUnmarshaler(componentViperSection, intoCfg) } diff --git a/extension/extensionhelper/factory.go b/extension/extensionhelper/factory.go new file mode 100644 index 00000000000..a660cc0419c --- /dev/null +++ b/extension/extensionhelper/factory.go @@ -0,0 +1,99 @@ +// Copyright OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package extensionhelper + +import ( + "context" + + "github.com/spf13/viper" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configmodels" +) + +// FactoryOption apply changes to ExporterOptions. +type FactoryOption func(o *factory) + +// CreateDefaultConfig is the equivalent of component.ExtensionFactory.CreateDefaultConfig() +type CreateDefaultConfig func() configmodels.Extension + +// CreateTraceExtension is the equivalent of component.ExtensionFactory.CreateTraceExtension() +type CreateServiceExtension func(context.Context, component.ExtensionCreateParams, configmodels.Extension) (component.ServiceExtension, error) + +type factory struct { + cfgType configmodels.Type + customUnmarshaler component.CustomUnmarshaler + createDefaultConfig CreateDefaultConfig + createServiceExtension CreateServiceExtension +} + +// WithCustomUnmarshaler implements component.ConfigUnmarshaler. +func WithCustomUnmarshaler(customUnmarshaler component.CustomUnmarshaler) FactoryOption { + return func(o *factory) { + o.customUnmarshaler = customUnmarshaler + } +} + +// NewFactory returns a component.ExtensionFactory. +func NewFactory( + cfgType configmodels.Type, + createDefaultConfig CreateDefaultConfig, + createServiceExtension CreateServiceExtension, + options ...FactoryOption) component.ExtensionFactory { + f := &factory{ + cfgType: cfgType, + createDefaultConfig: createDefaultConfig, + createServiceExtension: createServiceExtension, + } + for _, opt := range options { + opt(f) + } + var ret component.ExtensionFactory + if f.customUnmarshaler != nil { + ret = &factoryWithUnmarshaler{f} + } else { + ret = f + } + return ret +} + +// Type gets the type of the Extension config created by this factory. +func (f *factory) Type() configmodels.Type { + return f.cfgType +} + +// CreateDefaultConfig creates the default configuration for processor. +func (f *factory) CreateDefaultConfig() configmodels.Extension { + return f.createDefaultConfig() +} + +// CreateExtension creates a component.TraceExtension based on this config. +func (f *factory) CreateExtension( + ctx context.Context, + params component.ExtensionCreateParams, + cfg configmodels.Extension) (component.ServiceExtension, error) { + return f.createServiceExtension(ctx, params, cfg) +} + +var _ component.ConfigUnmarshaler = (*factoryWithUnmarshaler)(nil) + +type factoryWithUnmarshaler struct { + *factory +} + +// Unmarshal un-marshals the config using the provided custom unmarshaler. +func (f *factoryWithUnmarshaler) Unmarshal(componentViperSection *viper.Viper, intoCfg interface{}) error { + return f.customUnmarshaler(componentViperSection, intoCfg) +} diff --git a/extension/extensionhelper/factory_test.go b/extension/extensionhelper/factory_test.go new file mode 100644 index 00000000000..e3d28a79ebd --- /dev/null +++ b/extension/extensionhelper/factory_test.go @@ -0,0 +1,91 @@ +// Copyright OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package extensionhelper + +import ( + "context" + "errors" + "testing" + + "github.com/spf13/viper" + "github.com/stretchr/testify/assert" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/configmodels" +) + +const typeStr = "test" + +var ( + defaultCfg = &configmodels.ExtensionSettings{ + TypeVal: typeStr, + NameVal: typeStr, + } + nopExtensionInstance = new(nopExtension) +) + +func TestNewFactory(t *testing.T) { + factory := NewFactory( + typeStr, + defaultConfig, + createExtension) + assert.EqualValues(t, typeStr, factory.Type()) + assert.EqualValues(t, defaultCfg, factory.CreateDefaultConfig()) + ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{}, defaultCfg) + assert.NoError(t, err) + assert.Same(t, nopExtensionInstance, ext) +} + +func TestNewFactory_WithConstructors(t *testing.T) { + factory := NewFactory( + typeStr, + defaultConfig, + createExtension, + WithCustomUnmarshaler(customUnmarshaler)) + assert.EqualValues(t, typeStr, factory.Type()) + assert.EqualValues(t, defaultCfg, factory.CreateDefaultConfig()) + + fu, ok := factory.(component.ConfigUnmarshaler) + assert.True(t, ok) + assert.Equal(t, errors.New("my error"), fu.Unmarshal(nil, nil)) + + ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{}, defaultCfg) + assert.NoError(t, err) + assert.Same(t, nopExtensionInstance, ext) +} + +func defaultConfig() configmodels.Extension { + return defaultCfg +} + +func createExtension(context.Context, component.ExtensionCreateParams, configmodels.Extension) (component.ServiceExtension, error) { + return nopExtensionInstance, nil +} + +func customUnmarshaler(*viper.Viper, interface{}) error { + return errors.New("my error") +} + +type nopExtension struct { +} + +func (ne *nopExtension) Start(context.Context, component.Host) error { + return nil +} + +// Shutdown stops the exporter and is invoked during shutdown. +func (ne *nopExtension) Shutdown(context.Context) error { + return nil +} diff --git a/extension/fluentbitextension/config_test.go b/extension/fluentbitextension/config_test.go index 10b9b064d08..63cb7c37b86 100644 --- a/extension/fluentbitextension/config_test.go +++ b/extension/fluentbitextension/config_test.go @@ -30,7 +30,7 @@ func TestLoadConfig(t *testing.T) { factories, err := componenttest.ExampleComponents() assert.NoError(t, err) - factory := &Factory{} + factory := NewFactory() factories.Extensions[typeStr] = factory cfg, err := configtest.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml"), factories) diff --git a/extension/fluentbitextension/factory.go b/extension/fluentbitextension/factory.go index bcc007e1d95..396048834bc 100644 --- a/extension/fluentbitextension/factory.go +++ b/extension/fluentbitextension/factory.go @@ -19,6 +19,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configmodels" + "go.opentelemetry.io/collector/extension/extensionhelper" ) const ( @@ -26,17 +27,15 @@ const ( typeStr = "fluentbit" ) -// ExtensionFactory is the factory for the extension. -type Factory struct { +// NewFactory creates a factory for FluentBit extension. +func NewFactory() component.ExtensionFactory { + return extensionhelper.NewFactory( + typeStr, + createDefaultConfig, + createExtension) } -// Type gets the type of the config created by this factory. -func (f *Factory) Type() configmodels.Type { - return typeStr -} - -// CreateDefaultConfig creates the default configuration for the extension. -func (f *Factory) CreateDefaultConfig() configmodels.Extension { +func createDefaultConfig() configmodels.Extension { return &Config{ ExtensionSettings: configmodels.ExtensionSettings{ TypeVal: typeStr, @@ -45,9 +44,7 @@ func (f *Factory) CreateDefaultConfig() configmodels.Extension { } } -// CreateExtension creates the extension based on this config. -func (f *Factory) CreateExtension(_ context.Context, params component.ExtensionCreateParams, cfg configmodels.Extension) (component.ServiceExtension, error) { +func createExtension(_ context.Context, params component.ExtensionCreateParams, cfg configmodels.Extension) (component.ServiceExtension, error) { config := cfg.(*Config) - return newProcessManager(config, params.Logger), nil } diff --git a/extension/fluentbitextension/factory_test.go b/extension/fluentbitextension/factory_test.go index 367824418a0..ba672ce9893 100644 --- a/extension/fluentbitextension/factory_test.go +++ b/extension/fluentbitextension/factory_test.go @@ -27,14 +27,8 @@ import ( "go.opentelemetry.io/collector/config/configmodels" ) -func TestFactory_Type(t *testing.T) { - factory := Factory{} - require.Equal(t, configmodels.Type(typeStr), factory.Type()) -} - func TestFactory_CreateDefaultConfig(t *testing.T) { - factory := Factory{} - cfg := factory.CreateDefaultConfig() + cfg := createDefaultConfig() assert.Equal(t, &Config{ ExtensionSettings: configmodels.ExtensionSettings{ NameVal: typeStr, @@ -44,16 +38,14 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { cfg) assert.NoError(t, configcheck.ValidateConfig(cfg)) - ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.NoError(t, err) require.NotNil(t, ext) } func TestFactory_CreateExtension(t *testing.T) { - factory := Factory{} - cfg := factory.CreateDefaultConfig().(*Config) - - ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + cfg := createDefaultConfig().(*Config) + ext, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.NoError(t, err) require.NotNil(t, ext) } diff --git a/extension/healthcheckextension/config_test.go b/extension/healthcheckextension/config_test.go index 4b8f3d8a2f9..b7b552ba544 100644 --- a/extension/healthcheckextension/config_test.go +++ b/extension/healthcheckextension/config_test.go @@ -30,7 +30,7 @@ func TestLoadConfig(t *testing.T) { factories, err := componenttest.ExampleComponents() assert.NoError(t, err) - factory := &Factory{} + factory := NewFactory() factories.Extensions[typeStr] = factory cfg, err := configtest.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml"), factories) diff --git a/extension/healthcheckextension/factory.go b/extension/healthcheckextension/factory.go index 1ca07a4022c..5b7ce3db91a 100644 --- a/extension/healthcheckextension/factory.go +++ b/extension/healthcheckextension/factory.go @@ -21,6 +21,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configmodels" + "go.opentelemetry.io/collector/extension/extensionhelper" ) const ( @@ -28,17 +29,15 @@ const ( typeStr = "health_check" ) -// ExtensionFactory is the factory for the extension. -type Factory struct { +// NewFactory creates a factory for HealthCheck extension. +func NewFactory() component.ExtensionFactory { + return extensionhelper.NewFactory( + typeStr, + createDefaultConfig, + createExtension) } -// Type gets the type of the config created by this factory. -func (f *Factory) Type() configmodels.Type { - return typeStr -} - -// CreateDefaultConfig creates the default configuration for the extension. -func (f *Factory) CreateDefaultConfig() configmodels.Extension { +func createDefaultConfig() configmodels.Extension { return &Config{ ExtensionSettings: configmodels.ExtensionSettings{ TypeVal: typeStr, @@ -48,8 +47,7 @@ func (f *Factory) CreateDefaultConfig() configmodels.Extension { } } -// CreateExtension creates the extension based on this config. -func (f *Factory) CreateExtension(_ context.Context, params component.ExtensionCreateParams, cfg configmodels.Extension) (component.ServiceExtension, error) { +func createExtension(_ context.Context, params component.ExtensionCreateParams, cfg configmodels.Extension) (component.ServiceExtension, error) { config := cfg.(*Config) // The runtime settings are global to the application, so while in principle it diff --git a/extension/healthcheckextension/factory_test.go b/extension/healthcheckextension/factory_test.go index ac1db915f78..0e5f0732dc2 100644 --- a/extension/healthcheckextension/factory_test.go +++ b/extension/healthcheckextension/factory_test.go @@ -29,14 +29,8 @@ import ( "go.opentelemetry.io/collector/testutil" ) -func TestFactory_Type(t *testing.T) { - factory := Factory{} - require.Equal(t, configmodels.Type(typeStr), factory.Type()) -} - func TestFactory_CreateDefaultConfig(t *testing.T) { - factory := Factory{} - cfg := factory.CreateDefaultConfig() + cfg := createDefaultConfig() assert.Equal(t, &Config{ ExtensionSettings: configmodels.ExtensionSettings{ NameVal: typeStr, @@ -47,7 +41,7 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { cfg) assert.NoError(t, configcheck.ValidateConfig(cfg)) - ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.NoError(t, err) require.NotNil(t, ext) @@ -56,11 +50,10 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { } func TestFactory_CreateExtension(t *testing.T) { - factory := Factory{} - cfg := factory.CreateDefaultConfig().(*Config) + cfg := createDefaultConfig().(*Config) cfg.Port = testutil.GetAvailablePort(t) - ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.NoError(t, err) require.NotNil(t, ext) @@ -69,15 +62,14 @@ func TestFactory_CreateExtension(t *testing.T) { } func TestFactory_CreateExtensionOnlyOnce(t *testing.T) { - factory := Factory{} - cfg := factory.CreateDefaultConfig().(*Config) + cfg := createDefaultConfig().(*Config) cfg.Port = testutil.GetAvailablePort(t) - ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.NoError(t, err) require.NotNil(t, ext) - ext1, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext1, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.Error(t, err) require.Nil(t, ext1) diff --git a/extension/pprofextension/config_test.go b/extension/pprofextension/config_test.go index 5cd521b6801..e5077965f0b 100644 --- a/extension/pprofextension/config_test.go +++ b/extension/pprofextension/config_test.go @@ -30,7 +30,7 @@ func TestLoadConfig(t *testing.T) { factories, err := componenttest.ExampleComponents() assert.NoError(t, err) - factory := &Factory{} + factory := NewFactory() factories.Extensions[typeStr] = factory cfg, err := configtest.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml"), factories) diff --git a/extension/pprofextension/factory.go b/extension/pprofextension/factory.go index 8af38686301..60ce64718de 100644 --- a/extension/pprofextension/factory.go +++ b/extension/pprofextension/factory.go @@ -21,6 +21,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configmodels" + "go.opentelemetry.io/collector/extension/extensionhelper" ) const ( @@ -28,17 +29,15 @@ const ( typeStr = "pprof" ) -// ExtensionFactory is the factory for the extension. -type Factory struct { +// NewFactory creates a factory for pprof extension. +func NewFactory() component.ExtensionFactory { + return extensionhelper.NewFactory( + typeStr, + createDefaultConfig, + createExtension) } -// Type gets the type of the config created by this factory. -func (f *Factory) Type() configmodels.Type { - return typeStr -} - -// CreateDefaultConfig creates the default configuration for the extension. -func (f *Factory) CreateDefaultConfig() configmodels.Extension { +func createDefaultConfig() configmodels.Extension { return &Config{ ExtensionSettings: configmodels.ExtensionSettings{ TypeVal: typeStr, @@ -48,8 +47,7 @@ func (f *Factory) CreateDefaultConfig() configmodels.Extension { } } -// CreateExtension creates the extension based on this config. -func (f *Factory) CreateExtension(_ context.Context, params component.ExtensionCreateParams, cfg configmodels.Extension) (component.ServiceExtension, error) { +func createExtension(_ context.Context, params component.ExtensionCreateParams, cfg configmodels.Extension) (component.ServiceExtension, error) { config := cfg.(*Config) if config.Endpoint == "" { return nil, errors.New("\"endpoint\" is required when using the \"pprof\" extension") @@ -62,6 +60,7 @@ func (f *Factory) CreateExtension(_ context.Context, params component.ExtensionC // while keeping the private function that allow the creation of multiple // instances for unit tests. Summary: only a single instance can be created // via the factory. + // TODO: Move this as an option to extensionhelper. if !atomic.CompareAndSwapInt32(&instanceState, instanceNotCreated, instanceCreated) { return nil, errors.New("only a single instance can be created per process") } diff --git a/extension/pprofextension/factory_test.go b/extension/pprofextension/factory_test.go index 8f5ba48c112..3b0f64448c1 100644 --- a/extension/pprofextension/factory_test.go +++ b/extension/pprofextension/factory_test.go @@ -29,14 +29,8 @@ import ( "go.opentelemetry.io/collector/testutil" ) -func TestFactory_Type(t *testing.T) { - factory := Factory{} - require.Equal(t, configmodels.Type(typeStr), factory.Type()) -} - func TestFactory_CreateDefaultConfig(t *testing.T) { - factory := Factory{} - cfg := factory.CreateDefaultConfig() + cfg := createDefaultConfig() assert.Equal(t, &Config{ ExtensionSettings: configmodels.ExtensionSettings{ NameVal: typeStr, @@ -47,7 +41,7 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { cfg) assert.NoError(t, configcheck.ValidateConfig(cfg)) - ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.NoError(t, err) require.NotNil(t, ext) @@ -56,11 +50,10 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { } func TestFactory_CreateExtension(t *testing.T) { - factory := Factory{} - cfg := factory.CreateDefaultConfig().(*Config) + cfg := createDefaultConfig().(*Config) cfg.Endpoint = testutil.GetAvailableLocalAddress(t) - ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.NoError(t, err) require.NotNil(t, ext) @@ -69,15 +62,14 @@ func TestFactory_CreateExtension(t *testing.T) { } func TestFactory_CreateExtensionOnlyOnce(t *testing.T) { - factory := Factory{} - cfg := factory.CreateDefaultConfig().(*Config) + cfg := createDefaultConfig().(*Config) cfg.Endpoint = testutil.GetAvailableLocalAddress(t) - ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.NoError(t, err) require.NotNil(t, ext) - ext1, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext1, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.Error(t, err) require.Nil(t, ext1) diff --git a/extension/zpagesextension/config_test.go b/extension/zpagesextension/config_test.go index 778da85a456..95279b6c234 100644 --- a/extension/zpagesextension/config_test.go +++ b/extension/zpagesextension/config_test.go @@ -30,7 +30,7 @@ func TestLoadConfig(t *testing.T) { factories, err := componenttest.ExampleComponents() assert.NoError(t, err) - factory := &Factory{} + factory := NewFactory() factories.Extensions[typeStr] = factory cfg, err := configtest.LoadConfigFile(t, path.Join(".", "testdata", "config.yaml"), factories) diff --git a/extension/zpagesextension/factory.go b/extension/zpagesextension/factory.go index 5bac64b594a..70189d09fd4 100644 --- a/extension/zpagesextension/factory.go +++ b/extension/zpagesextension/factory.go @@ -21,6 +21,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configmodels" + "go.opentelemetry.io/collector/extension/extensionhelper" ) const ( @@ -28,17 +29,15 @@ const ( typeStr = "zpages" ) -// ExtensionFactory is the factory for the extension. -type Factory struct { +// NewFactory creates a factory for Z-Pages extension. +func NewFactory() component.ExtensionFactory { + return extensionhelper.NewFactory( + typeStr, + createDefaultConfig, + createExtension) } -// Type gets the type of the config created by this factory. -func (f *Factory) Type() configmodels.Type { - return typeStr -} - -// CreateDefaultConfig creates the default configuration for the extension. -func (f *Factory) CreateDefaultConfig() configmodels.Extension { +func createDefaultConfig() configmodels.Extension { return &Config{ ExtensionSettings: configmodels.ExtensionSettings{ TypeVal: typeStr, @@ -49,7 +48,7 @@ func (f *Factory) CreateDefaultConfig() configmodels.Extension { } // CreateExtension creates the extension based on this config. -func (f *Factory) CreateExtension(_ context.Context, params component.ExtensionCreateParams, cfg configmodels.Extension) (component.ServiceExtension, error) { +func createExtension(_ context.Context, params component.ExtensionCreateParams, cfg configmodels.Extension) (component.ServiceExtension, error) { config := cfg.(*Config) if config.Endpoint == "" { return nil, errors.New("\"endpoint\" is required when using the \"zpages\" extension") diff --git a/extension/zpagesextension/factory_test.go b/extension/zpagesextension/factory_test.go index e54b1627559..0f9d36bdda7 100644 --- a/extension/zpagesextension/factory_test.go +++ b/extension/zpagesextension/factory_test.go @@ -29,14 +29,8 @@ import ( "go.opentelemetry.io/collector/testutil" ) -func TestFactory_Type(t *testing.T) { - factory := Factory{} - require.Equal(t, configmodels.Type(typeStr), factory.Type()) -} - func TestFactory_CreateDefaultConfig(t *testing.T) { - factory := Factory{} - cfg := factory.CreateDefaultConfig() + cfg := createDefaultConfig() assert.Equal(t, &Config{ ExtensionSettings: configmodels.ExtensionSettings{ NameVal: typeStr, @@ -47,7 +41,7 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { cfg) assert.NoError(t, configcheck.ValidateConfig(cfg)) - ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.NoError(t, err) require.NotNil(t, ext) @@ -56,11 +50,10 @@ func TestFactory_CreateDefaultConfig(t *testing.T) { } func TestFactory_CreateExtension(t *testing.T) { - factory := Factory{} - cfg := factory.CreateDefaultConfig().(*Config) + cfg := createDefaultConfig().(*Config) cfg.Endpoint = testutil.GetAvailableLocalAddress(t) - ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.NoError(t, err) require.NotNil(t, ext) @@ -69,15 +62,14 @@ func TestFactory_CreateExtension(t *testing.T) { } func TestFactory_CreateExtensionOnlyOnce(t *testing.T) { - factory := Factory{} - cfg := factory.CreateDefaultConfig().(*Config) + cfg := createDefaultConfig().(*Config) cfg.Endpoint = testutil.GetAvailableLocalAddress(t) - ext, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.NoError(t, err) require.NotNil(t, ext) - ext1, err := factory.CreateExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) + ext1, err := createExtension(context.Background(), component.ExtensionCreateParams{Logger: zap.NewNop()}, cfg) require.Error(t, err) require.Nil(t, ext1) diff --git a/processor/processorhelper/factory.go b/processor/processorhelper/factory.go index 89cb0c8fce1..5e697b64d4f 100644 --- a/processor/processorhelper/factory.go +++ b/processor/processorhelper/factory.go @@ -40,7 +40,6 @@ type CreateMetricsProcessor func(context.Context, component.ProcessorCreateParam // CreateLogsProcessor is the equivalent of component.ProcessorFactory.CreateLogsProcessor() type CreateLogsProcessor func(context.Context, component.ProcessorCreateParams, configmodels.Processor, consumer.LogsConsumer) (component.LogsProcessor, error) -// factory is the factory for Jaeger gRPC exporter. type factory struct { cfgType configmodels.Type customUnmarshaler component.CustomUnmarshaler @@ -52,7 +51,7 @@ type factory struct { var _ component.LogsProcessorFactory = new(factory) -// WithCustomUnmarshaler overrides the default "not available" CustomUnmarshaler. +// WithCustomUnmarshaler implements component.ConfigUnmarshaler. func WithCustomUnmarshaler(customUnmarshaler component.CustomUnmarshaler) FactoryOption { return func(o *factory) { o.customUnmarshaler = customUnmarshaler @@ -80,7 +79,7 @@ func WithLogs(createLogsProcessor CreateLogsProcessor) FactoryOption { } } -// NewFactory returns a component.ProcessorFactory that only supports all types. +// NewFactory returns a component.ProcessorFactory. func NewFactory( cfgType configmodels.Type, createDefaultConfig CreateDefaultConfig, @@ -154,8 +153,7 @@ type factoryWithUnmarshaler struct { *factory } -// CustomUnmarshaler returns a custom unmarshaler for the configuration or nil if -// there is no need for custom unmarshaling. +// Unmarshal un-marshals the config using the provided custom unmarshaler. func (f *factoryWithUnmarshaler) Unmarshal(componentViperSection *viper.Viper, intoCfg interface{}) error { return f.customUnmarshaler(componentViperSection, intoCfg) } diff --git a/receiver/receiverhelper/factory.go b/receiver/receiverhelper/factory.go index 7f4c590aa2c..b7972ea415a 100644 --- a/receiver/receiverhelper/factory.go +++ b/receiver/receiverhelper/factory.go @@ -28,7 +28,7 @@ import ( // FactoryOption apply changes to ReceiverOptions. type FactoryOption func(o *factory) -// WithCustomUnmarshaler overrides the default "not available" CustomUnmarshaler. +// WithCustomUnmarshaler implements component.ConfigUnmarshaler. func WithCustomUnmarshaler(customUnmarshaler component.CustomUnmarshaler) FactoryOption { return func(o *factory) { o.customUnmarshaler = customUnmarshaler @@ -68,7 +68,6 @@ type CreateMetricsReceiver func(context.Context, component.ReceiverCreateParams, // CreateLogsReceiver is the equivalent of component.ReceiverFactory.CreateLogsReceiver() type CreateLogsReceiver func(context.Context, component.ReceiverCreateParams, configmodels.Receiver, consumer.LogsConsumer) (component.LogsReceiver, error) -// factory is the factory for Jaeger gRPC exporter. type factory struct { cfgType configmodels.Type customUnmarshaler component.CustomUnmarshaler @@ -78,7 +77,7 @@ type factory struct { createLogsReceiver CreateLogsReceiver } -// NewFactory returns a component.ReceiverFactory that only supports all types. +// NewFactory returns a component.ReceiverFactory. func NewFactory( cfgType configmodels.Type, createDefaultConfig CreateDefaultConfig, @@ -152,8 +151,7 @@ type factoryWithUnmarshaler struct { *factory } -// CustomUnmarshaler returns a custom unmarshaler for the configuration or nil if -// there is no need for custom unmarshaling. +// Unmarshal un-marshals the config using the provided custom unmarshaler. func (f *factoryWithUnmarshaler) Unmarshal(componentViperSection *viper.Viper, intoCfg interface{}) error { return f.customUnmarshaler(componentViperSection, intoCfg) } diff --git a/service/defaultcomponents/defaults.go b/service/defaultcomponents/defaults.go index ef5caff091d..c0f8c9f2860 100644 --- a/service/defaultcomponents/defaults.go +++ b/service/defaultcomponents/defaults.go @@ -57,10 +57,10 @@ func Components() ( var errs []error extensions, err := component.MakeExtensionFactoryMap( - &healthcheckextension.Factory{}, - &pprofextension.Factory{}, - &zpagesextension.Factory{}, - &fluentbitextension.Factory{}, + healthcheckextension.NewFactory(), + pprofextension.NewFactory(), + zpagesextension.NewFactory(), + fluentbitextension.NewFactory(), ) if err != nil { errs = append(errs, err)