Skip to content

Commit

Permalink
Make component.Factory inherit internalinterface.InternalInterface (
Browse files Browse the repository at this point in the history
#4338)

* Make `component.Factory` inherit `internalinterface.InternalInterface`

* Add changelog entry

* Add comment on `component.Factory`
  • Loading branch information
mx-psi committed Nov 2, 2021
1 parent 9cdb1da commit 9631cea
Show file tree
Hide file tree
Showing 14 changed files with 53 additions and 61 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Expand Up @@ -5,6 +5,9 @@
## 🛑 Breaking changes 🛑

- Remove `component.BaseProcessorFactory`, use `processorhelper.NewFactory` instead (#4175)
- Force usage of `exporterhelper.NewFactory` to implement `component.ExporterFactory` (#4338)
- Force usage of `receiverhelper.NewFactory` to implement `component.ReceiverFactory` (#4338)
- Force usage of `extensionhelper.NewFactory` to implement `component.ExtensionFactory` (#4338)
- Move `service/parserprovider` package to `config/configmapprovider` (#4206)
- Remove `config.Pipeline.Name` (#4326)

Expand Down
5 changes: 5 additions & 0 deletions component/component.go
Expand Up @@ -18,6 +18,7 @@ import (
"context"

"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/internal/internalinterface"
)

// Component is either a receiver, exporter, processor, or an extension.
Expand Down Expand Up @@ -72,7 +73,11 @@ const (
)

// Factory is implemented by all component factories.
//
// This interface cannot be directly implemented. Implementations must
// use the factory helpers for the appropriate component type.
type Factory interface {
internalinterface.InternalInterface
// Type gets the type of the component created by this factory.
Type() config.Type
}
5 changes: 4 additions & 1 deletion component/componenttest/nop_exporter.go
Expand Up @@ -21,6 +21,7 @@ import (
"go.opentelemetry.io/collector/component/componenthelper"
"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/consumer/consumertest"
"go.opentelemetry.io/collector/internal/internalinterface"
)

// NewNopExporterCreateSettings returns a new nop settings for Create*Exporter functions.
Expand All @@ -36,7 +37,9 @@ type nopExporterConfig struct {
}

// nopExporterFactory is factory for nopExporter.
type nopExporterFactory struct{}
type nopExporterFactory struct {
internalinterface.BaseInternal
}

var nopExporterFactoryInstance = &nopExporterFactory{}

Expand Down
5 changes: 4 additions & 1 deletion component/componenttest/nop_extension.go
Expand Up @@ -20,6 +20,7 @@ import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componenthelper"
"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/internal/internalinterface"
)

// NewNopExtensionCreateSettings returns a new nop settings for Create*Extension functions.
Expand All @@ -35,7 +36,9 @@ type nopExtensionConfig struct {
}

// nopExtensionFactory is factory for nopExtension.
type nopExtensionFactory struct{}
type nopExtensionFactory struct {
internalinterface.BaseInternal
}

var nopExtensionFactoryInstance = &nopExtensionFactory{}

Expand Down
5 changes: 4 additions & 1 deletion component/componenttest/nop_receiver.go
Expand Up @@ -21,6 +21,7 @@ import (
"go.opentelemetry.io/collector/component/componenthelper"
"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/internal/internalinterface"
)

// NewNopReceiverCreateSettings returns a new nop settings for Create*Receiver functions.
Expand All @@ -36,7 +37,9 @@ type nopReceiverConfig struct {
}

// nopReceiverFactory is factory for nopReceiver.
type nopReceiverFactory struct{}
type nopReceiverFactory struct {
internalinterface.BaseInternal
}

var nopReceiverFactoryInstance = &nopReceiverFactory{}

Expand Down
3 changes: 3 additions & 0 deletions component/exporter.go
Expand Up @@ -54,6 +54,9 @@ type ExporterCreateSettings struct {

// ExporterFactory can create MetricsExporter, TracesExporter and
// LogsExporter. This is the new preferred factory type to create exporters.
//
// This interface cannot be directly implemented. Implementations must
// use the exporterhelper.NewFactory to implement it.
type ExporterFactory interface {
Factory

Expand Down
35 changes: 7 additions & 28 deletions component/exporter_test.go
Expand Up @@ -15,16 +15,15 @@
package component

import (
"context"
"testing"

"github.com/stretchr/testify/assert"

"go.opentelemetry.io/collector/component/componenterror"
"go.opentelemetry.io/collector/config"
)

type TestExporterFactory struct {
ExporterFactory
name string
}

Expand All @@ -33,26 +32,6 @@ func (f *TestExporterFactory) Type() config.Type {
return config.Type(f.name)
}

// CreateDefaultConfig creates the default configuration for the Exporter.
func (f *TestExporterFactory) CreateDefaultConfig() config.Exporter {
return nil
}

// CreateTracesExporter creates a trace exporter based on this config.
func (f *TestExporterFactory) CreateTracesExporter(context.Context, ExporterCreateSettings, config.Exporter) (TracesExporter, error) {
return nil, componenterror.ErrDataTypeIsNotSupported
}

// CreateMetricsExporter creates a metrics exporter based on this config.
func (f *TestExporterFactory) CreateMetricsExporter(context.Context, ExporterCreateSettings, config.Exporter) (MetricsExporter, error) {
return nil, componenterror.ErrDataTypeIsNotSupported
}

// CreateLogsExporter creates a logs exporter based on this config.
func (f *TestExporterFactory) CreateLogsExporter(context.Context, ExporterCreateSettings, config.Exporter) (LogsExporter, error) {
return nil, componenterror.ErrDataTypeIsNotSupported
}

func TestBuildExporters(t *testing.T) {
type testCase struct {
in []ExporterFactory
Expand All @@ -62,18 +41,18 @@ func TestBuildExporters(t *testing.T) {
testCases := []testCase{
{
in: []ExporterFactory{
&TestExporterFactory{"exp1"},
&TestExporterFactory{"exp2"},
&TestExporterFactory{name: "exp1"},
&TestExporterFactory{name: "exp2"},
},
out: map[config.Type]ExporterFactory{
"exp1": &TestExporterFactory{"exp1"},
"exp2": &TestExporterFactory{"exp2"},
"exp1": &TestExporterFactory{name: "exp1"},
"exp2": &TestExporterFactory{name: "exp2"},
},
},
{
in: []ExporterFactory{
&TestExporterFactory{"exp1"},
&TestExporterFactory{"exp1"},
&TestExporterFactory{name: "exp1"},
&TestExporterFactory{name: "exp1"},
},
},
}
Expand Down
3 changes: 3 additions & 0 deletions component/extension.go
Expand Up @@ -53,6 +53,9 @@ type ExtensionCreateSettings struct {
}

// ExtensionFactory is a factory interface for extensions to the service.
//
// This interface cannot be directly implemented. Implementations must
// use the extensionhelper.NewFactory to implement it.
type ExtensionFactory interface {
Factory

Expand Down
3 changes: 3 additions & 0 deletions component/receiver.go
Expand Up @@ -99,6 +99,9 @@ type ReceiverCreateSettings struct {

// ReceiverFactory can create TracesReceiver, MetricsReceiver and
// and LogsReceiver. This is the new preferred factory type to create receivers.
//
// This interface cannot be directly implemented. Implementations must
// use the receiverhelper.NewFactory to implement it.
type ReceiverFactory interface {
Factory

Expand Down
36 changes: 7 additions & 29 deletions component/receiver_test.go
Expand Up @@ -15,17 +15,15 @@
package component

import (
"context"
"testing"

"github.com/stretchr/testify/assert"

"go.opentelemetry.io/collector/component/componenterror"
"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/consumer"
)

type TestReceiverFactory struct {
ReceiverFactory
name config.Type
}

Expand All @@ -34,26 +32,6 @@ func (f *TestReceiverFactory) Type() config.Type {
return f.name
}

// CreateDefaultConfig creates the default configuration for the Receiver.
func (f *TestReceiverFactory) CreateDefaultConfig() config.Receiver {
return nil
}

// CreateTracesReceiver creates a trace receiver based on this config.
func (f *TestReceiverFactory) CreateTracesReceiver(context.Context, ReceiverCreateSettings, config.Receiver, consumer.Traces) (TracesReceiver, error) {
return nil, componenterror.ErrDataTypeIsNotSupported
}

// CreateMetricsReceiver creates a metrics receiver based on this config.
func (f *TestReceiverFactory) CreateMetricsReceiver(context.Context, ReceiverCreateSettings, config.Receiver, consumer.Metrics) (MetricsReceiver, error) {
return nil, componenterror.ErrDataTypeIsNotSupported
}

// CreateMetricsReceiver creates a metrics receiver based on this config.
func (f *TestReceiverFactory) CreateLogsReceiver(context.Context, ReceiverCreateSettings, config.Receiver, consumer.Logs) (LogsReceiver, error) {
return nil, componenterror.ErrDataTypeIsNotSupported
}

func TestBuildReceivers(t *testing.T) {
type testCase struct {
in []ReceiverFactory
Expand All @@ -63,18 +41,18 @@ func TestBuildReceivers(t *testing.T) {
testCases := []testCase{
{
in: []ReceiverFactory{
&TestReceiverFactory{"e1"},
&TestReceiverFactory{"e2"},
&TestReceiverFactory{name: "e1"},
&TestReceiverFactory{name: "e2"},
},
out: map[config.Type]ReceiverFactory{
"e1": &TestReceiverFactory{"e1"},
"e2": &TestReceiverFactory{"e2"},
"e1": &TestReceiverFactory{name: "e1"},
"e2": &TestReceiverFactory{name: "e2"},
},
},
{
in: []ReceiverFactory{
&TestReceiverFactory{"e1"},
&TestReceiverFactory{"e1"},
&TestReceiverFactory{name: "e1"},
&TestReceiverFactory{name: "e1"},
},
},
}
Expand Down
2 changes: 2 additions & 0 deletions exporter/exporterhelper/factory.go
Expand Up @@ -20,6 +20,7 @@ import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componenterror"
"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/internal/internalinterface"
)

// FactoryOption apply changes to ExporterOptions.
Expand All @@ -38,6 +39,7 @@ type CreateMetricsExporter func(context.Context, component.ExporterCreateSetting
type CreateLogsExporter func(context.Context, component.ExporterCreateSettings, config.Exporter) (component.LogsExporter, error)

type factory struct {
internalinterface.BaseInternal
cfgType config.Type
createDefaultConfig CreateDefaultConfig
createTracesExporter CreateTracesExporter
Expand Down
2 changes: 2 additions & 0 deletions extension/extensionhelper/factory.go
Expand Up @@ -19,6 +19,7 @@ import (

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/internal/internalinterface"
)

// FactoryOption apply changes to ExporterOptions.
Expand All @@ -31,6 +32,7 @@ type CreateDefaultConfig func() config.Extension
type CreateServiceExtension func(context.Context, component.ExtensionCreateSettings, config.Extension) (component.Extension, error)

type factory struct {
internalinterface.BaseInternal
cfgType config.Type
createDefaultConfig CreateDefaultConfig
createServiceExtension CreateServiceExtension
Expand Down
2 changes: 2 additions & 0 deletions receiver/receiverhelper/factory.go
Expand Up @@ -21,6 +21,7 @@ import (
"go.opentelemetry.io/collector/component/componenterror"
"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/internal/internalinterface"
)

// FactoryOption apply changes to ReceiverOptions.
Expand Down Expand Up @@ -60,6 +61,7 @@ type CreateMetricsReceiver func(context.Context, component.ReceiverCreateSetting
type CreateLogsReceiver func(context.Context, component.ReceiverCreateSettings, config.Receiver, consumer.Logs) (component.LogsReceiver, error)

type factory struct {
internalinterface.BaseInternal
cfgType config.Type
createDefaultConfig CreateDefaultConfig
createTracesReceiver CreateTracesReceiver
Expand Down
5 changes: 4 additions & 1 deletion service/configcheck_test.go
Expand Up @@ -22,6 +22,7 @@ import (

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config"
"go.opentelemetry.io/collector/internal/internalinterface"
"go.opentelemetry.io/collector/service/defaultcomponents"
)

Expand All @@ -47,7 +48,9 @@ func TestValidateConfigFromFactories_Failure(t *testing.T) {

// badConfigExtensionFactory was created to force error path from factory returning
// a config not satisfying the validation.
type badConfigExtensionFactory struct{}
type badConfigExtensionFactory struct {
internalinterface.BaseInternal
}

func (b badConfigExtensionFactory) Type() config.Type {
return "bad_config"
Expand Down

0 comments on commit 9631cea

Please sign in to comment.