Skip to content

Commit 454432e

Browse files
authored
Move receiver builder into internal service (#10781)
#### Description This moves the receiver builder out of the `receiver` package, and into `service/internal/builders`. There's no real reason for this struct to be public (folks shouldn't call it), and making it private will allow us to add profiling support to it. #### Link to tracking issue #10375 (review)
1 parent 6764622 commit 454432e

File tree

15 files changed

+443
-41
lines changed

15 files changed

+443
-41
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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: deprecation
5+
6+
# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
7+
component: receiver
8+
9+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
10+
note: Deprecate receiver.Builder, and move it into an internal package of the service module
11+
12+
# One or more tracking issues or pull requests related to the change
13+
issues: [10781]
14+
15+
# (Optional) One or more lines of additional information to render under the primary note.
16+
# These lines will be padded with 2 spaces and then inserted directly into the document.
17+
# Use pipe (|) for multiline entries.
18+
subtext:
19+
20+
# Optional: The change log or logs in which this entry should be included.
21+
# e.g. '[user]' or '[user, api]'
22+
# Include 'user' if the change is relevant to end users.
23+
# Include 'api' if there is a change to a library API.
24+
# Default: '[user]'
25+
change_logs: [api]

cmd/otelcorecol/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ require (
4040
github.com/beorn7/perks v1.0.1 // indirect
4141
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
4242
github.com/cespare/xxhash/v2 v2.3.0 // indirect
43+
github.com/davecgh/go-spew v1.1.1 // indirect
4344
github.com/felixge/httpsnoop v1.0.4 // indirect
4445
github.com/fsnotify/fsnotify v1.7.0 // indirect
4546
github.com/go-logr/logr v1.4.2 // indirect
@@ -64,6 +65,7 @@ require (
6465
github.com/modern-go/reflect2 v1.0.2 // indirect
6566
github.com/mostynb/go-grpc-compression v1.2.3 // indirect
6667
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
68+
github.com/pmezard/go-difflib v1.0.0 // indirect
6769
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
6870
github.com/prometheus/client_golang v1.20.1 // indirect
6971
github.com/prometheus/client_model v0.6.1 // indirect
@@ -74,6 +76,7 @@ require (
7476
github.com/shoenig/go-m1cpu v0.1.6 // indirect
7577
github.com/spf13/cobra v1.8.1 // indirect
7678
github.com/spf13/pflag v1.0.5 // indirect
79+
github.com/stretchr/testify v1.9.0 // indirect
7780
github.com/tklauser/go-sysconf v0.3.12 // indirect
7881
github.com/tklauser/numcpus v0.6.1 // indirect
7982
github.com/yusufpapurcu/wmi v1.2.4 // indirect

internal/e2e/status_test.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,12 @@ func Test_ComponentStatusReporting_SharedInstance(t *testing.T) {
3838
set := service.Settings{
3939
BuildInfo: component.NewDefaultBuildInfo(),
4040
CollectorConf: confmap.New(),
41-
Receivers: receiver.NewBuilder(
42-
map[component.ID]component.Config{
43-
component.NewID(component.MustNewType("test")): &receiverConfig{},
44-
},
45-
map[component.Type]receiver.Factory{
46-
component.MustNewType("test"): newReceiverFactory(),
47-
}),
41+
ReceiversConfigs: map[component.ID]component.Config{
42+
component.NewID(component.MustNewType("test")): &receiverConfig{},
43+
},
44+
ReceiversFactories: map[component.Type]receiver.Factory{
45+
component.MustNewType("test"): newReceiverFactory(),
46+
},
4847
Processors: processortest.NewNopBuilder(),
4948
Exporters: exportertest.NewNopBuilder(),
5049
Connectors: connectortest.NewNopBuilder(),

otelcol/collector.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
"go.opentelemetry.io/collector/extension"
2727
"go.opentelemetry.io/collector/otelcol/internal/grpclog"
2828
"go.opentelemetry.io/collector/processor"
29-
"go.opentelemetry.io/collector/receiver"
3029
"go.opentelemetry.io/collector/service"
3130
)
3231

@@ -187,11 +186,14 @@ func (col *Collector) setupConfigurationComponents(ctx context.Context) error {
187186
col.service, err = service.New(ctx, service.Settings{
188187
BuildInfo: col.set.BuildInfo,
189188
CollectorConf: conf,
190-
Receivers: receiver.NewBuilder(cfg.Receivers, factories.Receivers),
191-
Processors: processor.NewBuilder(cfg.Processors, factories.Processors),
192-
Exporters: exporter.NewBuilder(cfg.Exporters, factories.Exporters),
193-
Connectors: connector.NewBuilder(cfg.Connectors, factories.Connectors),
194-
Extensions: extension.NewBuilder(cfg.Extensions, factories.Extensions),
189+
190+
ReceiversConfigs: cfg.Receivers,
191+
ReceiversFactories: factories.Receivers,
192+
193+
Processors: processor.NewBuilder(cfg.Processors, factories.Processors),
194+
Exporters: exporter.NewBuilder(cfg.Exporters, factories.Exporters),
195+
Connectors: connector.NewBuilder(cfg.Connectors, factories.Connectors),
196+
Extensions: extension.NewBuilder(cfg.Extensions, factories.Extensions),
195197
ModuleInfo: extension.ModuleInfo{
196198
Receiver: factories.ReceiverModules,
197199
Processor: factories.ProcessorModules,

receiver/builder.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package receiver // import "go.opentelemetry.io/collector/receiver"
55

66
import (
77
"context"
8+
"errors"
89
"fmt"
910

1011
"go.uber.org/zap"
@@ -13,13 +14,22 @@ import (
1314
"go.opentelemetry.io/collector/consumer"
1415
)
1516

16-
// Builder receiver is a helper struct that given a set of Configs and Factories helps with creating receivers.
17+
var errNilNextConsumer = errors.New("nil next Consumer")
18+
19+
// Builder receiver is a helper struct that given a set of Configs and
20+
// Factories helps with creating receivers.
21+
//
22+
// Deprecated: [v0.108.0] this builder is being internalized within the service module,
23+
// and will be removed soon.
1724
type Builder struct {
1825
cfgs map[component.ID]component.Config
1926
factories map[component.Type]Factory
2027
}
2128

2229
// NewBuilder creates a new receiver.Builder to help with creating components form a set of configs and factories.
30+
//
31+
// Deprecated: [v0.108.0] this builder is being internalized within the service module,
32+
// and will be removed soon.
2333
func NewBuilder(cfgs map[component.ID]component.Config, factories map[component.Type]Factory) *Builder {
2434
return &Builder{cfgs: cfgs, factories: factories}
2535
}

receiver/receiver.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,12 @@
44
package receiver // import "go.opentelemetry.io/collector/receiver"
55

66
import (
7-
"errors"
87
"fmt"
98

109
"go.opentelemetry.io/collector/component"
1110
"go.opentelemetry.io/collector/receiver/internal"
1211
)
1312

14-
var (
15-
errNilNextConsumer = errors.New("nil next Consumer")
16-
)
17-
1813
// Traces receiver receives traces.
1914
// Its purpose is to translate data from any format to the collector's internal trace format.
2015
// TracesReceiver feeds a consumer.Traces with data.

receiver/receivertest/nop_receiver.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ type nopReceiver struct {
7777
}
7878

7979
// NewNopBuilder returns a receiver.Builder that constructs nop receivers.
80+
//
81+
// Deprecated: [v0.108.0] this builder is being internalized within the service module,
82+
// and will be removed soon.
8083
func NewNopBuilder() *receiver.Builder {
8184
nopFactory := NewNopFactory()
8285
return receiver.NewBuilder(
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package builders // import "go.opentelemetry.io/collector/service/internal/builders"
5+
6+
import (
7+
"context"
8+
"errors"
9+
"fmt"
10+
11+
"go.uber.org/zap"
12+
13+
"go.opentelemetry.io/collector/component"
14+
"go.opentelemetry.io/collector/consumer"
15+
"go.opentelemetry.io/collector/receiver"
16+
"go.opentelemetry.io/collector/receiver/receivertest"
17+
)
18+
19+
var (
20+
errNilNextConsumer = errors.New("nil next Consumer")
21+
nopType = component.MustNewType("nop")
22+
)
23+
24+
// Receiver is an interface that allows using implementations of the builder
25+
// from different packages.
26+
type Receiver interface {
27+
CreateTraces(context.Context, receiver.Settings, consumer.Traces) (receiver.Traces, error)
28+
CreateMetrics(context.Context, receiver.Settings, consumer.Metrics) (receiver.Metrics, error)
29+
CreateLogs(context.Context, receiver.Settings, consumer.Logs) (receiver.Logs, error)
30+
Factory(component.Type) component.Factory
31+
}
32+
33+
// ReceiverBuilder receiver is a helper struct that given a set of Configs and
34+
// Factories helps with creating receivers.
35+
type ReceiverBuilder struct {
36+
cfgs map[component.ID]component.Config
37+
factories map[component.Type]receiver.Factory
38+
}
39+
40+
// NewReceiver creates a new ReceiverBuilder to help with creating
41+
// components form a set of configs and factories.
42+
func NewReceiver(cfgs map[component.ID]component.Config, factories map[component.Type]receiver.Factory) *ReceiverBuilder {
43+
return &ReceiverBuilder{cfgs: cfgs, factories: factories}
44+
}
45+
46+
// CreateTraces creates a Traces receiver based on the settings and config.
47+
func (b *ReceiverBuilder) CreateTraces(ctx context.Context, set receiver.Settings, next consumer.Traces) (receiver.Traces, 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.TracesReceiverStability())
62+
return f.CreateTracesReceiver(ctx, set, cfg, next)
63+
}
64+
65+
// CreateMetrics creates a Metrics receiver based on the settings and config.
66+
func (b *ReceiverBuilder) CreateMetrics(ctx context.Context, set receiver.Settings, next consumer.Metrics) (receiver.Metrics, 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.MetricsReceiverStability())
81+
return f.CreateMetricsReceiver(ctx, set, cfg, next)
82+
}
83+
84+
// CreateLogs creates a Logs receiver based on the settings and config.
85+
func (b *ReceiverBuilder) CreateLogs(ctx context.Context, set receiver.Settings, next consumer.Logs) (receiver.Logs, error) {
86+
if next == nil {
87+
return nil, errNilNextConsumer
88+
}
89+
cfg, existsCfg := b.cfgs[set.ID]
90+
if !existsCfg {
91+
return nil, fmt.Errorf("receiver %q is not configured", set.ID)
92+
}
93+
94+
f, existsFactory := b.factories[set.ID.Type()]
95+
if !existsFactory {
96+
return nil, fmt.Errorf("receiver factory not available for: %q", set.ID)
97+
}
98+
99+
logStabilityLevel(set.Logger, f.LogsReceiverStability())
100+
return f.CreateLogsReceiver(ctx, set, cfg, next)
101+
}
102+
103+
func (b *ReceiverBuilder) Factory(componentType component.Type) component.Factory {
104+
return b.factories[componentType]
105+
}
106+
107+
// logStabilityLevel logs the stability level of a component. The log level is set to info for
108+
// undefined, unmaintained, deprecated and development. The log level is set to debug
109+
// for alpha, beta and stable.
110+
func logStabilityLevel(logger *zap.Logger, sl component.StabilityLevel) {
111+
if sl >= component.StabilityLevelAlpha {
112+
logger.Debug(sl.LogMessage())
113+
} else {
114+
logger.Info(sl.LogMessage())
115+
}
116+
}
117+
118+
// NewNopReceiverConfigsAndFactories returns a configuration and factories that allows building a new nop receiver.
119+
func NewNopReceiverConfigsAndFactories() (map[component.ID]component.Config, map[component.Type]receiver.Factory) {
120+
nopFactory := receivertest.NewNopFactory()
121+
configs := map[component.ID]component.Config{
122+
component.NewID(nopType): nopFactory.CreateDefaultConfig(),
123+
}
124+
factories := map[component.Type]receiver.Factory{
125+
nopType: nopFactory,
126+
}
127+
128+
return configs, factories
129+
}

0 commit comments

Comments
 (0)