Skip to content

Commit 09ba009

Browse files
committed
Add singleton flags to factories
1 parent 0ece678 commit 09ba009

File tree

11 files changed

+104
-3
lines changed

11 files changed

+104
-3
lines changed

connector/connector.go

+21
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,17 @@ type Factory interface {
112112
LogsToMetricsStability() component.StabilityLevel
113113
LogsToLogsStability() component.StabilityLevel
114114

115+
// Metadata returns the metadata describing the receiver.
116+
Metadata() Metadata
117+
115118
unexportedFactoryFunc()
116119
}
117120

121+
// Metadata contains metadata describing the component that is created by the factory.
122+
type Metadata struct {
123+
SingletonInstance bool
124+
}
125+
118126
// FactoryOption applies changes to Factory.
119127
type FactoryOption interface {
120128
// apply applies the option.
@@ -301,6 +309,13 @@ func WithLogsToLogs(createLogsToLogs CreateLogsToLogsFunc, sl component.Stabilit
301309
})
302310
}
303311

312+
// AsSingletonInstance indicates that the factory always returns the same instance of the component.
313+
func AsSingletonInstance() FactoryOption {
314+
return factoryOptionFunc(func(o *factory) {
315+
o.metadata.SingletonInstance = true
316+
})
317+
}
318+
304319
// factory implements the Factory interface.
305320
type factory struct {
306321
cfgType component.Type
@@ -329,6 +344,8 @@ type factory struct {
329344
logsToTracesStabilityLevel component.StabilityLevel
330345
logsToMetricsStabilityLevel component.StabilityLevel
331346
logsToLogsStabilityLevel component.StabilityLevel
347+
348+
metadata Metadata
332349
}
333350

334351
// Type returns the type of component.
@@ -374,6 +391,10 @@ func (f *factory) LogsToLogsStability() component.StabilityLevel {
374391
return f.logsToLogsStabilityLevel
375392
}
376393

394+
func (f *factory) Metadata() Metadata {
395+
return f.metadata
396+
}
397+
377398
// NewFactory returns a Factory.
378399
func NewFactory(cfgType component.Type, createDefaultConfig component.CreateDefaultConfigFunc, options ...FactoryOption) Factory {
379400
f := &factory{

connector/connector_test.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,17 @@ func TestNewFactoryNoOptions(t *testing.T) {
4848
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalLogs, pipeline.SignalMetrics))
4949
_, err = factory.CreateLogsToLogs(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
5050
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalLogs, pipeline.SignalLogs))
51+
52+
assert.False(t, factory.Metadata().SingletonInstance)
5153
}
5254

5355
func TestNewFactoryWithSameTypes(t *testing.T) {
5456
defaultCfg := struct{}{}
5557
factory := NewFactory(testType, func() component.Config { return &defaultCfg },
5658
WithTracesToTraces(createTracesToTraces, component.StabilityLevelAlpha),
5759
WithMetricsToMetrics(createMetricsToMetrics, component.StabilityLevelBeta),
58-
WithLogsToLogs(createLogsToLogs, component.StabilityLevelUnmaintained))
60+
WithLogsToLogs(createLogsToLogs, component.StabilityLevelUnmaintained),
61+
AsSingletonInstance())
5962
assert.EqualValues(t, testType, factory.Type())
6063
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
6164

@@ -85,6 +88,8 @@ func TestNewFactoryWithSameTypes(t *testing.T) {
8588
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalLogs, pipeline.SignalTraces))
8689
_, err = factory.CreateLogsToMetrics(context.Background(), Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
8790
assert.Equal(t, err, internal.ErrDataTypes(testID, pipeline.SignalLogs, pipeline.SignalMetrics))
91+
92+
assert.True(t, factory.Metadata().SingletonInstance)
8893
}
8994

9095
func TestNewFactoryWithTranslateTypes(t *testing.T) {

connector/xconnector/connector.go

+7
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,13 @@ func WithProfilesToLogs(createProfilesToLogs CreateProfilesToLogsFunc, sl compon
269269
})
270270
}
271271

