add stability level to component factory (#5580)

* add stability level to component factory

* update docstring

* use a map instead of a single stability level

* apply review feedback

* add tests

* fix impi, add changelog

* add processors, receivers

* fix inconsistency

* set noop to stable

* update calls in deprecated func
This commit is contained in:
Alex Boten 2022-07-05 14:02:23 -07:00 committed by GitHub
parent 16aa10d582
commit 9f0d97ca57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 302 additions and 43 deletions

View File

@ -11,6 +11,21 @@
### 🚩 Deprecations 🚩
- Deprecate `service.ConfigServiceTelemetry`, `service.ConfigServiceTelemetryLogs`, and `service.ConfigServiceTelemetryMetrics` (#5565)
- Deprecate the following component functions to ensure a stability level is set (#5580):
- `component.WithTracesExporter` -> `component.WithTracesExporterAndStabilityLevel`
- `component.WithMetricsExporter` -> `component.WithMetricsExporterAndStabilityLevel`
- `component.WithLogsExporter` -> `component.WithLogsExporterAndStabilityLevel`
- `component.WithTracesReceiver` -> `component.WithTracesReceiverAndStabilityLevel`
- `component.WithMetricsReceiver` -> `component.WithMetricsReceiverAndStabilityLevel`
- `component.WithLogsReceiver` -> `component.WithLogsReceiverAndStabilityLevel`
- `component.WithTracesProcessor` -> `component.WithTracesProcessorAndStabilityLevel`
- `component.WithMetricsProcessor` -> `component.WithMetricsProcessorAndStabilityLevel`
- `component.WithLogsProcessor` -> `component.WithLogsProcessorAndStabilityLevel`
### 💡 Enhancements 💡
- Components stability levels are now logged. By default components which haven't defined their stability levels, or which are
unmaintained, deprecated or in development will log a message. (#5580)
### 💡 Enhancements 💡

View File

@ -104,6 +104,40 @@ const (
KindExtension
)
// StabilityLevel represents the stability level of the component created by the factory.
// The stability level is used to determine if the component should be used in production
// or not. For more details see:
// https://github.com/open-telemetry/opentelemetry-collector#stability-levels
type StabilityLevel int
const (
StabilityLevelUndefined = iota // skip 0, start types from 1.
StabilityLevelUnmaintained
StabilityLevelDeprecated
StabilityLevelInDevelopment
StabilityLevelAlpha
StabilityLevelBeta
StabilityLevelStable
)
func (sl StabilityLevel) String() string {
switch sl {
case StabilityLevelUnmaintained:
return "unmaintained"
case StabilityLevelDeprecated:
return "deprecated"
case StabilityLevelInDevelopment:
return "in development"
case StabilityLevelAlpha:
return "alpha"
case StabilityLevelBeta:
return "beta"
case StabilityLevelStable:
return "stable"
}
return "undefined"
}
// Factory is implemented by all component factories.
//
// This interface cannot be directly implemented. Implementations must
@ -112,11 +146,15 @@ type Factory interface {
// Type gets the type of the component created by this factory.
Type() config.Type
// StabilityLevel gets the stability level of the component.
StabilityLevel(config.DataType) StabilityLevel
unexportedFactoryFunc()
}
type baseFactory struct {
cfgType config.Type
cfgType config.Type
stability map[config.Type]StabilityLevel
}
func (baseFactory) unexportedFactoryFunc() {}
@ -124,3 +162,10 @@ func (baseFactory) unexportedFactoryFunc() {}
func (bf baseFactory) Type() config.Type {
return bf.cfgType
}
func (bf baseFactory) StabilityLevel(dt config.DataType) StabilityLevel {
if val, ok := bf.stability[dt]; ok {
return val
}
return StabilityLevelUndefined
}

View File

@ -43,9 +43,10 @@ func NewNopExporterFactory() component.ExporterFactory {
ExporterSettings: config.NewExporterSettings(config.NewComponentID("nop")),
}
},
component.WithTracesExporter(createTracesExporter),
component.WithMetricsExporter(createMetricsExporter),
component.WithLogsExporter(createLogsExporter))
component.WithTracesExporterAndStabilityLevel(createTracesExporter, component.StabilityLevelStable),
component.WithMetricsExporterAndStabilityLevel(createMetricsExporter, component.StabilityLevelStable),
component.WithLogsExporterAndStabilityLevel(createLogsExporter, component.StabilityLevelStable),
)
}
func createTracesExporter(context.Context, component.ExporterCreateSettings, config.Exporter) (component.TracesExporter, error) {

View File

@ -44,9 +44,9 @@ func NewNopProcessorFactory() component.ProcessorFactory {
ProcessorSettings: config.NewProcessorSettings(config.NewComponentID("nop")),
}
},
component.WithTracesProcessor(createTracesProcessor),
component.WithMetricsProcessor(createMetricsProcessor),
component.WithLogsProcessor(createLogsProcessor),
component.WithTracesProcessorAndStabilityLevel(createTracesProcessor, component.StabilityLevelStable),
component.WithMetricsProcessorAndStabilityLevel(createMetricsProcessor, component.StabilityLevelStable),
component.WithLogsProcessorAndStabilityLevel(createLogsProcessor, component.StabilityLevelStable),
)
}

