@@ -32,7 +32,7 @@ var usePullingBasedExporterQueueBatcher = featuregate.GlobalRegistry().MustRegis
32
32
featuregate .WithRegisterDescription ("if set to true, turns on the pulling-based exporter queue bathcer" ),
33
33
)
34
34
35
- type ObsrepSenderFactory = func (obsrep * ObsReport ) Sender [internal.Request ]
35
+ type ObsrepSenderFactory = func (obsrep * ObsReport , next Sender [internal. Request ] ) Sender [internal.Request ]
36
36
37
37
// Option apply changes to BaseExporter.
38
38
type Option func (* BaseExporter ) error
@@ -52,17 +52,20 @@ type BaseExporter struct {
52
52
// Chain of senders that the exporter helper applies before passing the data to the actual exporter.
53
53
// The data is handled by each sender in the respective order starting from the queueSender.
54
54
// Most of the senders are optional, and initialized with a no-op path-through sender.
55
- BatchSender Sender [internal.Request ]
56
- QueueSender Sender [internal.Request ]
57
- ObsrepSender Sender [internal.Request ]
58
- RetrySender Sender [internal.Request ]
59
- TimeoutSender * TimeoutSender // TimeoutSender is always initialized.
55
+ BatchSender Sender [internal.Request ]
56
+ QueueSender Sender [internal.Request ]
57
+ ObsrepSender Sender [internal.Request ]
58
+ RetrySender Sender [internal.Request ]
59
+
60
+ firstSender Sender [internal.Request ]
60
61
61
62
ConsumerOptions []consumer.Option
62
63
63
- queueCfg exporterqueue.Config
64
+ timeoutCfg TimeoutConfig
65
+ retryCfg configretry.BackOffConfig
64
66
queueFactory exporterqueue.Factory [internal.Request ]
65
- BatcherCfg exporterbatcher.Config
67
+ queueCfg exporterqueue.Config
68
+ batcherCfg exporterbatcher.Config
66
69
}
67
70
68
71
func NewBaseExporter (set exporter.Settings , signal pipeline.Signal , osf ObsrepSenderFactory , options ... Option ) (* BaseExporter , error ) {
@@ -72,49 +75,50 @@ func NewBaseExporter(set exporter.Settings, signal pipeline.Signal, osf ObsrepSe
72
75
}
73
76
74
77
be := & BaseExporter {
75
- BatchSender : & BaseSender [internal.Request ]{},
76
- QueueSender : & BaseSender [internal.Request ]{},
77
- ObsrepSender : osf (obsReport ),
78
- RetrySender : & BaseSender [internal.Request ]{},
79
- TimeoutSender : & TimeoutSender {cfg : NewDefaultTimeoutConfig ()},
80
-
81
- Set : set ,
78
+ timeoutCfg : NewDefaultTimeoutConfig (),
79
+ Set : set ,
82
80
}
83
81
84
82
for _ , op := range options {
85
- err = multierr .Append (err , op (be ))
83
+ if err = op (be ); err != nil {
84
+ return nil , err
85
+ }
86
86
}
87
- if err != nil {
88
- return nil , err
87
+
88
+ // TimeoutSender is always initialized.
89
+ be .firstSender = & TimeoutSender {cfg : be .timeoutCfg }
90
+ if be .retryCfg .Enabled {
91
+ be .RetrySender = newRetrySender (be .retryCfg , set , be .firstSender )
92
+ be .firstSender = be .RetrySender
93
+ }
94
+
95
+ be .ObsrepSender = osf (obsReport , be .firstSender )
96
+ be .firstSender = be .ObsrepSender
97
+
98
+ if ! usePullingBasedExporterQueueBatcher .IsEnabled () && be .batcherCfg .Enabled ||
99
+ usePullingBasedExporterQueueBatcher .IsEnabled () && be .batcherCfg .Enabled && ! be .queueCfg .Enabled {
100
+ bs := NewBatchSender (be .batcherCfg , set , be .firstSender )
101
+ if be .queueCfg .Enabled {
102
+ bs .concurrencyLimit = int64 (be .queueCfg .NumConsumers )
103
+ }
104
+ be .BatchSender = bs
105
+ be .firstSender = be .BatchSender
89
106
}
90
107
91
108
if be .queueCfg .Enabled {
92
109
qSet := exporterqueue.Settings {
93
110
Signal : signal ,
94
- ExporterSettings : be . Set ,
111
+ ExporterSettings : set ,
95
112
}
96
- q := be .queueFactory (context .Background (), qSet , be .queueCfg )
97
- q , err = newObsQueue (qSet , q )
113
+ be .QueueSender , err = NewQueueSender (be .queueFactory , qSet , be .queueCfg , be .batcherCfg , be .ExportFailureMessage , be .firstSender )
98
114
if err != nil {
99
115
return nil , err
100
116
}
101
- be .QueueSender = NewQueueSender (q , be .Set , be .queueCfg .NumConsumers , be .ExportFailureMessage , be .BatcherCfg )
102
- }
103
-
104
- if ! usePullingBasedExporterQueueBatcher .IsEnabled () && be .BatcherCfg .Enabled ||
105
- usePullingBasedExporterQueueBatcher .IsEnabled () && be .BatcherCfg .Enabled && ! be .queueCfg .Enabled {
106
- bs := NewBatchSender (be .BatcherCfg , be .Set )
107
- be .BatchSender = bs
117
+ be .firstSender = be .QueueSender
108
118
}
109
119
110
- be .connectSenders ()
111
-
112
- if bs , ok := be .BatchSender .(* BatchSender ); ok {
113
- // If queue sender is enabled assign to the batch sender the same number of workers.
114
- if qs , ok := be .QueueSender .(* QueueSender ); ok {
115
- bs .concurrencyLimit = int64 (qs .numConsumers )
116
- }
117
- // Batcher sender mutates the data.
120
+ if be .batcherCfg .Enabled {
121
+ // Batcher mutates the data.
118
122
be .ConsumerOptions = append (be .ConsumerOptions , consumer .WithCapabilities (consumer.Capabilities {MutatesData : true }))
119
123
}
120
124
@@ -123,47 +127,55 @@ func NewBaseExporter(set exporter.Settings, signal pipeline.Signal, osf ObsrepSe
123
127
124
128
// Send sends the request using the first sender in the chain.
125
129
func (be * BaseExporter ) Send (ctx context.Context , req internal.Request ) error {
126
- err := be .QueueSender .Send (ctx , req )
130
+ err := be .firstSender .Send (ctx , req )
127
131
if err != nil {
128
132
be .Set .Logger .Error ("Exporting failed. Rejecting data." + be .ExportFailureMessage ,
129
133
zap .Error (err ), zap .Int ("rejected_items" , req .ItemsCount ()))
130
134
}
131
135
return err
132
136
}
133
137
134
- // connectSenders connects the senders in the predefined order.
135
- func (be * BaseExporter ) connectSenders () {
136
- be .QueueSender .SetNextSender (be .BatchSender )
137
- be .BatchSender .SetNextSender (be .ObsrepSender )
138
- be .ObsrepSender .SetNextSender (be .RetrySender )
139
- be .RetrySender .SetNextSender (be .TimeoutSender )
140
- }
141
-
142
138
func (be * BaseExporter ) Start (ctx context.Context , host component.Host ) error {
143
139
// First start the wrapped exporter.
144
140
if err := be .StartFunc .Start (ctx , host ); err != nil {
145
141
return err
146
142
}
147
143
148
- // If no error then start the BatchSender.
149
- if err := be .BatchSender .Start (ctx , host ); err != nil {
150
- return err
144
+ if be .BatchSender != nil {
145
+ // If no error then start the BatchSender.
146
+ if err := be .BatchSender .Start (ctx , host ); err != nil {
147
+ return err
148
+ }
151
149
}
152
150
153
151
// Last start the queueSender.
154
- return be .QueueSender .Start (ctx , host )
152
+ if be .QueueSender != nil {
153
+ return be .QueueSender .Start (ctx , host )
154
+ }
155
+
156
+ return nil
155
157
}
156
158
157
159
func (be * BaseExporter ) Shutdown (ctx context.Context ) error {
158
- return multierr .Combine (
159
- // First shutdown the retry sender, so the queue sender can flush the queue without retries.
160
- be .RetrySender .Shutdown (ctx ),
161
- // Then shutdown the batch sender
162
- be .BatchSender .Shutdown (ctx ),
163
- // Then shutdown the queue sender.
164
- be .QueueSender .Shutdown (ctx ),
165
- // Last shutdown the wrapped exporter itself.
166
- be .ShutdownFunc .Shutdown (ctx ))
160
+ var err error
161
+
162
+ // First shutdown the retry sender, so the queue sender can flush the queue without retries.
163
+ if be .RetrySender != nil {
164
+ err = multierr .Append (err , be .RetrySender .Shutdown (ctx ))
165
+ }
166
+
167
+ // Then shutdown the batch sender
168
+ if be .BatchSender != nil {
169
+ err = multierr .Append (err , be .BatchSender .Shutdown (ctx ))
170
+ }
171
+
172
+ // Then shutdown the queue sender.
173
+ if be .QueueSender != nil {
174
+ err = multierr .Append (err , be .QueueSender .Shutdown (ctx ))
175
+ }
176
+
177
+ // Last shutdown the wrapped exporter itself.
178
+ return multierr .Append (err , be .ShutdownFunc .Shutdown (ctx ))
167
179
}
168
180
169
181
// WithStart overrides the default Start function for an exporter.
@@ -188,7 +200,7 @@ func WithShutdown(shutdown component.ShutdownFunc) Option {
188
200
// The default TimeoutConfig is 5 seconds.
189
201
func WithTimeout (timeoutConfig TimeoutConfig ) Option {
190
202
return func (o * BaseExporter ) error {
191
- o .TimeoutSender . cfg = timeoutConfig
203
+ o .timeoutCfg = timeoutConfig
192
204
return nil
193
205
}
194
206
}
@@ -201,7 +213,7 @@ func WithRetry(config configretry.BackOffConfig) Option {
201
213
o .ExportFailureMessage += " Try enabling retry_on_failure config option to retry on retryable errors."
202
214
return nil
203
215
}
204
- o .RetrySender = newRetrySender ( config , o . Set )
216
+ o .retryCfg = config
205
217
return nil
206
218
}
207
219
}
@@ -268,7 +280,7 @@ func WithCapabilities(capabilities consumer.Capabilities) Option {
268
280
// until https://github.com/open-telemetry/opentelemetry-collector/issues/8122 is resolved.
269
281
func WithBatcher (cfg exporterbatcher.Config ) Option {
270
282
return func (o * BaseExporter ) error {
271
- o .BatcherCfg = cfg
283
+ o .batcherCfg = cfg
272
284
return nil
273
285
}
274
286
}
0 commit comments