Skip to content

Commit 68b5783

Browse files
committed
Add support for deprecated component type aliases
This change allows component authors to register one optional deprecated alias per component type, enabling smooth migrations when renaming components. When an alias is used in configuration, the collector will automatically resolve it to the original component and log a deprecation warning. Changes: - Add `WithDeprecatedTypeAlias` factory option to experimental modules (xreceiver, xexporter, xprocessor, xconnector) - Add `DeprecatedAlias()` method to factory interfaces - Generate alias expansion code in builder template that: - Populates factory maps with aliases pointing to original factories - Updates module information maps for aliased types - Validates that aliases don't conflict with existing component types - Add deprecation warnings that log when an alias is used: "Using deprecated alias <alias>; use <original> instead" Extensions are left aside for now.
1 parent ee8646e commit 68b5783

File tree

64 files changed

+634
-91
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+634
-91
lines changed

.chloggen/type-aliases.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Use this changelog template to create an entry for release notes.
2+
3+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
4+
change_type: enhancement
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. receiver/otlp)
7+
component: all
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Add support for deprecated component type aliases
11+
12+
# One or more tracking issues or pull requests related to the change
13+
issues: [14208]
14+
15+
# Optional: The change log or logs in which this entry should be included.
16+
# e.g. '[user]' or '[user, api]'
17+
# Include 'user' if the change is relevant to end users.
18+
# Include 'api' if there is a change to a library API.
19+
# Default: '[user]'
20+
change_logs: [api]

cmd/builder/internal/builder/templates/components.go.tmpl

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ import (
2828
{{- end}}
2929
)
3030

