Skip to content

Commit 3804d00

Browse files
committed
use exponential backoff
1 parent 494fce9 commit 3804d00

File tree

5 files changed

+41
-6
lines changed

5 files changed

+41
-6
lines changed

receiver/kafkareceiver/config.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"time"
88

99
"go.opentelemetry.io/collector/component"
10+
"go.opentelemetry.io/collector/config/configretry"
1011

1112
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter"
1213
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka"
@@ -87,7 +88,7 @@ type Config struct {
8788
MaxFetchSize int32 `mapstructure:"max_fetch_size"`
8889

8990
// In case of some errors returned by the next consumer, the receiver will wait before consuming the next message
90-
ErrorBackoff time.Duration `mapstructure:"error_backoff"`
91+
ErrorBackOff configretry.BackOffConfig `mapstructure:"error_backoff"`
9192
}
9293

9394
const (

receiver/kafkareceiver/config_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/stretchr/testify/assert"
1212
"github.com/stretchr/testify/require"
1313
"go.opentelemetry.io/collector/component"
14+
"go.opentelemetry.io/collector/config/configretry"
1415
"go.opentelemetry.io/collector/config/configtls"
1516
"go.opentelemetry.io/collector/confmap/confmaptest"
1617

@@ -65,6 +66,9 @@ func TestLoadConfig(t *testing.T) {
6566
MinFetchSize: 1,
6667
DefaultFetchSize: 1048576,
6768
MaxFetchSize: 0,
69+
ErrorBackOff: configretry.BackOffConfig{
70+
Enabled: false,
71+
},
6872
},
6973
},
7074
{
@@ -101,6 +105,13 @@ func TestLoadConfig(t *testing.T) {
101105
MinFetchSize: 1,
102106
DefaultFetchSize: 1048576,
103107
MaxFetchSize: 0,
108+
ErrorBackOff: configretry.BackOffConfig{
109+
Enabled: true,
110+
InitialInterval: 1 * time.Second,
111+
MaxInterval: 10 * time.Second,
112+
MaxElapsedTime: 1 * time.Minute,
113+
Multiplier: 1.5,
114+
},
104115
},
105116
},
106117
}

receiver/kafkareceiver/kafka_receiver.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/IBM/sarama"
1515
"github.com/cenkalti/backoff/v4"
1616
"go.opentelemetry.io/collector/component"
17+
"go.opentelemetry.io/collector/config/configretry"
1718
"go.opentelemetry.io/collector/consumer"
1819
"go.opentelemetry.io/collector/pdata/plog"
1920
"go.opentelemetry.io/collector/pdata/pmetric"
@@ -207,7 +208,7 @@ func (c *kafkaTracesConsumer) Start(_ context.Context, host component.Host) erro
207208
messageMarking: c.messageMarking,
208209
headerExtractor: &nopHeaderExtractor{},
209210
telemetryBuilder: c.telemetryBuilder,
210-
backOff: backoff.NewConstantBackOff(c.config.ErrorBackoff),
211+
backOff: newExponentialBackOff(c.config.ErrorBackOff),
211212
}
212213
if c.headerExtraction {
213214
consumerGroup.headerExtractor = &headerExtractor{
@@ -221,6 +222,20 @@ func (c *kafkaTracesConsumer) Start(_ context.Context, host component.Host) erro
221222
return nil
222223
}
223224

225+
func newExponentialBackOff(config configretry.BackOffConfig) *backoff.ExponentialBackOff {
226+
if !config.Enabled {
227+
return nil
228+
}
229+
backOff := backoff.NewExponentialBackOff()
230+
backOff.InitialInterval = config.InitialInterval
231+
backOff.RandomizationFactor = config.RandomizationFactor
232+
backOff.Multiplier = config.Multiplier
233+
backOff.MaxInterval = config.MaxInterval
234+
backOff.MaxElapsedTime = config.MaxElapsedTime
235+
backOff.Reset()
236+
return backOff
237+
}
238+
224239
func (c *kafkaTracesConsumer) consumeLoop(ctx context.Context, handler sarama.ConsumerGroupHandler) {
225240
defer c.consumeLoopWG.Done()
226241
for {
@@ -484,7 +499,7 @@ type tracesConsumerGroupHandler struct {
484499
autocommitEnabled bool
485500
messageMarking MessageMarking
486501
headerExtractor HeaderExtractor
487-
backOff backoff.BackOff
502+
backOff *backoff.ExponentialBackOff
488503
}
489504

490505
type metricsConsumerGroupHandler struct {
@@ -587,7 +602,7 @@ func (c *tracesConsumerGroupHandler) ConsumeClaim(session sarama.ConsumerGroupSe
587602
if c.messageMarking.After && c.messageMarking.OnError {
588603
session.MarkMessage(message, "")
589604
}
590-
if errorRequiresBackoff(err) {
605+
if errorRequiresBackoff(err) && c.backOff != nil {
591606
select {
592607
case <-session.Context().Done():
593608
return nil

receiver/kafkareceiver/kafka_receiver_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ func TestTracesConsumerGroupHandler_error_nextConsumer(t *testing.T) {
353353
{
354354
name: "memory limiter data refused error",
355355
expectedError: memoryLimiterError,
356-
expectedBackoff: 1 * time.Second,
356+
expectedBackoff: backoff.DefaultInitialInterval,
357357
},
358358
{
359359
name: "other consumer error",
@@ -364,6 +364,8 @@ func TestTracesConsumerGroupHandler_error_nextConsumer(t *testing.T) {
364364

365365
for _, tt := range tests {
366366
t.Run(tt.name, func(t *testing.T) {
367+
backOff := backoff.NewExponentialBackOff()
368+
backOff.RandomizationFactor = 0
367369
c := tracesConsumerGroupHandler{
368370
unmarshaler: newPdataTracesUnmarshaler(&ptrace.ProtoUnmarshaler{}, defaultEncoding),
369371
logger: zap.NewNop(),
@@ -372,7 +374,7 @@ func TestTracesConsumerGroupHandler_error_nextConsumer(t *testing.T) {
372374
obsrecv: obsrecv,
373375
headerExtractor: &nopHeaderExtractor{},
374376
telemetryBuilder: nopTelemetryBuilder(t),
375-
backOff: backoff.NewConstantBackOff(1 * time.Second),
377+
backOff: backOff,
376378
}
377379

378380
wg := sync.WaitGroup{}

receiver/kafkareceiver/testdata/config.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,9 @@ kafka/logs:
3535
retry:
3636
max: 10
3737
backoff: 5s
38+
error_backoff:
39+
enabled: true
40+
initial_interval: 1s
41+
max_interval: 10s
42+
max_elapsed_time: 1m
43+
multiplier: 1.5

0 commit comments

Comments
 (0)