Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make MakeFactoryMap generic and move to otelcol #12220

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .chloggen/generic-makefactorymap.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.

# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: 'deprecation'

# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: receiver, scraper, processor, exporter, extension

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Deprecate existing MakeFactoryMap functions in favor of generic implementation

# One or more tracking issues or pull requests related to the change
issues: [12222]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext:

# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [api]
10 changes: 5 additions & 5 deletions cmd/builder/internal/builder/templates/components.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func components() (otelcol.Factories, error) {
var err error
factories := otelcol.Factories{}

factories.Extensions, err = extension.MakeFactoryMap(
factories.Extensions, err = otelcol.MakeFactoryMap[extension.Factory](
{{- range .Extensions}}
{{.Name}}.NewFactory(),
{{- end}}
Expand All @@ -44,7 +44,7 @@ func components() (otelcol.Factories, error) {
factories.ExtensionModules[{{.Name}}.NewFactory().Type()] = "{{.GoMod}}"
{{- end}}

factories.Receivers, err = receiver.MakeFactoryMap(
factories.Receivers, err = otelcol.MakeFactoryMap[receiver.Factory](
{{- range .Receivers}}
{{.Name}}.NewFactory(),
{{- end}}
Expand All @@ -57,7 +57,7 @@ func components() (otelcol.Factories, error) {
factories.ReceiverModules[{{.Name}}.NewFactory().Type()] = "{{.GoMod}}"
{{- end}}

factories.Exporters, err = exporter.MakeFactoryMap(
factories.Exporters, err = otelcol.MakeFactoryMap[exporter.Factory](
{{- range .Exporters}}
{{.Name}}.NewFactory(),
{{- end}}
Expand All @@ -70,7 +70,7 @@ func components() (otelcol.Factories, error) {
factories.ExporterModules[{{.Name}}.NewFactory().Type()] = "{{.GoMod}}"
{{- end}}

factories.Processors, err = processor.MakeFactoryMap(
factories.Processors, err = otelcol.MakeFactoryMap[processor.Factory](
{{- range .Processors}}
{{.Name}}.NewFactory(),
{{- end}}
Expand All @@ -83,7 +83,7 @@ func components() (otelcol.Factories, error) {
factories.ProcessorModules[{{.Name}}.NewFactory().Type()] = "{{.GoMod}}"
{{- end}}

factories.Connectors, err = connector.MakeFactoryMap(
factories.Connectors, err = otelcol.MakeFactoryMap[connector.Factory](
{{- range .Connectors}}
{{.Name}}.NewFactory(),
{{- end}}
Expand Down
10 changes: 5 additions & 5 deletions cmd/otelcorecol/components.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions connector/connector.go
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,8 @@ func NewFactory(cfgType component.Type, createDefaultConfig component.CreateDefa

// MakeFactoryMap takes a list of connector factories and returns a map with factory type as keys.
// It returns a non-nil error when there are factories with duplicate type.
//
// Deprecated: [v0.119.0] Use otelcol.MakeFactoryMap[connector.Factory] instead
func MakeFactoryMap(factories ...Factory) (map[component.Type]Factory, error) {
fMap := map[component.Type]Factory{}
for _, f := range factories {
Expand Down
2 changes: 2 additions & 0 deletions exporter/exporter.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,8 @@ func NewFactory(cfgType component.Type, createDefaultConfig component.CreateDefa

// MakeFactoryMap takes a list of factories and returns a map with Factory type as keys.
// It returns a non-nil error when there are factories with duplicate type.
//
// Deprecated: [v0.119.0] Use otelcol.MakeFactoryMap[exporter.Factory] instead
func MakeFactoryMap(factories ...Factory) (map[component.Type]Factory, error) {
fMap := map[component.Type]Factory{}
for _, f := range factories {
Expand Down
2 changes: 2 additions & 0 deletions extension/extension.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ func NewFactory(

// MakeFactoryMap takes a list of factories and returns a map with Factory type as keys.
// It returns a non-nil error when there are factories with duplicate type.
//
// Deprecated: [v0.119.0] Use otelcol.MakeFactoryMap[extension.Factory] instead
func MakeFactoryMap(factories ...Factory) (map[component.Type]Factory, error) {
fMap := map[component.Type]Factory{}
for _, f := range factories {
Expand Down
4 changes: 3 additions & 1 deletion internal/e2e/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ require (
go.opentelemetry.io/proto/otlp v1.5.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/text v0.21.0 // indirect
gonum.org/v1/gonum v0.15.1 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect
Expand Down Expand Up @@ -246,4 +246,6 @@ replace go.opentelemetry.io/collector/extension/auth/authtest => ../../extension

replace go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension

replace go.opentelemetry.io/collector/otelcol => ../../otelcol

replace go.opentelemetry.io/collector/component/componentattribute => ../../component/componentattribute
8 changes: 4 additions & 4 deletions internal/e2e/go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions otelcol/factories.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
package otelcol // import "go.opentelemetry.io/collector/otelcol"

import (
"fmt"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/connector"
"go.opentelemetry.io/collector/exporter"
Expand Down Expand Up @@ -45,3 +47,16 @@ type Factories struct {
// ConnectorModules maps connector types to their respective go modules.
ConnectorModules map[component.Type]string
}

// MakeFactoryMap takes a list of factories and returns a map with Factory type as keys.
// It returns a non-nil error when there are factories with duplicate type.
func MakeFactoryMap[T component.Factory](factories ...T) (map[component.Type]T, error) {
fMap := map[component.Type]T{}
for _, f := range factories {
if _, ok := fMap[f.Type()]; ok {
return fMap, fmt.Errorf("duplicate component factory %q", f.Type())
}
fMap[f.Type()] = f
}
return fMap, nil
}
59 changes: 54 additions & 5 deletions otelcol/factories_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
package otelcol

import (
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/connector"
"go.opentelemetry.io/collector/connector/connectortest"
Expand All @@ -21,39 +26,39 @@ func nopFactories() (Factories, error) {
var factories Factories
var err error

if factories.Connectors, err = connector.MakeFactoryMap(connectortest.NewNopFactory()); err != nil {
if factories.Connectors, err = MakeFactoryMap(connectortest.NewNopFactory()); err != nil {
return Factories{}, err
}
factories.ConnectorModules = make(map[component.Type]string, len(factories.Connectors))
for _, con := range factories.Connectors {
factories.ConnectorModules[con.Type()] = "go.opentelemetry.io/collector/connector/connectortest v1.2.3"
}

if factories.Extensions, err = extension.MakeFactoryMap(extensiontest.NewNopFactory()); err != nil {
if factories.Extensions, err = MakeFactoryMap(extensiontest.NewNopFactory()); err != nil {
return Factories{}, err
}
factories.ExtensionModules = make(map[component.Type]string, len(factories.Extensions))
for _, ext := range factories.Extensions {
factories.ExtensionModules[ext.Type()] = "go.opentelemetry.io/collector/extension/extensiontest v1.2.3"
}

if factories.Receivers, err = receiver.MakeFactoryMap(receivertest.NewNopFactory()); err != nil {
if factories.Receivers, err = MakeFactoryMap(receivertest.NewNopFactory()); err != nil {
return Factories{}, err
}
factories.ReceiverModules = make(map[component.Type]string, len(factories.Receivers))
for _, rec := range factories.Receivers {
factories.ReceiverModules[rec.Type()] = "go.opentelemetry.io/collector/receiver/receivertest v1.2.3"
}

if factories.Exporters, err = exporter.MakeFactoryMap(exportertest.NewNopFactory()); err != nil {
if factories.Exporters, err = MakeFactoryMap(exportertest.NewNopFactory()); err != nil {
return Factories{}, err
}
factories.ExporterModules = make(map[component.Type]string, len(factories.Exporters))
for _, exp := range factories.Exporters {
factories.ExporterModules[exp.Type()] = "go.opentelemetry.io/collector/exporter/exportertest v1.2.3"
}

if factories.Processors, err = processor.MakeFactoryMap(processortest.NewNopFactory()); err != nil {
if factories.Processors, err = MakeFactoryMap(processortest.NewNopFactory()); err != nil {
return Factories{}, err
}
factories.ProcessorModules = make(map[component.Type]string, len(factories.Processors))
Expand All @@ -63,3 +68,47 @@ func nopFactories() (Factories, error) {

return factories, err
}

func TestMakeFactoryMap(t *testing.T) {
type testCase struct {
name string
in []component.Factory
out map[component.Type]component.Factory
}

fRec := receiver.NewFactory(component.MustNewType("rec"), nil)
fRec2 := receiver.NewFactory(component.MustNewType("rec"), nil)
fPro := processor.NewFactory(component.MustNewType("pro"), nil)
fCon := connector.NewFactory(component.MustNewType("con"), nil)
fExp := exporter.NewFactory(component.MustNewType("exp"), nil)
fExt := extension.NewFactory(component.MustNewType("ext"), nil, nil, component.StabilityLevelUndefined)
testCases := []testCase{
{
name: "different names",
in: []component.Factory{fRec, fPro, fCon, fExp, fExt},
out: map[component.Type]component.Factory{
fRec.Type(): fRec,
fPro.Type(): fPro,
fCon.Type(): fCon,
fExp.Type(): fExp,
fExt.Type(): fExt,
},
},
{
name: "same name",
in: []component.Factory{fRec, fPro, fCon, fExp, fExt, fRec2},
},
}

for _, tt := range testCases {
t.Run(tt.name, func(t *testing.T) {
out, err := MakeFactoryMap(tt.in...)
if tt.out == nil {
assert.Error(t, err)
return
}
require.NoError(t, err)
assert.Equal(t, tt.out, out)
})
}
}
10 changes: 5 additions & 5 deletions otelcol/otelcoltest/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,12 @@ require (
go.opentelemetry.io/collector/confmap/provider/httpprovider v1.25.0
go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.25.0
go.opentelemetry.io/collector/confmap/xconfmap v0.0.0-20250205001856-68ff067415c1
go.opentelemetry.io/collector/connector v0.119.0
go.opentelemetry.io/collector/connector/connectortest v0.119.0
go.opentelemetry.io/collector/exporter v0.119.0
go.opentelemetry.io/collector/exporter/exportertest v0.119.0
go.opentelemetry.io/collector/extension v0.119.0
go.opentelemetry.io/collector/extension/extensiontest v0.119.0
go.opentelemetry.io/collector/otelcol v0.119.0
go.opentelemetry.io/collector/pipeline v0.119.0
go.opentelemetry.io/collector/processor v0.119.0
go.opentelemetry.io/collector/processor/processortest v0.119.0
go.opentelemetry.io/collector/receiver v0.119.0
go.opentelemetry.io/collector/receiver/receivertest v0.119.0
go.opentelemetry.io/collector/service v0.119.0
go.uber.org/goleak v1.3.0
Expand Down Expand Up @@ -70,20 +65,25 @@ require (
go.opentelemetry.io/collector/component/componentstatus v0.119.0 // indirect
go.opentelemetry.io/collector/component/componenttest v0.119.0 // indirect
go.opentelemetry.io/collector/config/configtelemetry v0.119.0 // indirect
go.opentelemetry.io/collector/connector v0.119.0 // indirect
go.opentelemetry.io/collector/connector/xconnector v0.119.0 // indirect
go.opentelemetry.io/collector/consumer v1.25.0 // indirect
go.opentelemetry.io/collector/consumer/consumererror v0.119.0 // indirect
go.opentelemetry.io/collector/consumer/consumertest v0.119.0 // indirect
go.opentelemetry.io/collector/consumer/xconsumer v0.119.0 // indirect
go.opentelemetry.io/collector/exporter v0.119.0 // indirect
go.opentelemetry.io/collector/exporter/xexporter v0.119.0 // indirect
go.opentelemetry.io/collector/extension v0.119.0 // indirect
go.opentelemetry.io/collector/extension/extensioncapabilities v0.119.0 // indirect
go.opentelemetry.io/collector/featuregate v1.25.0 // indirect
go.opentelemetry.io/collector/internal/fanoutconsumer v0.119.0 // indirect
go.opentelemetry.io/collector/pdata v1.25.0 // indirect
go.opentelemetry.io/collector/pdata/pprofile v0.119.0 // indirect
go.opentelemetry.io/collector/pdata/testdata v0.119.0 // indirect
go.opentelemetry.io/collector/pipeline/xpipeline v0.119.0 // indirect
go.opentelemetry.io/collector/processor v0.119.0 // indirect
go.opentelemetry.io/collector/processor/xprocessor v0.119.0 // indirect
go.opentelemetry.io/collector/receiver v0.119.0 // indirect
go.opentelemetry.io/collector/receiver/xreceiver v0.119.0 // indirect
go.opentelemetry.io/collector/semconv v0.119.0 // indirect
go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 // indirect
Expand Down
Loading
Loading