31+
type aliasProvider interface{ DeprecatedAlias() component.Type }
32+
33+
func makeModulesMap[T component.Factory](factories map[component.Type]T, modules map[component.Type]string) map[component.Type]string {
34+
for compType, factory := range factories {
35+
if ap, ok := any(factory).(aliasProvider); ok {
36+
alias := ap.DeprecatedAlias()
37+
if alias.String() != "" {
38+
modules[alias] = modules[compType]
39+
}
40+
}
41+
}
42+
return modules
43+
}
44+
3145
func components() (otelcol.Factories, error) {
3246
var err error
3347
factories := otelcol.Factories{
@@ -42,10 +56,11 @@ func components() (otelcol.Factories, error) {
4256
if err != nil {
4357
return otelcol.Factories{}, err
4458
}
45-
factories.ExtensionModules = make(map[component.Type]string, len(factories.Extensions))
46-
{{- range .Extensions}}
47-
factories.ExtensionModules[{{.Name}}.NewFactory().Type()] = "{{.GoMod}}"
48-
{{- end}}
59+
factories.ExtensionModules = makeModulesMap(factories.Extensions, map[component.Type]string{
60+
{{- range .Extensions}}
61+
{{.Name}}.NewFactory().Type(): "{{.GoMod}}",
62+
{{- end}}
63+
})
4964

5065
factories.Receivers, err = otelcol.MakeFactoryMap[receiver.Factory](
5166
{{- range .Receivers}}
@@ -55,10 +70,11 @@ func components() (otelcol.Factories, error) {
5570
if err != nil {
5671
return otelcol.Factories{}, err
5772
}
58-
factories.ReceiverModules = make(map[component.Type]string, len(factories.Receivers))
59-
{{- range .Receivers}}
60-
factories.ReceiverModules[{{.Name}}.NewFactory().Type()] = "{{.GoMod}}"
61-
{{- end}}
73+
factories.ReceiverModules = makeModulesMap(factories.Receivers, map[component.Type]string{
74+
{{- range .Receivers}}
75+
{{.Name}}.NewFactory().Type(): "{{.GoMod}}",
76+
{{- end}}
77+
})
6278

6379
factories.Exporters, err = otelcol.MakeFactoryMap[exporter.Factory](
6480
{{- range .Exporters}}
@@ -68,10 +84,11 @@ func components() (otelcol.Factories, error) {
6884
if err != nil {
6985
return otelcol.Factories{}, err
7086
}
71-
factories.ExporterModules = make(map[component.Type]string, len(factories.Exporters))
72-
{{- range .Exporters}}
73-
factories.ExporterModules[{{.Name}}.NewFactory().Type()] = "{{.GoMod}}"
74-
{{- end}}
87+
factories.ExporterModules = makeModulesMap(factories.Exporters, map[component.Type]string{
88+
{{- range .Exporters}}
89+
{{.Name}}.NewFactory().Type(): "{{.GoMod}}",
90+
{{- end}}
91+
})
7592

7693
factories.Processors, err = otelcol.MakeFactoryMap[processor.Factory](
7794
{{- range .Processors}}
@@ -81,10 +98,11 @@ func components() (otelcol.Factories, error) {
8198
if err != nil {
8299
return otelcol.Factories{}, err
83100
}
84-
factories.ProcessorModules = make(map[component.Type]string, len(factories.Processors))
85-
{{- range .Processors}}
86-
factories.ProcessorModules[{{.Name}}.NewFactory().Type()] = "{{.GoMod}}"
87-
{{- end}}
101+
factories.ProcessorModules = makeModulesMap(factories.Processors, map[component.Type]string{
102+
{{- range .Processors}}
103+
{{.Name}}.NewFactory().Type(): "{{.GoMod}}",
104+
{{- end}}
105+
})
88106

89107
factories.Connectors, err = otelcol.MakeFactoryMap[connector.Factory](
90108
{{- range .Connectors}}
@@ -94,10 +112,11 @@ func components() (otelcol.Factories, error) {
94112
if err != nil {
95113
return otelcol.Factories{}, err
96114
}
97-
factories.ConnectorModules = make(map[component.Type]string, len(factories.Connectors))
98-
{{- range .Connectors}}
99-
factories.ConnectorModules[{{.Name}}.NewFactory().Type()] = "{{.GoMod}}"
100-
{{- end}}
115+
factories.ConnectorModules = makeModulesMap(factories.Connectors, map[component.Type]string{
116+
{{- range .Connectors}}
117+
{{.Name}}.NewFactory().Type(): "{{.GoMod}}",
118+
{{- end}}
119+
})
101120

102121
return factories, nil
103122
}

cmd/mdatagen/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ require (
6161
go.opentelemetry.io/collector/consumer/consumererror v0.143.0 // indirect
6262
go.opentelemetry.io/collector/consumer/xconsumer v0.143.0 // indirect
6363
go.opentelemetry.io/collector/featuregate v1.49.0 // indirect
64+
go.opentelemetry.io/collector/internal/componentalias v0.0.0-00010101000000-000000000000 // indirect
6465
go.opentelemetry.io/collector/internal/fanoutconsumer v0.143.0 // indirect
6566
go.opentelemetry.io/collector/pdata/pprofile v0.143.0 // indirect
6667
go.opentelemetry.io/collector/pdata/testdata v0.143.0 // indirect
@@ -200,3 +201,5 @@ replace go.opentelemetry.io/collector/exporter/exporterhelper => ../../exporter/
200201
replace go.opentelemetry.io/collector/service/telemetry/telemetrytest => ../../service/telemetry/telemetrytest
201202

202203
replace go.opentelemetry.io/collector/internal/testutil => ../../internal/testutil
204+
205+
replace go.opentelemetry.io/collector/internal/componentalias => ../../internal/componentalias

cmd/otelcorecol/components.go

Lines changed: 35 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/otelcorecol/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ require (
116116
go.opentelemetry.io/collector/extension/extensiontest v0.143.0 // indirect
117117
go.opentelemetry.io/collector/extension/xextension v0.143.0 // indirect
118118
go.opentelemetry.io/collector/featuregate v1.49.0 // indirect
119+
go.opentelemetry.io/collector/internal/componentalias v0.0.0-00010101000000-000000000000 // indirect
119120
go.opentelemetry.io/collector/internal/fanoutconsumer v0.143.0 // indirect
120121
go.opentelemetry.io/collector/internal/memorylimiter v0.143.0 // indirect
121122
go.opentelemetry.io/collector/internal/sharedcomponent v0.143.0 // indirect
@@ -334,3 +335,5 @@ replace go.opentelemetry.io/collector/service => ../../service
334335
replace go.opentelemetry.io/collector/service/hostcapabilities => ../../service/hostcapabilities
335336

336337
replace go.opentelemetry.io/collector/service/telemetry/telemetrytest => ../../service/telemetry/telemetrytest
338+
339+
replace go.opentelemetry.io/collector/internal/componentalias => ../../internal/componentalias

cmd/otelcorecol/otelcorecol

38.5 MB
Binary file not shown.

connector/connector.go

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88

99
"go.opentelemetry.io/collector/component"
10+
"go.opentelemetry.io/collector/internal/componentalias"
1011
"go.opentelemetry.io/collector/connector/internal"
1112
"go.opentelemetry.io/collector/consumer"
1213
"go.opentelemetry.io/collector/pipeline"
@@ -234,6 +235,7 @@ func WithLogsToLogs(createLogsToLogs CreateLogsToLogsFunc, sl component.Stabilit
234235
type factory struct {
235236
cfgType component.Type
236237
component.CreateDefaultConfigFunc
238+
componentalias.TypeAliasHolder
237239

238240
createTracesToTracesFunc CreateTracesToTracesFunc
239241
createTracesToMetricsFunc CreateTracesToMetricsFunc
@@ -308,8 +310,8 @@ func (f *factory) CreateTracesToTraces(ctx context.Context, set Settings, cfg co
308310
return nil, internal.ErrDataTypes(set.ID, pipeline.SignalTraces, pipeline.SignalTraces)
309311
}
310312

311-
if set.ID.Type() != f.Type() {
312-
return nil, internal.ErrIDMismatch(set.ID, f.Type())
313+
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
314+
return nil, err
313315
}
314316

315317
return f.createTracesToTracesFunc(ctx, set, cfg, next)
@@ -320,8 +322,8 @@ func (f *factory) CreateTracesToMetrics(ctx context.Context, set Settings, cfg c
320322
return nil, internal.ErrDataTypes(set.ID, pipeline.SignalTraces, pipeline.SignalMetrics)
321323
}
322324

323-
if set.ID.Type() != f.Type() {
324-
return nil, internal.ErrIDMismatch(set.ID, f.Type())
325+
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
326+
return nil, err
325327
}
326328

327329
return f.createTracesToMetricsFunc(ctx, set, cfg, next)
@@ -332,8 +334,8 @@ func (f *factory) CreateTracesToLogs(ctx context.Context, set Settings, cfg comp
332334
return nil, internal.ErrDataTypes(set.ID, pipeline.SignalTraces, pipeline.SignalLogs)
333335
}
334336

335-
if set.ID.Type() != f.Type() {
336-
return nil, internal.ErrIDMismatch(set.ID, f.Type())
337+
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
338+
return nil, err
337339
}
338340

339341
return f.createTracesToLogsFunc(ctx, set, cfg, next)
@@ -344,8 +346,8 @@ func (f *factory) CreateMetricsToTraces(ctx context.Context, set Settings, cfg c
344346
return nil, internal.ErrDataTypes(set.ID, pipeline.SignalMetrics, pipeline.SignalTraces)
345347
}
346348

347-
if set.ID.Type() != f.Type() {
348-
return nil, internal.ErrIDMismatch(set.ID, f.Type())
349+
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
350+
return nil, err
349351
}
350352

351353
return f.createMetricsToTracesFunc(ctx, set, cfg, next)
@@ -356,8 +358,8 @@ func (f *factory) CreateMetricsToMetrics(ctx context.Context, set Settings, cfg
356358
return nil, internal.ErrDataTypes(set.ID, pipeline.SignalMetrics, pipeline.SignalMetrics)
357359
}
358360

359-
if set.ID.Type() != f.Type() {
360-
return nil, internal.ErrIDMismatch(set.ID, f.Type())
361+
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
362+
return nil, err
361363
}
362364

363365
return f.createMetricsToMetricsFunc(ctx, set, cfg, next)
@@ -368,8 +370,8 @@ func (f *factory) CreateMetricsToLogs(ctx context.Context, set Settings, cfg com
368370
return nil, internal.ErrDataTypes(set.ID, pipeline.SignalMetrics, pipeline.SignalLogs)
369371
}
370372

371-
if set.ID.Type() != f.Type() {
372-
return nil, internal.ErrIDMismatch(set.ID, f.Type())
373+
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
374+
return nil, err
373375
}
374376

375377
return f.createMetricsToLogsFunc(ctx, set, cfg, next)
@@ -380,8 +382,8 @@ func (f *factory) CreateLogsToTraces(ctx context.Context, set Settings, cfg comp
380382
return nil, internal.ErrDataTypes(set.ID, pipeline.SignalLogs, pipeline.SignalTraces)
381383
}
382384

383-
if set.ID.Type() != f.Type() {
384-
return nil, internal.ErrIDMismatch(set.ID, f.Type())
385+
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
386+
return nil, err
385387
}
386388

387389
return f.createLogsToTracesFunc(ctx, set, cfg, next)
@@ -392,8 +394,8 @@ func (f *factory) CreateLogsToMetrics(ctx context.Context, set Settings, cfg com
392394
return nil, internal.ErrDataTypes(set.ID, pipeline.SignalLogs, pipeline.SignalMetrics)
393395
}
394396

395-
if set.ID.Type() != f.Type() {
396-
return nil, internal.ErrIDMismatch(set.ID, f.Type())
397+
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
398+
return nil, err
397399
}
398400

399401
return f.createLogsToMetricsFunc(ctx, set, cfg, next)
@@ -404,8 +406,8 @@ func (f *factory) CreateLogsToLogs(ctx context.Context, set Settings, cfg compon
404406
return nil, internal.ErrDataTypes(set.ID, pipeline.SignalLogs, pipeline.SignalLogs)
405407
}
406408

407-
if set.ID.Type() != f.Type() {
408-
return nil, internal.ErrIDMismatch(set.ID, f.Type())
409+
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
410+
return nil, err
409411
}
410412

411413
return f.createLogsToLogsFunc(ctx, set, cfg, next)
@@ -416,6 +418,7 @@ func NewFactory(cfgType component.Type, createDefaultConfig component.CreateDefa
416418
f := &factory{
417419
cfgType: cfgType,
418420
CreateDefaultConfigFunc: createDefaultConfig,
421+
TypeAliasHolder: componentalias.NewTypeAliasHolder(),
419422
}
420423
for _, opt := range options {
421424
opt.apply(f)

connector/connectortest/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ require (
2929
github.com/pmezard/go-difflib v1.0.0 // indirect
3030
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
3131
go.opentelemetry.io/collector/featuregate v1.49.0 // indirect
32+
go.opentelemetry.io/collector/internal/componentalias v0.0.0-00010101000000-000000000000 // indirect
3233
go.opentelemetry.io/collector/internal/fanoutconsumer v0.143.0 // indirect
3334
go.opentelemetry.io/collector/pipeline v1.49.0 // indirect
3435
go.opentelemetry.io/collector/pipeline/xpipeline v0.143.0 // indirect
@@ -72,3 +73,5 @@ replace go.opentelemetry.io/collector/internal/fanoutconsumer => ../../internal/
7273
replace go.opentelemetry.io/collector/featuregate => ../../featuregate
7374

7475
replace go.opentelemetry.io/collector/internal/testutil => ../../internal/testutil
76+
77+
replace go.opentelemetry.io/collector/internal/componentalias => ../../internal/componentalias

connector/forwardconnector/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ require (
3939
github.com/pmezard/go-difflib v1.0.0 // indirect
4040
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
4141
go.opentelemetry.io/collector/featuregate v1.49.0 // indirect
42+
go.opentelemetry.io/collector/internal/componentalias v0.0.0-00010101000000-000000000000 // indirect
4243
go.opentelemetry.io/collector/internal/fanoutconsumer v0.143.0 // indirect
4344
go.opentelemetry.io/collector/pipeline/xpipeline v0.143.0 // indirect
4445
go.opentelemetry.io/otel v1.39.0 // indirect
@@ -91,3 +92,5 @@ replace go.opentelemetry.io/collector/internal/fanoutconsumer => ../../internal/
9192
replace go.opentelemetry.io/collector/featuregate => ../../featuregate
9293

9394
replace go.opentelemetry.io/collector/internal/testutil => ../../internal/testutil
95+
96+
replace go.opentelemetry.io/collector/internal/componentalias => ../../internal/componentalias

0 commit comments

Comments
 (0)