Skip to content

Commit 8578ef4

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 8578ef4

File tree

66 files changed

+626
-92
lines changed

Some content is hidden

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

66 files changed

+626
-92
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]

.github/workflows/utils/cspell.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
"cmux",
126126
"codeboten",
127127
"codeowners",
128+
"componentalias",
128129
"componenterror",
129130
"componenthelper",
130131
"componentprofiles",

cmd/builder/internal/builder/main_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ var replaceModules = []string{
8888
"/extension/zpagesextension",
8989
"/extension/xextension",
9090
"/featuregate",
91+
"/internal/componentalias",
9192
"/internal/memorylimiter",
9293
"/internal/fanoutconsumer",
9394
"/internal/sharedcomponent",

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/builder-config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ replaces:
8989
- go.opentelemetry.io/collector/extension/xextension => ../../extension/xextension
9090
- go.opentelemetry.io/collector/extension/zpagesextension => ../../extension/zpagesextension
9191
- go.opentelemetry.io/collector/featuregate => ../../featuregate
92+
- go.opentelemetry.io/collector/internal/componentalias => ../../internal/componentalias
9293
- go.opentelemetry.io/collector/internal/memorylimiter => ../../internal/memorylimiter
9394
- go.opentelemetry.io/collector/internal/fanoutconsumer => ../../internal/fanoutconsumer
9495
- go.opentelemetry.io/collector/internal/telemetry => ../../internal/telemetry

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
@@ -279,6 +280,8 @@ replace go.opentelemetry.io/collector/extension/zpagesextension => ../../extensi
279280

280281
replace go.opentelemetry.io/collector/featuregate => ../../featuregate
281282

283+
replace go.opentelemetry.io/collector/internal/componentalias => ../../internal/componentalias
284+
282285
replace go.opentelemetry.io/collector/internal/memorylimiter => ../../internal/memorylimiter
283286

284287
replace go.opentelemetry.io/collector/internal/fanoutconsumer => ../../internal/fanoutconsumer

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
@@ -9,6 +9,7 @@ import (
99
"go.opentelemetry.io/collector/component"
1010
"go.opentelemetry.io/collector/connector/internal"
1111
"go.opentelemetry.io/collector/consumer"
12+
"go.opentelemetry.io/collector/internal/componentalias"
1213
"go.opentelemetry.io/collector/pipeline"
1314
)
1415

@@ -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)

0 commit comments

Comments
 (0)