Skip to content

Commit cf09c2a

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 be92a1f commit cf09c2a

File tree

68 files changed

+948
-105
lines changed

Some content is hidden

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

68 files changed

+948
-105
lines changed

.chloggen/type-aliases.yaml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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+
# Optional: the name of a top-level section that the subtext will appear under, preceded by "Subtext:".
13+
# If not specified, the entry will not have a subtext section.
14+
# Please be careful not to use internal or API names that are not relevant to end users. For example, please use "myreceiverexporter" instead of "configpb".
15+
# If the entire description is short and no additional explanation is needed (less than ~25 words), do not use a subtext section.
16+
subtext: |
17+
To add a deprecated type alias to a component factory, use the `WithDeprecatedTypeAlias` option.
18+
```go
19+
return xexporter.NewFactory(
20+
metadata.Type,
21+
createDefaultConfig,
22+
xexporter.WithTraces(createTracesExporter, metadata.TracesStability),
23+
xexporter.WithDeprecatedTypeAlias("old_component_name"),
24+
)
25+
```
26+
When the alias is used in configuration, a deprecation warning will be automatically logged, and the component will function normally using the original implementation.
27+
28+
# One or more tracking issues or pull requests related to the change
29+
issues: [14208]
30+
31+
# Optional: The change log or logs in which this entry should be included.
32+
# e.g. '[user]' or '[user, api]'
33+
# Include 'user' if the change is relevant to end users.
34+
# Include 'api' if there is a change to a library API.
35+
# Default: '[user]'
36+
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

0 commit comments

Comments
 (0)