View File

@ -43,9 +43,9 @@ func NewNopReceiverFactory() component.ReceiverFactory {
ReceiverSettings: config.NewReceiverSettings(config.NewComponentID("nop")),
}
},
component.WithTracesReceiver(createTracesReceiver),
component.WithMetricsReceiver(createMetricsReceiver),
component.WithLogsReceiver(createLogsReceiver))
component.WithTracesReceiverAndStabilityLevel(createTracesReceiver, component.StabilityLevelStable),
component.WithMetricsReceiverAndStabilityLevel(createMetricsReceiver, component.StabilityLevelStable),
component.WithLogsReceiverAndStabilityLevel(createLogsReceiver, component.StabilityLevelStable))
}
func createTracesReceiver(context.Context, component.ReceiverCreateSettings, config.Receiver, consumer.Traces) (component.TracesReceiver, error) {

View File

@ -149,22 +149,43 @@ type exporterFactory struct {
}
// WithTracesExporter overrides the default "error not supported" implementation for CreateTracesExporter.
// Deprecated: [v0.55.0] Use WithTracesExporterAndStabilityLevel instead.
func WithTracesExporter(createTracesExporter CreateTracesExporterFunc) ExporterFactoryOption {
return WithTracesExporterAndStabilityLevel(createTracesExporter, StabilityLevelUndefined)
}
// WithTracesExporterAndStabilityLevel overrides the default "error not supported" implementation for CreateTracesExporter and the default "undefined" stability level.
func WithTracesExporterAndStabilityLevel(createTracesExporter CreateTracesExporterFunc, sl StabilityLevel) ExporterFactoryOption {
return exporterFactoryOptionFunc(func(o *exporterFactory) {
o.stability[config.TracesDataType] = sl
o.CreateTracesExporterFunc = createTracesExporter
})
}
// WithMetricsExporter overrides the default "error not supported" implementation for CreateMetricsExporter.
// Deprecated: [v0.55.0] Use WithMetricsExporterAndStabilityLevel instead.
func WithMetricsExporter(createMetricsExporter CreateMetricsExporterFunc) ExporterFactoryOption {
return WithMetricsExporterAndStabilityLevel(createMetricsExporter, StabilityLevelUndefined)
}
// WithMetricsExporterAndStabilityLevel overrides the default "error not supported" implementation for CreateMetricsExporter and the default "undefined" stability level.
func WithMetricsExporterAndStabilityLevel(createMetricsExporter CreateMetricsExporterFunc, sl StabilityLevel) ExporterFactoryOption {
return exporterFactoryOptionFunc(func(o *exporterFactory) {
o.stability[config.MetricsDataType] = sl
o.CreateMetricsExporterFunc = createMetricsExporter
})
}
// WithLogsExporter overrides the default "error not supported" implementation for CreateLogsExporter.
// Deprecated: [v0.55.0] Use WithLogsExporterAndStabilityLevel instead.
func WithLogsExporter(createLogsExporter CreateLogsExporterFunc) ExporterFactoryOption {
return WithLogsExporterAndStabilityLevel(createLogsExporter, StabilityLevelUndefined)
}
// WithLogsExporterAndStabilityLevel overrides the default "error not supported" implementation for CreateLogsExporter and the default "undefined" stability level.
func WithLogsExporterAndStabilityLevel(createLogsExporter CreateLogsExporterFunc, sl StabilityLevel) ExporterFactoryOption {
return exporterFactoryOptionFunc(func(o *exporterFactory) {
o.stability[config.LogsDataType] = sl
o.CreateLogsExporterFunc = createLogsExporter
})
}
@ -172,7 +193,7 @@ func WithLogsExporter(createLogsExporter CreateLogsExporterFunc) ExporterFactory
// NewExporterFactory returns a ExporterFactory.
func NewExporterFactory(cfgType config.Type, createDefaultConfig ExporterCreateDefaultConfigFunc, options ...ExporterFactoryOption) ExporterFactory {
f := &exporterFactory{
baseFactory: baseFactory{cfgType: cfgType},
baseFactory: baseFactory{cfgType: cfgType, stability: make(map[config.DataType]StabilityLevel)},
ExporterCreateDefaultConfigFunc: createDefaultConfig,
}
for _, opt := range options {

View File

@ -61,6 +61,32 @@ func TestNewExporterFactory_WithOptions(t *testing.T) {
assert.NoError(t, err)
}
func TestNewExporterFactory_WithStabilityLevel(t *testing.T) {
const typeStr = "test"
defaultCfg := config.NewExporterSettings(config.NewComponentID(typeStr))
factory := NewExporterFactory(
typeStr,
func() config.Exporter { return &defaultCfg },
WithTracesExporterAndStabilityLevel(createTracesExporter, StabilityLevelInDevelopment),
WithMetricsExporterAndStabilityLevel(createMetricsExporter, StabilityLevelAlpha),
WithLogsExporterAndStabilityLevel(createLogsExporter, StabilityLevelDeprecated))
assert.EqualValues(t, typeStr, factory.Type())
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
assert.EqualValues(t, StabilityLevelInDevelopment, factory.StabilityLevel(config.TracesDataType))
_, err := factory.CreateTracesExporter(context.Background(), ExporterCreateSettings{}, &defaultCfg)
assert.NoError(t, err)
assert.EqualValues(t, StabilityLevelAlpha, factory.StabilityLevel(config.MetricsDataType))
_, err = factory.CreateMetricsExporter(context.Background(), ExporterCreateSettings{}, &defaultCfg)
assert.NoError(t, err)
assert.EqualValues(t, StabilityLevelDeprecated, factory.StabilityLevel(config.LogsDataType))
_, err = factory.CreateLogsExporter(context.Background(), ExporterCreateSettings{}, &defaultCfg)
assert.NoError(t, err)
}
func createTracesExporter(context.Context, ExporterCreateSettings, config.Exporter) (TracesExporter, error) {
return nil, nil
}

View File

@ -179,22 +179,43 @@ type processorFactory struct {
}
// WithTracesProcessor overrides the default "error not supported" implementation for CreateTracesProcessor.
// Deprecated: [v0.55.0] Use WithTracesProcessorAndStabilityLevel instead.
func WithTracesProcessor(createTracesProcessor CreateTracesProcessorFunc) ProcessorFactoryOption {
return WithTracesProcessorAndStabilityLevel(createTracesProcessor, StabilityLevelUndefined)
}
// WithTracesProcessorAndStabilityLevel overrides the default "error not supported" implementation for CreateTracesProcessor and the default "undefined" stability level.
func WithTracesProcessorAndStabilityLevel(createTracesProcessor CreateTracesProcessorFunc, sl StabilityLevel) ProcessorFactoryOption {
return processorFactoryOptionFunc(func(o *processorFactory) {
o.stability[config.TracesDataType] = sl
o.CreateTracesProcessorFunc = createTracesProcessor
})
}
// WithMetricsProcessor overrides the default "error not supported" implementation for CreateMetricsProcessor.
// Deprecated: [v0.55.0] Use WithMetricsProcessorAndStabilityLevel instead.
func WithMetricsProcessor(createMetricsProcessor CreateMetricsProcessorFunc) ProcessorFactoryOption {
return WithMetricsProcessorAndStabilityLevel(createMetricsProcessor, StabilityLevelUndefined)
}
// WithMetricsProcessorAndStabilityLevel overrides the default "error not supported" implementation for CreateMetricsProcessor and the default "undefined" stability level.
func WithMetricsProcessorAndStabilityLevel(createMetricsProcessor CreateMetricsProcessorFunc, sl StabilityLevel) ProcessorFactoryOption {
return processorFactoryOptionFunc(func(o *processorFactory) {
o.stability[config.MetricsDataType] = sl
o.CreateMetricsProcessorFunc = createMetricsProcessor
})
}
// WithLogsProcessor overrides the default "error not supported" implementation for CreateLogsProcessor.
// Deprecated: [v0.55.0] Use WithLogsProcessorAndStabilityLevel instead.
func WithLogsProcessor(createLogsProcessor CreateLogsProcessorFunc) ProcessorFactoryOption {
return WithLogsProcessorAndStabilityLevel(createLogsProcessor, StabilityLevelUndefined)
}
// WithLogsProcessorAndStabilityLevel overrides the default "error not supported" implementation for CreateLogsProcessor and the default "undefined" stability level.
func WithLogsProcessorAndStabilityLevel(createLogsProcessor CreateLogsProcessorFunc, sl StabilityLevel) ProcessorFactoryOption {
return processorFactoryOptionFunc(func(o *processorFactory) {
o.stability[config.LogsDataType] = sl
o.CreateLogsProcessorFunc = createLogsProcessor
})
}
@ -202,7 +223,7 @@ func WithLogsProcessor(createLogsProcessor CreateLogsProcessorFunc) ProcessorFac
// NewProcessorFactory returns a ProcessorFactory.
func NewProcessorFactory(cfgType config.Type, createDefaultConfig ProcessorCreateDefaultConfigFunc, options ...ProcessorFactoryOption) ProcessorFactory {
f := &processorFactory{
baseFactory: baseFactory{cfgType: cfgType},
baseFactory: baseFactory{cfgType: cfgType, stability: make(map[config.DataType]StabilityLevel)},
ProcessorCreateDefaultConfigFunc: createDefaultConfig,
}
for _, opt := range options {

View File

@ -62,6 +62,31 @@ func TestNewProcessorFactory_WithOptions(t *testing.T) {
assert.NoError(t, err)
}
func TestNewProcessorFactory_WithStabilityLevel(t *testing.T) {
const typeStr = "test"
defaultCfg := config.NewProcessorSettings(config.NewComponentID(typeStr))
factory := NewProcessorFactory(
typeStr,
func() config.Processor { return &defaultCfg },
WithTracesProcessorAndStabilityLevel(createTracesProcessor, StabilityLevelAlpha),
WithMetricsProcessorAndStabilityLevel(createMetricsProcessor, StabilityLevelBeta),
WithLogsProcessorAndStabilityLevel(createLogsProcessor, StabilityLevelUnmaintained))
assert.EqualValues(t, typeStr, factory.Type())
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
assert.EqualValues(t, StabilityLevelAlpha, factory.StabilityLevel(config.TracesDataType))
_, err := factory.CreateTracesProcessor(context.Background(), ProcessorCreateSettings{}, &defaultCfg, nil)
assert.NoError(t, err)
assert.EqualValues(t, StabilityLevelBeta, factory.StabilityLevel(config.MetricsDataType))
_, err = factory.CreateMetricsProcessor(context.Background(), ProcessorCreateSettings{}, &defaultCfg, nil)
assert.NoError(t, err)
assert.EqualValues(t, StabilityLevelUnmaintained, factory.StabilityLevel(config.LogsDataType))
_, err = factory.CreateLogsProcessor(context.Background(), ProcessorCreateSettings{}, &defaultCfg, nil)
assert.NoError(t, err)
}
func createTracesProcessor(context.Context, ProcessorCreateSettings, config.Processor, consumer.Traces) (TracesProcessor, error) {
return nil, nil
}

View File

@ -211,22 +211,43 @@ type receiverFactory struct {
}
// WithTracesReceiver overrides the default "error not supported" implementation for CreateTracesReceiver.
// Deprecated: [v0.55.0] Use WithTracesReceiverAndStabilityLevel instead.
func WithTracesReceiver(createTracesReceiver CreateTracesReceiverFunc) ReceiverFactoryOption {
return WithTracesReceiverAndStabilityLevel(createTracesReceiver, StabilityLevelUndefined)
}
// WithTracesReceiverAndStabilityLevel overrides the default "error not supported" implementation for CreateTracesReceiver and the default "undefined" stability level.
func WithTracesReceiverAndStabilityLevel(createTracesReceiver CreateTracesReceiverFunc, sl StabilityLevel) ReceiverFactoryOption {
return receiverFactoryOptionFunc(func(o *receiverFactory) {
o.stability[config.TracesDataType] = sl
o.CreateTracesReceiverFunc = createTracesReceiver
})
}
// WithMetricsReceiver overrides the default "error not supported" implementation for CreateMetricsReceiver.
// Deprecated: [v0.55.0] Use WithMetricsReceiverAndStabilityLevel instead.
func WithMetricsReceiver(createMetricsReceiver CreateMetricsReceiverFunc) ReceiverFactoryOption {
return WithMetricsReceiverAndStabilityLevel(createMetricsReceiver, StabilityLevelUndefined)
}
// WithMetricsReceiverAndStabilityLevel overrides the default "error not supported" implementation for CreateMetricsReceiver and the default "undefined" stability level.
func WithMetricsReceiverAndStabilityLevel(createMetricsReceiver CreateMetricsReceiverFunc, sl StabilityLevel) ReceiverFactoryOption {
return receiverFactoryOptionFunc(func(o *receiverFactory) {
o.stability[config.MetricsDataType] = sl
o.CreateMetricsReceiverFunc = createMetricsReceiver
})
}
// WithLogsReceiver overrides the default "error not supported" implementation for CreateLogsReceiver.
// Deprecated: [v0.55.0] Use WithLogsReceiverAndStabilityLevel instead.
func WithLogsReceiver(createLogsReceiver CreateLogsReceiverFunc) ReceiverFactoryOption {
return WithLogsReceiverAndStabilityLevel(createLogsReceiver, StabilityLevelUndefined)
}
// WithLogsReceiverAndStabilityLevel overrides the default "error not supported" implementation for CreateLogsReceiver and the default "undefined" stability level.
func WithLogsReceiverAndStabilityLevel(createLogsReceiver CreateLogsReceiverFunc, sl StabilityLevel) ReceiverFactoryOption {
return receiverFactoryOptionFunc(func(o *receiverFactory) {
o.stability[config.LogsDataType] = sl
o.CreateLogsReceiverFunc = createLogsReceiver
})
}
@ -234,7 +255,7 @@ func WithLogsReceiver(createLogsReceiver CreateLogsReceiverFunc) ReceiverFactory
// NewReceiverFactory returns a ReceiverFactory.
func NewReceiverFactory(cfgType config.Type, createDefaultConfig ReceiverCreateDefaultConfigFunc, options ...ReceiverFactoryOption) ReceiverFactory {
f := &receiverFactory{
baseFactory: baseFactory{cfgType: cfgType},
baseFactory: baseFactory{cfgType: cfgType, stability: make(map[config.DataType]StabilityLevel)},
ReceiverCreateDefaultConfigFunc: createDefaultConfig,
}
for _, opt := range options {

View File

@ -62,6 +62,31 @@ func TestNewReceiverFactory_WithOptions(t *testing.T) {
assert.NoError(t, err)
}
func TestNewReceiverFactory_WithStabilityLevels(t *testing.T) {
const typeStr = "test"
defaultCfg := config.NewReceiverSettings(config.NewComponentID(typeStr))
factory := NewReceiverFactory(
typeStr,
func() config.Receiver { return &defaultCfg },
WithTracesReceiverAndStabilityLevel(createTracesReceiver, StabilityLevelDeprecated),
WithMetricsReceiverAndStabilityLevel(createMetricsReceiver, StabilityLevelAlpha),
WithLogsReceiverAndStabilityLevel(createLogsReceiver, StabilityLevelStable))
assert.EqualValues(t, typeStr, factory.Type())
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
assert.EqualValues(t, StabilityLevelDeprecated, factory.StabilityLevel(config.TracesDataType))
_, err := factory.CreateTracesReceiver(context.Background(), ReceiverCreateSettings{}, &defaultCfg, nil)
assert.NoError(t, err)
assert.EqualValues(t, StabilityLevelAlpha, factory.StabilityLevel(config.MetricsDataType))
_, err = factory.CreateMetricsReceiver(context.Background(), ReceiverCreateSettings{}, &defaultCfg, nil)
assert.NoError(t, err)
assert.EqualValues(t, StabilityLevelStable, factory.StabilityLevel(config.LogsDataType))
_, err = factory.CreateLogsReceiver(context.Background(), ReceiverCreateSettings{}, &defaultCfg, nil)
assert.NoError(t, err)
}
func createTracesReceiver(context.Context, ReceiverCreateSettings, config.Receiver, consumer.Traces) (TracesReceiver, error) {
return nil, nil
}

View File

@ -36,9 +36,10 @@ func NewFactory() component.ExporterFactory {
return component.NewExporterFactory(
typeStr,
createDefaultConfig,
component.WithTracesExporter(createTracesExporter),
component.WithMetricsExporter(createMetricsExporter),
component.WithLogsExporter(createLogsExporter))
component.WithTracesExporterAndStabilityLevel(createTracesExporter, component.StabilityLevelInDevelopment),
component.WithMetricsExporterAndStabilityLevel(createMetricsExporter, component.StabilityLevelInDevelopment),
component.WithLogsExporterAndStabilityLevel(createLogsExporter, component.StabilityLevelInDevelopment),
)
}
func createDefaultConfig() config.Exporter {

View File

@ -35,9 +35,10 @@ func NewFactory() component.ExporterFactory {
return component.NewExporterFactory(
typeStr,
createDefaultConfig,
component.WithTracesExporter(createTracesExporter),
component.WithMetricsExporter(createMetricsExporter),
component.WithLogsExporter(createLogsExporter))
component.WithTracesExporterAndStabilityLevel(createTracesExporter, component.StabilityLevelStable),
component.WithMetricsExporterAndStabilityLevel(createMetricsExporter, component.StabilityLevelStable),
component.WithLogsExporterAndStabilityLevel(createLogsExporter, component.StabilityLevelBeta),
)
}
func createDefaultConfig() config.Exporter {

View File

@ -38,9 +38,10 @@ func NewFactory() component.ExporterFactory {
return component.NewExporterFactory(
typeStr,
createDefaultConfig,
component.WithTracesExporter(createTracesExporter),
component.WithMetricsExporter(createMetricsExporter),
component.WithLogsExporter(createLogsExporter))
component.WithTracesExporterAndStabilityLevel(createTracesExporter, component.StabilityLevelStable),
component.WithMetricsExporterAndStabilityLevel(createMetricsExporter, component.StabilityLevelStable),
component.WithLogsExporterAndStabilityLevel(createLogsExporter, component.StabilityLevelBeta),
)
}
func createDefaultConfig() config.Exporter {

View File

@ -25,7 +25,10 @@ import (
"go.opentelemetry.io/collector/pdata/ptrace"
)
const expType = "exampleexporter"
const (
typeStr = "exampleexporter"
stability = component.StabilityLevelInDevelopment
)
// ExampleExporterConfig config for ExampleExporter.
type ExampleExporterConfig struct {
@ -34,15 +37,16 @@ type ExampleExporterConfig struct {
// ExampleExporterFactory is factory for ExampleExporter.
var ExampleExporterFactory = component.NewExporterFactory(
expType,
typeStr,
createExporterDefaultConfig,
component.WithTracesExporter(createTracesExporter),
component.WithMetricsExporter(createMetricsExporter),
component.WithLogsExporter(createLogsExporter))
component.WithTracesExporterAndStabilityLevel(createTracesExporter, stability),
component.WithMetricsExporterAndStabilityLevel(createMetricsExporter, stability),
component.WithLogsExporterAndStabilityLevel(createLogsExporter, stability),
)
func createExporterDefaultConfig() config.Exporter {
return &ExampleExporterConfig{
ExporterSettings: config.NewExporterSettings(config.NewComponentID(expType)),
ExporterSettings: config.NewExporterSettings(config.NewComponentID(typeStr)),
}
}

View File

@ -33,9 +33,9 @@ type ExampleProcessorConfig struct {
var ExampleProcessorFactory = component.NewProcessorFactory(
procType,
createDefaultConfig,
component.WithTracesProcessor(createTracesProcessor),
component.WithMetricsProcessor(createMetricsProcessor),
component.WithLogsProcessor(createLogsProcessor))
component.WithTracesProcessorAndStabilityLevel(createTracesProcessor, component.StabilityLevelInDevelopment),
component.WithMetricsProcessorAndStabilityLevel(createMetricsProcessor, component.StabilityLevelInDevelopment),
component.WithLogsProcessorAndStabilityLevel(createLogsProcessor, component.StabilityLevelInDevelopment))
// CreateDefaultConfig creates the default configuration for the Processor.
func createDefaultConfig() config.Processor {

View File

@ -33,9 +33,9 @@ type ExampleReceiverConfig struct {
var ExampleReceiverFactory = component.NewReceiverFactory(
receiverType,
createReceiverDefaultConfig,
component.WithTracesReceiver(createTracesReceiver),
component.WithMetricsReceiver(createMetricsReceiver),
component.WithLogsReceiver(createLogsReceiver))
component.WithTracesReceiverAndStabilityLevel(createTracesReceiver, component.StabilityLevelInDevelopment),
component.WithMetricsReceiverAndStabilityLevel(createMetricsReceiver, component.StabilityLevelInDevelopment),
component.WithLogsReceiverAndStabilityLevel(createLogsReceiver, component.StabilityLevelInDevelopment))
func createReceiverDefaultConfig() config.Receiver {
return &ExampleReceiverConfig{

View File

@ -36,9 +36,9 @@ func NewFactory() component.ProcessorFactory {
return component.NewProcessorFactory(
typeStr,
createDefaultConfig,
component.WithTracesProcessor(createTracesProcessor),
component.WithMetricsProcessor(createMetricsProcessor),
component.WithLogsProcessor(createLogsProcessor))
component.WithTracesProcessorAndStabilityLevel(createTracesProcessor, component.StabilityLevelStable),
component.WithMetricsProcessorAndStabilityLevel(createMetricsProcessor, component.StabilityLevelStable),
component.WithLogsProcessorAndStabilityLevel(createLogsProcessor, component.StabilityLevelStable))
}
func createDefaultConfig() config.Processor {

View File

@ -46,9 +46,9 @@ func NewFactory() component.ProcessorFactory {
return component.NewProcessorFactory(
typeStr,
createDefaultConfig,
component.WithTracesProcessor(f.createTracesProcessor),
component.WithMetricsProcessor(f.createMetricsProcessor),
component.WithLogsProcessor(f.createLogsProcessor))
component.WithTracesProcessorAndStabilityLevel(f.createTracesProcessor, component.StabilityLevelBeta),
component.WithMetricsProcessorAndStabilityLevel(f.createMetricsProcessor, component.StabilityLevelBeta),
component.WithLogsProcessorAndStabilityLevel(f.createLogsProcessor, component.StabilityLevelBeta))
}
// CreateDefaultConfig creates the default configuration for processor. Notice

View File

@ -38,9 +38,9 @@ func NewFactory() component.ReceiverFactory {
return component.NewReceiverFactory(
typeStr,
createDefaultConfig,
component.WithTracesReceiver(createTracesReceiver),
component.WithMetricsReceiver(createMetricsReceiver),
component.WithLogsReceiver(createLogReceiver))
component.WithTracesReceiverAndStabilityLevel(createTracesReceiver, component.StabilityLevelStable),
component.WithMetricsReceiverAndStabilityLevel(createMetricsReceiver, component.StabilityLevelStable),
component.WithLogsReceiverAndStabilityLevel(createLogReceiver, component.StabilityLevelBeta))
}
// createDefaultConfig creates the default configuration for receiver.

View File

@ -23,4 +23,5 @@ const (
ZapKindPipeline = "pipeline"
ZapNameKey = "name"
ZapDataTypeKey = "data_type"
ZapStabilityKey = "stability"
)

View File

@ -331,6 +331,21 @@ func Build(ctx context.Context, set Settings) (*Pipelines, error) {
return exps, nil
}
func logStabilityMessage(logger *zap.Logger, sl component.StabilityLevel) {
switch sl {
case component.StabilityLevelDeprecated:
logger.Info("Component has been deprecated and will be removed in future releases.", zap.String(components.ZapStabilityKey, sl.String()))
case component.StabilityLevelUnmaintained:
logger.Info("Component is unmaintained and actively looking for contributors. This component will become deprecated after 6 months of remaining unmaintained", zap.String(components.ZapStabilityKey, sl.String()))
case component.StabilityLevelInDevelopment:
logger.Info("Component is under development.", zap.String(components.ZapStabilityKey, sl.String()))
case component.StabilityLevelAlpha, component.StabilityLevelBeta, component.StabilityLevelStable:
logger.Debug("Stability level", zap.String(components.ZapStabilityKey, sl.String()))
default:
logger.Info("Stability level of component undefined", zap.String(components.ZapStabilityKey, sl.String()))
}
}
func buildExporter(
ctx context.Context,
settings component.TelemetrySettings,
@ -355,6 +370,7 @@ func buildExporter(
BuildInfo: buildInfo,
}
set.TelemetrySettings.Logger = exporterLogger(settings.Logger, id, pipelineID.Type())
logStabilityMessage(set.TelemetrySettings.Logger, factory.StabilityLevel(pipelineID.Type()))
exp, err := createExporter(ctx, set, cfg, id, pipelineID, factory)
if err != nil {
@ -436,6 +452,7 @@ func buildProcessor(ctx context.Context,
BuildInfo: buildInfo,
}
set.TelemetrySettings.Logger = processorLogger(settings.Logger, id, pipelineID)
logStabilityMessage(set.TelemetrySettings.Logger, factory.StabilityLevel(pipelineID.Type()))
proc, err := createProcessor(ctx, set, procCfg, id, pipelineID, next, factory)
if err != nil {
@ -489,6 +506,7 @@ func buildReceiver(ctx context.Context,
BuildInfo: buildInfo,
}
set.TelemetrySettings.Logger = receiverLogger(settings.Logger, id, pipelineID.Type())
logStabilityMessage(set.TelemetrySettings.Logger, factory.StabilityLevel(pipelineID.Type()))
recv, err := createReceiver(ctx, set, cfg, id, pipelineID, nexts, factory)
if err != nil {

View File

@ -22,6 +22,9 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"go.uber.org/zap/zaptest/observer"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componenttest"
@ -345,6 +348,36 @@ func TestFailToStartAndShutdown(t *testing.T) {
}
}
func TestLogStabilityLevle(t *testing.T) {
tests := []struct {
level zapcore.Level
expectedLogs int
}{
{
level: zapcore.DebugLevel,
expectedLogs: 7,
},
{
level: zapcore.InfoLevel,
expectedLogs: 4,
},
}
for _, tt := range tests {
observed, logs := observer.New(tt.level)
logger := zap.New(observed)
// ensure log levels are set correctly for each stability level
logStabilityMessage(logger, component.StabilityLevelUndefined)
logStabilityMessage(logger, component.StabilityLevelUnmaintained)
logStabilityMessage(logger, component.StabilityLevelDeprecated)
logStabilityMessage(logger, component.StabilityLevelInDevelopment)
logStabilityMessage(logger, component.StabilityLevelAlpha)
logStabilityMessage(logger, component.StabilityLevelBeta)
logStabilityMessage(logger, component.StabilityLevelStable)
require.Equal(t, tt.expectedLogs, logs.Len())
}
}
func newBadReceiverFactory() component.ReceiverFactory {
return component.NewReceiverFactory("bf", func() config.Receiver {
return &struct {