272+
// AsSingletonInstance sets the connector as a singleton instance.
273+
func AsSingletonInstance() FactoryOption {
274+
return factoryOptionFunc(func(o *factoryOpts) {
275+
o.opts = append(o.opts, connector.AsSingletonInstance())
276+
})
277+
}
278+
272279
// factory implements the Factory interface.
273280
type factory struct {
274281
connector.Factory

connector/xconnector/connector_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,15 @@ func TestNewFactoryNoOptions(t *testing.T) {
4444
assert.Equal(t, err, internal.ErrDataTypes(testID, xpipeline.SignalProfiles, pipeline.SignalMetrics))
4545
_, err = factory.CreateProfilesToLogs(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
4646
assert.Equal(t, err, internal.ErrDataTypes(testID, xpipeline.SignalProfiles, pipeline.SignalLogs))
47+
48+
assert.False(t, factory.Metadata().SingletonInstance)
4749
}
4850

4951
func TestNewFactoryWithSameTypes(t *testing.T) {
5052
defaultCfg := struct{}{}
5153
factory := NewFactory(testType, func() component.Config { return &defaultCfg },
5254
WithProfilesToProfiles(createProfilesToProfiles, component.StabilityLevelAlpha),
55+
AsSingletonInstance(),
5356
)
5457
assert.EqualValues(t, testType, factory.Type())
5558
assert.EqualValues(t, &defaultCfg, factory.CreateDefaultConfig())
@@ -64,6 +67,8 @@ func TestNewFactoryWithSameTypes(t *testing.T) {
6467
assert.Equal(t, err, internal.ErrDataTypes(testID, xpipeline.SignalProfiles, pipeline.SignalMetrics))
6568
_, err = factory.CreateProfilesToLogs(context.Background(), connector.Settings{ID: testID}, &defaultCfg, consumertest.NewNop())
6669
assert.Equal(t, err, internal.ErrDataTypes(testID, xpipeline.SignalProfiles, pipeline.SignalLogs))
70+
71+
assert.True(t, factory.Metadata().SingletonInstance)
6772
}
6873

6974
func TestNewFactoryWithTranslateTypes(t *testing.T) {

exporter/exporter.go

+20
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,17 @@ type Factory interface {
7272
// LogsStability gets the stability level of the Logs exporter.
7373
LogsStability() component.StabilityLevel
7474

75+
// Metadata returns the metadata describing the receiver.
76+
Metadata() Metadata
77+
7578
unexportedFactoryFunc()
7679
}
7780

81+
// Metadata contains metadata describing the component that is created by the factory.
82+
type Metadata struct {
83+
SingletonInstance bool
84+
}
85+
7886
// FactoryOption apply changes to Factory.
7987
type FactoryOption interface {
8088
// applyOption applies the option.
@@ -132,6 +140,7 @@ type factory struct {
132140
metricsStabilityLevel component.StabilityLevel
133141
CreateLogsFunc
134142
logsStabilityLevel component.StabilityLevel
143+
metadata Metadata
135144
}
136145

137146
func (f *factory) Type() component.Type {
@@ -152,6 +161,10 @@ func (f *factory) LogsStability() component.StabilityLevel {
152161
return f.logsStabilityLevel
153162
}
154163

164+
func (f *factory) Metadata() Metadata {
165+
return f.metadata
166+
}
167+
155168
// WithTraces overrides the default "error not supported" implementation for Factory.CreateTraces and the default "undefined" stability level.
156169
func WithTraces(createTraces CreateTracesFunc, sl component.StabilityLevel) FactoryOption {
157170
return factoryOptionFunc(func(o *factory) {
@@ -176,6 +189,13 @@ func WithLogs(createLogs CreateLogsFunc, sl component.StabilityLevel) FactoryOpt
176189
})
177190
}
178191

192+
// AsSingletonInstance indicates that the factory always returns the same instance of the component.
193+
func AsSingletonInstance() FactoryOption {
194+
return factoryOptionFunc(func(o *factory) {
195+
o.metadata.SingletonInstance = true
196+
})
197+
}
198+
179199
// NewFactory returns a Factory.
180200
func NewFactory(cfgType component.Type, createDefaultConfig component.CreateDefaultConfigFunc, options ...FactoryOption) Factory {
181201
f := &factory{

exporter/exporter_test.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ func TestNewFactory(t *testing.T) {
2929
require.ErrorIs(t, err, pipeline.ErrSignalNotSupported)
3030
_, err = f.CreateLogs(context.Background(), Settings{}, &defaultCfg)
3131
require.ErrorIs(t, err, pipeline.ErrSignalNotSupported)
32+
assert.False(t, f.Metadata().SingletonInstance)
3233
}
3334

3435
func TestNewFactoryWithOptions(t *testing.T) {
@@ -39,7 +40,8 @@ func TestNewFactoryWithOptions(t *testing.T) {
3940
func() component.Config { return &defaultCfg },
4041
WithTraces(createTraces, component.StabilityLevelDevelopment),
4142
WithMetrics(createMetrics, component.StabilityLevelAlpha),
42-
WithLogs(createLogs, component.StabilityLevelDeprecated))
43+
WithLogs(createLogs, component.StabilityLevelDeprecated),
44+
AsSingletonInstance())
4345
assert.EqualValues(t, testType, f.Type())
4446
assert.EqualValues(t, &defaultCfg, f.CreateDefaultConfig())
4547

@@ -54,6 +56,8 @@ func TestNewFactoryWithOptions(t *testing.T) {
5456
assert.Equal(t, component.StabilityLevelDeprecated, f.LogsStability())
5557
_, err = f.CreateLogs(context.Background(), Settings{}, &defaultCfg)
5658
assert.NoError(t, err)
59+
60+
assert.True(t, f.Metadata().SingletonInstance)
5761
}
5862

5963
func TestMakeFactoryMap(t *testing.T) {

exporter/xexporter/exporter.go

+7
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ func WithProfiles(createProfiles CreateProfilesFunc, sl component.StabilityLevel
8888
})
8989
}
9090

91+
// AsSingletonInstance sets the exporter as a singleton instance.
92+
func AsSingletonInstance() FactoryOption {
93+
return factoryOptionFunc(func(o *factoryOpts) {
94+
o.opts = append(o.opts, exporter.AsSingletonInstance())
95+
})
96+
}
97+
9198
type factory struct {
9299
exporter.Factory
93100
CreateProfilesFunc

receiver/otlpreceiver/factory.go

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ func NewFactory() receiver.Factory {
3434
xreceiver.WithMetrics(createMetrics, metadata.MetricsStability),
3535
xreceiver.WithLogs(createLog, metadata.LogsStability),
3636
xreceiver.WithProfiles(createProfiles, metadata.ProfilesStability),
37+
xreceiver.AsSingletonInstance(),
3738
)
3839
}
3940

receiver/receiver.go

+20
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,17 @@ type Factory interface {
8484
// LogsStability gets the stability level of the Logs receiver.
8585
LogsStability() component.StabilityLevel
8686

87+
// Metadata returns the metadata describing the receiver.
88+
Metadata() Metadata
89+
8790
unexportedFactoryFunc()
8891
}
8992

93+
// Metadata contains metadata describing the component that is created by the factory.
94+
type Metadata struct {
95+
SingletonInstance bool
96+
}
97+
9098
// FactoryOption apply changes to Factory.
9199
type FactoryOption interface {
92100
// applyOption applies the option.
@@ -142,6 +150,7 @@ type factory struct {
142150
metricsStabilityLevel component.StabilityLevel
143151
CreateLogsFunc
144152
logsStabilityLevel component.StabilityLevel
153+
metadata Metadata
145154
}
146155

147156
func (f *factory) Type() component.Type {
@@ -162,6 +171,10 @@ func (f *factory) LogsStability() component.StabilityLevel {
162171
return f.logsStabilityLevel
163172
}
164173

174+
func (f *factory) Metadata() Metadata {
175+
return f.metadata
176+
}
177+
165178
// WithTraces overrides the default "error not supported" implementation for Factory.CreateTraces and the default "undefined" stability level.
166179
func WithTraces(createTraces CreateTracesFunc, sl component.StabilityLevel) FactoryOption {
167180
return factoryOptionFunc(func(o *factory) {
@@ -186,6 +199,13 @@ func WithLogs(createLogs CreateLogsFunc, sl component.StabilityLevel) FactoryOpt
186199
})
187200
}
188201

202+
// AsSingletonInstance indicates that the factory always returns the same instance of the component.
203+
func AsSingletonInstance() FactoryOption {
204+
return factoryOptionFunc(func(o *factory) {
205+
o.metadata.SingletonInstance = true
206+
})
207+
}
208+
189209
// NewFactory returns a Factory.
190210
func NewFactory(cfgType component.Type, createDefaultConfig component.CreateDefaultConfigFunc, options ...FactoryOption) Factory {
191211
f := &factory{

receiver/receiver_test.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ func TestNewFactory(t *testing.T) {
3030
require.ErrorIs(t, err, pipeline.ErrSignalNotSupported)
3131
_, err = f.CreateLogs(context.Background(), Settings{}, &defaultCfg, consumertest.NewNop())
3232
require.ErrorIs(t, err, pipeline.ErrSignalNotSupported)
33+
assert.False(t, f.Metadata().SingletonInstance)
3334
}
3435

3536
func TestNewFactoryWithOptions(t *testing.T) {
@@ -40,7 +41,8 @@ func TestNewFactoryWithOptions(t *testing.T) {
4041
func() component.Config { return &defaultCfg },
4142
WithTraces(createTraces, component.StabilityLevelDeprecated),
4243
WithMetrics(createMetrics, component.StabilityLevelAlpha),
43-
WithLogs(createLogs, component.StabilityLevelStable))
44+
WithLogs(createLogs, component.StabilityLevelStable),
45+
AsSingletonInstance())
4446
assert.EqualValues(t, testType, f.Type())
4547
assert.EqualValues(t, &defaultCfg, f.CreateDefaultConfig())
4648

@@ -55,6 +57,8 @@ func TestNewFactoryWithOptions(t *testing.T) {
5557
assert.Equal(t, component.StabilityLevelStable, f.LogsStability())
5658
_, err = f.CreateLogs(context.Background(), Settings{}, &defaultCfg, nil)
5759
assert.NoError(t, err)
60+
61+
assert.True(t, f.Metadata().SingletonInstance)
5862
}
5963

6064
func TestMakeFactoryMap(t *testing.T) {

receiver/xreceiver/profiles.go

+7
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ func WithProfiles(createProfiles CreateProfilesFunc, sl component.StabilityLevel
105105
})
106106
}
107107

108+
// AsSingletonInstance sets the receiver as a singleton instance.
109+
func AsSingletonInstance() FactoryOption {
110+
return factoryOptionFunc(func(o *factoryOpts) {
111+
o.opts = append(o.opts, receiver.AsSingletonInstance())
112+
})
113+
}
114+
108115
// NewFactory returns a Factory.
109116
func NewFactory(cfgType component.Type, createDefaultConfig component.CreateDefaultConfigFunc, options ...FactoryOption) Factory {
110117
opts := factoryOpts{factory: &factory{}}

0 commit comments

Comments
 (0)