Skip to content

Commit bd784f0

Browse files
authored
Move receiver into an internal package, in preparation for profiles (#10530)
<!--Ex. Fixing a bug - Describe the bug and how this fixes the issue. Ex. Adding a feature - Explain what this achieves.--> #### Description This splits the receiver package, so the APIs are in an internal package, and redefined publicly for logs/metrics/traces. In preparation for adding profiles to the package. <!-- Issue number if applicable --> #### Link to tracking issue See #10375 cc @mx-psi
1 parent 43ed618 commit bd784f0

File tree

7 files changed

+344
-236
lines changed

7 files changed

+344
-236
lines changed

receiver/builder.go

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package receiver // import "go.opentelemetry.io/collector/receiver"
5+
6+
import (
7+
"context"
8+
"fmt"
9+
10+
"go.uber.org/zap"
11+
12+
"go.opentelemetry.io/collector/component"
13+
"go.opentelemetry.io/collector/consumer"
14+
)
15+
16+
// Builder receiver is a helper struct that given a set of Configs and Factories helps with creating receivers.
17+
type Builder struct {
18+
cfgs map[component.ID]component.Config
19+
factories map[component.Type]Factory
20+
}
21+
22+
// NewBuilder creates a new receiver.Builder to help with creating components form a set of configs and factories.
23+
func NewBuilder(cfgs map[component.ID]component.Config, factories map[component.Type]Factory) *Builder {
24+
return &Builder{cfgs: cfgs, factories: factories}
25+
}
26+
27+
// CreateTraces creates a Traces receiver based on the settings and config.
28+
func (b *Builder) CreateTraces(ctx context.Context, set Settings, next consumer.Traces) (Traces, error) {
29+
if next == nil {
30+
return nil, errNilNextConsumer
31+
}
32+
cfg, existsCfg := b.cfgs[set.ID]
33+
if !existsCfg {
34+
return nil, fmt.Errorf("receiver %q is not configured", set.ID)
35+
}
36+
37+
f, existsFactory := b.factories[set.ID.Type()]
38+
if !existsFactory {
39+
return nil, fmt.Errorf("receiver factory not available for: %q", set.ID)
40+
}
41+
42+
logStabilityLevel(set.Logger, f.TracesReceiverStability())
43+
return f.CreateTracesReceiver(ctx, set, cfg, next)
44+
}
45+
46+
// CreateMetrics creates a Metrics receiver based on the settings and config.
47+
func (b *Builder) CreateMetrics(ctx context.Context, set Settings, next consumer.Metrics) (Metrics, error) {
48+
if next == nil {
49+
return nil, errNilNextConsumer
50+
}
51+
cfg, existsCfg := b.cfgs[set.ID]
52+
if !existsCfg {
53+
return nil, fmt.Errorf("receiver %q is not configured", set.ID)
54+
}
55+
56+
f, existsFactory := b.factories[set.ID.Type()]
57+
if !existsFactory {
58+
return nil, fmt.Errorf("receiver factory not available for: %q", set.ID)
59+
}
60+
61+
logStabilityLevel(set.Logger, f.MetricsReceiverStability())
62+
return f.CreateMetricsReceiver(ctx, set, cfg, next)
63+
}
64+
65+
// CreateLogs creates a Logs receiver based on the settings and config.
66+
func (b *Builder) CreateLogs(ctx context.Context, set Settings, next consumer.Logs) (Logs, error) {
67+
if next == nil {
68+
return nil, errNilNextConsumer
69+
}
70+
cfg, existsCfg := b.cfgs[set.ID]
71+
if !existsCfg {
72+
return nil, fmt.Errorf("receiver %q is not configured", set.ID)
73+
}
74+
75+
f, existsFactory := b.factories[set.ID.Type()]
76+
if !existsFactory {
77+
return nil, fmt.Errorf("receiver factory not available for: %q", set.ID)
78+
}
79+
80+
logStabilityLevel(set.Logger, f.LogsReceiverStability())
81+
return f.CreateLogsReceiver(ctx, set, cfg, next)
82+
}
83+
84+
func (b *Builder) Factory(componentType component.Type) component.Factory {
85+
return b.factories[componentType]
86+
}
87+
88+
// logStabilityLevel logs the stability level of a component. The log level is set to info for
89+
// undefined, unmaintained, deprecated and development. The log level is set to debug
90+
// for alpha, beta and stable.
91+
func logStabilityLevel(logger *zap.Logger, sl component.StabilityLevel) {
92+
if sl >= component.StabilityLevelAlpha {
93+
logger.Debug(sl.LogMessage())
94+
} else {
95+
logger.Info(sl.LogMessage())
96+
}
97+
}

receiver/internal/factory.go

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package internal // import "go.opentelemetry.io/collector/receiver/internal"
5+
6+
import (
7+
"context"
8+
9+
"go.opentelemetry.io/collector/component"
10+
"go.opentelemetry.io/collector/consumer"
11+
)
12+
13+
// Factory is a factory interface for receivers.
14+
//
15+
// This interface cannot be directly implemented. Implementations must
16+
// use the NewReceiverFactory to implement it.
17+
type Factory interface {
18+
component.Factory
19+
20+
// CreateTracesReceiver creates a TracesReceiver based on this config.
21+
// If the receiver type does not support tracing or if the config is not valid
22+
// an error will be returned instead. `nextConsumer` is never nil.
23+
CreateTracesReceiver(ctx context.Context, set Settings, cfg component.Config, nextConsumer consumer.Traces) (Traces, error)
24+
25+
// TracesReceiverStability gets the stability level of the TracesReceiver.
26+
TracesReceiverStability() component.StabilityLevel
27+
28+
// CreateMetricsReceiver creates a MetricsReceiver based on this config.
29+
// If the receiver type does not support metrics or if the config is not valid
30+
// an error will be returned instead. `nextConsumer` is never nil.
31+
CreateMetricsReceiver(ctx context.Context, set Settings, cfg component.Config, nextConsumer consumer.Metrics) (Metrics, error)
32+
33+
// MetricsReceiverStability gets the stability level of the MetricsReceiver.
34+
MetricsReceiverStability() component.StabilityLevel
35+
36+
// CreateLogsReceiver creates a LogsReceiver based on this config.
37+
// If the receiver type does not support the data type or if the config is not valid
38+
// an error will be returned instead. `nextConsumer` is never nil.
39+
CreateLogsReceiver(ctx context.Context, set Settings, cfg component.Config, nextConsumer consumer.Logs) (Logs, error)
40+
41+
// LogsReceiverStability gets the stability level of the LogsReceiver.
42+
LogsReceiverStability() component.StabilityLevel
43+
44+
unexportedFactoryFunc()
45+
}
46+
47+
// FactoryOption apply changes to ReceiverOptions.
48+
type FactoryOption interface {
49+
// applyOption applies the option.
50+
applyOption(o *factory)
51+
}
52+
53+
// factoryOptionFunc is an ReceiverFactoryOption created through a function.
54+
type factoryOptionFunc func(*factory)
55+
56+
func (f factoryOptionFunc) applyOption(o *factory) {
57+
f(o)
58+
}
59+
60+
// CreateTracesFunc is the equivalent of Factory.CreateTraces.
61+
type CreateTracesFunc func(context.Context, Settings, component.Config, consumer.Traces) (Traces, error)
62+
63+
// CreateTracesReceiver implements Factory.CreateTracesReceiver().
64+
func (f CreateTracesFunc) CreateTracesReceiver(
65+
ctx context.Context,
66+
set Settings,
67+
cfg component.Config,
68+
nextConsumer consumer.Traces) (Traces, error) {
69+
if f == nil {
70+
return nil, component.ErrDataTypeIsNotSupported
71+
}
72+
return f(ctx, set, cfg, nextConsumer)
73+
}
74+
75+
// CreateMetricsFunc is the equivalent of Factory.CreateMetrics.
76+
type CreateMetricsFunc func(context.Context, Settings, component.Config, consumer.Metrics) (Metrics, error)
77+
78+
// CreateMetricsReceiver implements Factory.CreateMetricsReceiver().
79+
func (f CreateMetricsFunc) CreateMetricsReceiver(
80+
ctx context.Context,
81+
set Settings,
82+
cfg component.Config,
83+
nextConsumer consumer.Metrics,
84+
) (Metrics, error) {
85+
if f == nil {
86+
return nil, component.ErrDataTypeIsNotSupported
87+
}
88+
return f(ctx, set, cfg, nextConsumer)
89+
}
90+
91+
// CreateLogsFunc is the equivalent of ReceiverFactory.CreateLogsReceiver().
92+
type CreateLogsFunc func(context.Context, Settings, component.Config, consumer.Logs) (Logs, error)
93+
94+
// CreateLogsReceiver implements Factory.CreateLogsReceiver().
95+
func (f CreateLogsFunc) CreateLogsReceiver(
96+
ctx context.Context,
97+
set Settings,
98+
cfg component.Config,
99+
nextConsumer consumer.Logs,
100+
) (Logs, error) {
101+
if f == nil {
102+
return nil, component.ErrDataTypeIsNotSupported
103+
}
104+
return f(ctx, set, cfg, nextConsumer)
105+
}
106+
107+
type factory struct {
108+
cfgType component.Type
109+
component.CreateDefaultConfigFunc
110+
CreateTracesFunc
111+
tracesStabilityLevel component.StabilityLevel
112+
CreateMetricsFunc
113+
metricsStabilityLevel component.StabilityLevel
114+
CreateLogsFunc
115+
logsStabilityLevel component.StabilityLevel
116+
}
117+
118+
func (f *factory) Type() component.Type {
119+
return f.cfgType
120+
}
121+
122+
func (f *factory) unexportedFactoryFunc() {}
123+
124+
func (f *factory) TracesReceiverStability() component.StabilityLevel {
125+
return f.tracesStabilityLevel
126+
}
127+
128+
func (f *factory) MetricsReceiverStability() component.StabilityLevel {
129+
return f.metricsStabilityLevel
130+
}
131+
132+
func (f *factory) LogsReceiverStability() component.StabilityLevel {
133+
return f.logsStabilityLevel
134+
}
135+
136+
// WithTraces overrides the default "error not supported" implementation for CreateTracesReceiver and the default "undefined" stability level.
137+
func WithTraces(createTracesReceiver CreateTracesFunc, sl component.StabilityLevel) FactoryOption {
138+
return factoryOptionFunc(func(o *factory) {
139+
o.tracesStabilityLevel = sl
140+
o.CreateTracesFunc = createTracesReceiver
141+
})
142+
}
143+
144+
// WithMetrics overrides the default "error not supported" implementation for CreateMetricsReceiver and the default "undefined" stability level.
145+
func WithMetrics(createMetricsReceiver CreateMetricsFunc, sl component.StabilityLevel) FactoryOption {
146+
return factoryOptionFunc(func(o *factory) {
147+
o.metricsStabilityLevel = sl
148+
o.CreateMetricsFunc = createMetricsReceiver
149+
})
150+
}
151+
152+
// WithLogs overrides the default "error not supported" implementation for CreateLogsReceiver and the default "undefined" stability level.
153+
func WithLogs(createLogsReceiver CreateLogsFunc, sl component.StabilityLevel) FactoryOption {
154+
return factoryOptionFunc(func(o *factory) {
155+
o.logsStabilityLevel = sl
156+
o.CreateLogsFunc = createLogsReceiver
157+
})
158+
}
159+
160+
// NewFactory returns a Factory.
161+
func NewFactory(cfgType component.Type, createDefaultConfig component.CreateDefaultConfigFunc, options ...FactoryOption) Factory {
162+
f := &factory{
163+
cfgType: cfgType,
164+
CreateDefaultConfigFunc: createDefaultConfig,
165+
}
166+
for _, opt := range options {
167+
opt.applyOption(f)
168+
}
169+
return f
170+
}

receiver/internal/logs.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package internal // import "go.opentelemetry.io/collector/receiver/internal"
5+
6+
import "go.opentelemetry.io/collector/component"
7+
8+
// Logs receiver receives logs.
9+
// Its purpose is to translate data from any format to the collector's internal logs data format.
10+
// LogsReceiver feeds a consumer.Logs with data.
11+
//
12+
// For example, it could be a receiver that reads syslogs and convert them into plog.Logs.
13+
type Logs interface {
14+
component.Component
15+
}

receiver/internal/metrics.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package internal // import "go.opentelemetry.io/collector/receiver/internal"
5+
6+
import "go.opentelemetry.io/collector/component"
7+
8+
// Metrics receiver receives metrics.
9+
// Its purpose is to translate data from any format to the collector's internal metrics format.
10+
// MetricsReceiver feeds a consumer.Metrics with data.
11+
//
12+
// For example, it could be Prometheus data source which translates Prometheus metrics into pmetric.Metrics.
13+
type Metrics interface {
14+
component.Component
15+
}

receiver/internal/receiver.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package internal // import "go.opentelemetry.io/collector/receiver/internal"
5+
6+
import "go.opentelemetry.io/collector/component"
7+
8+
// Settings configures Receiver creators.
9+
type Settings struct {
10+
// ID returns the ID of the component that will be created.
11+
ID component.ID
12+
13+
component.TelemetrySettings
14+
15+
// BuildInfo can be used by components for informational purposes.
16+
BuildInfo component.BuildInfo
17+
}

receiver/internal/traces.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package internal // import "go.opentelemetry.io/collector/receiver/internal"
5+
6+
import "go.opentelemetry.io/collector/component"
7+
8+
// Traces receiver receives traces.
9+
// Its purpose is to translate data from any format to the collector's internal trace format.
10+
// TracesReceiver feeds a consumer.Traces with data.
11+
//
12+
// For example, it could be Zipkin data source which translates Zipkin spans into ptrace.Traces.
13+
type Traces interface {
14+
component.Component
15+
}

0 commit comments

Comments
 (0)