Files
Dmitry AnoshinandGitHub 6ed11d9842 Add support for deprecated component type aliases (#14349)
Related to
https://github.com/open-telemetry/opentelemetry-collector/issues/14208

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)
- 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.
2026-01-08 00:01:09 +00:00

207 lines
6.3 KiB
Go

// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package exporter // import "go.opentelemetry.io/collector/exporter"
import (
"context"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/internal/componentalias"
"go.opentelemetry.io/collector/pipeline"
)
// Traces is an exporter that can consume traces.
type Traces interface {
component.Component
consumer.Traces
}
// Metrics is an exporter that can consume metrics.
type Metrics interface {
component.Component
consumer.Metrics
}
// Logs is an exporter that can consume logs.
type Logs interface {
component.Component
consumer.Logs
}
// Settings configures exporter creators.
type Settings struct {
// ID returns the ID of the component that will be created.
ID component.ID
component.TelemetrySettings
// BuildInfo can be used by components for informational purposes
BuildInfo component.BuildInfo
// prevent unkeyed literal initialization
_ struct{}
}
// Factory is factory interface for exporters.
//
// This interface cannot be directly implemented. Implementations must
// use the NewFactory to implement it.
type Factory interface {
component.Factory
// CreateTraces creates a Traces exporter based on this config.
// If the exporter type does not support tracing,
// this function returns the error [pipeline.ErrSignalNotSupported].
CreateTraces(ctx context.Context, set Settings, cfg component.Config) (Traces, error)
// TracesStability gets the stability level of the Traces exporter.
TracesStability() component.StabilityLevel
// CreateMetrics creates a Metrics exporter based on this config.
// If the exporter type does not support metrics,
// this function returns the error [pipeline.ErrSignalNotSupported].
CreateMetrics(ctx context.Context, set Settings, cfg component.Config) (Metrics, error)
// MetricsStability gets the stability level of the Metrics exporter.
MetricsStability() component.StabilityLevel
// CreateLogs creates a Logs exporter based on the config.
// If the exporter type does not support logs,
// this function returns the error [pipeline.ErrSignalNotSupported].
CreateLogs(ctx context.Context, set Settings, cfg component.Config) (Logs, error)
// LogsStability gets the stability level of the Logs exporter.
LogsStability() component.StabilityLevel
unexportedFactoryFunc()
}
// FactoryOption apply changes to Factory.
type FactoryOption interface {
// applyOption applies the option.
applyOption(o *factory)
}
var _ FactoryOption = (*factoryOptionFunc)(nil)
// factoryOptionFunc is an FactoryOption created through a function.
type factoryOptionFunc func(*factory)
func (f factoryOptionFunc) applyOption(o *factory) {
f(o)
}
// CreateTracesFunc is the equivalent of Factory.CreateTraces.
type CreateTracesFunc func(context.Context, Settings, component.Config) (Traces, error)
// CreateMetricsFunc is the equivalent of Factory.CreateMetrics.
type CreateMetricsFunc func(context.Context, Settings, component.Config) (Metrics, error)
// CreateLogsFunc is the equivalent of Factory.CreateLogs.
type CreateLogsFunc func(context.Context, Settings, component.Config) (Logs, error)
type factory struct {
cfgType component.Type
component.CreateDefaultConfigFunc
componentalias.TypeAliasHolder
createTracesFunc CreateTracesFunc
tracesStabilityLevel component.StabilityLevel
createMetricsFunc CreateMetricsFunc
metricsStabilityLevel component.StabilityLevel
createLogsFunc CreateLogsFunc
logsStabilityLevel component.StabilityLevel
}
func (f *factory) Type() component.Type {
return f.cfgType
}
func (f *factory) unexportedFactoryFunc() {}
func (f *factory) TracesStability() component.StabilityLevel {
return f.tracesStabilityLevel
}
func (f *factory) MetricsStability() component.StabilityLevel {
return f.metricsStabilityLevel
}
func (f *factory) LogsStability() component.StabilityLevel {
return f.logsStabilityLevel
}
func (f *factory) CreateTraces(ctx context.Context, set Settings, cfg component.Config) (Traces, error) {
if f.createTracesFunc == nil {
return nil, pipeline.ErrSignalNotSupported
}
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
return nil, err
}
return f.createTracesFunc(ctx, set, cfg)
}
func (f *factory) CreateMetrics(ctx context.Context, set Settings, cfg component.Config) (Metrics, error) {
if f.createMetricsFunc == nil {
return nil, pipeline.ErrSignalNotSupported
}
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
return nil, err
}
return f.createMetricsFunc(ctx, set, cfg)
}
func (f *factory) CreateLogs(ctx context.Context, set Settings, cfg component.Config) (Logs, error) {
if f.createLogsFunc == nil {
return nil, pipeline.ErrSignalNotSupported
}
if err := componentalias.ValidateComponentType(f, set.ID); err != nil {
return nil, err
}
return f.createLogsFunc(ctx, set, cfg)
}
// WithTraces overrides the default "error not supported" implementation for Factory.CreateTraces and the default "undefined" stability level.
func WithTraces(createTraces CreateTracesFunc, sl component.StabilityLevel) FactoryOption {
return factoryOptionFunc(func(o *factory) {
o.tracesStabilityLevel = sl
o.createTracesFunc = createTraces
})
}
// WithMetrics overrides the default "error not supported" implementation for Factory.CreateMetrics and the default "undefined" stability level.
func WithMetrics(createMetrics CreateMetricsFunc, sl component.StabilityLevel) FactoryOption {
return factoryOptionFunc(func(o *factory) {
o.metricsStabilityLevel = sl
o.createMetricsFunc = createMetrics
})
}
// WithLogs overrides the default "error not supported" implementation for Factory.CreateLogs and the default "undefined" stability level.
func WithLogs(createLogs CreateLogsFunc, sl component.StabilityLevel) FactoryOption {
return factoryOptionFunc(func(o *factory) {
o.logsStabilityLevel = sl
o.createLogsFunc = createLogs
})
}
// NewFactory returns a Factory.
func NewFactory(cfgType component.Type, createDefaultConfig component.CreateDefaultConfigFunc, options ...FactoryOption) Factory {
f := &factory{
cfgType: cfgType,
CreateDefaultConfigFunc: createDefaultConfig,
TypeAliasHolder: componentalias.NewTypeAliasHolder(),
}
for _, opt := range options {
opt.applyOption(f)
}
return f
}