Skip to content

Commit aa9ef37

Browse files
[8.19](backport #46846) fix: add retry for listener creation in libbeat (#46862)
* fix: add retry for listener creation in libbeat (#46846) * fix: add retry for listener creation in libbeat * rename * context * remove deprecated * cleanup * cleanup * retry at API level instead of listener (cherry picked from commit 32b5e5a) # Conflicts: # x-pack/libbeat/cmd/instance/receiver.go * merge conflicts --------- Co-authored-by: Vihas Makwana <[email protected]> Co-authored-by: Vihas <[email protected]>
1 parent 8cf0494 commit aa9ef37

File tree

3 files changed

+25
-15
lines changed

3 files changed

+25
-15
lines changed

x-pack/filebeat/fbreceiver/factory.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func createDefaultConfig() component.Config {
3030
return &Config{}
3131
}
3232

33-
func createReceiver(_ context.Context, set receiver.Settings, baseCfg component.Config, consumer consumer.Logs) (receiver.Logs, error) {
33+
func createReceiver(ctx context.Context, set receiver.Settings, baseCfg component.Config, consumer consumer.Logs) (receiver.Logs, error) {
3434
cfg, ok := baseCfg.(*Config)
3535
if !ok {
3636
return nil, fmt.Errorf("could not convert otel config to filebeat config")
@@ -51,7 +51,7 @@ func createReceiver(_ context.Context, set receiver.Settings, baseCfg component.
5151
}
5252

5353
beatCreator := beater.New(inputs.Init)
54-
br, err := xpInstance.NewBeatReceiver(b, beatCreator)
54+
br, err := xpInstance.NewBeatReceiver(ctx, b, beatCreator)
5555
if err != nil {
5656
return nil, fmt.Errorf("error creating %s:%w", Name, err)
5757
}

x-pack/libbeat/cmd/instance/receiver.go

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@
55
package instance
66

77
import (
8+
"context"
89
"encoding/json"
910
"fmt"
1011
"io"
12+
"time"
1113

1214
"github.com/elastic/beats/v7/libbeat/api"
1315
"github.com/elastic/beats/v7/libbeat/beat"
1416
"github.com/elastic/beats/v7/libbeat/cfgfile"
1517
"github.com/elastic/beats/v7/libbeat/cmd/instance"
18+
"github.com/elastic/beats/v7/libbeat/common/backoff"
1619
"github.com/elastic/beats/v7/x-pack/libbeat/common/otelbeat/otelmanager"
1720
"github.com/elastic/beats/v7/x-pack/libbeat/common/otelbeat/status"
1821
_ "github.com/elastic/beats/v7/x-pack/libbeat/include"
@@ -31,7 +34,7 @@ type BeatReceiver struct {
3134
}
3235

3336
// NewBeatReceiver creates a BeatReceiver. This will also create the beater and start the monitoring server if configured
34-
func NewBeatReceiver(b *instance.Beat, creator beat.Creator) (BeatReceiver, error) {
37+
func NewBeatReceiver(ctx context.Context, b *instance.Beat, creator beat.Creator) (BeatReceiver, error) {
3538
beatConfig, err := b.BeatConfig()
3639
if err != nil {
3740
return BeatReceiver{}, fmt.Errorf("error getting beat config: %w", err)
@@ -59,18 +62,25 @@ func NewBeatReceiver(b *instance.Beat, creator beat.Creator) (BeatReceiver, erro
5962
}
6063

6164
if b.Config.HTTP.Enabled() {
62-
var err error
63-
b.API, err = api.NewWithDefaultRoutes(
64-
logp.L().Named("metrics.http"),
65-
b.Config.HTTP,
66-
b.Monitoring.InfoRegistry(),
67-
b.Monitoring.StateRegistry(),
68-
b.Monitoring.StatsRegistry(),
69-
b.Monitoring.InputsRegistry())
65+
retryer := backoff.NewRetryer(50, 100*time.Millisecond, 1*time.Second)
66+
err := retryer.Retry(ctx, func() error {
67+
var err error
68+
b.API, err = api.NewWithDefaultRoutes(
69+
logp.L().Named("metrics.http"),
70+
b.Config.HTTP,
71+
b.Monitoring.InfoRegistry(),
72+
b.Monitoring.StateRegistry(),
73+
b.Monitoring.StatsRegistry(),
74+
b.Monitoring.InputsRegistry())
75+
if err != nil {
76+
return fmt.Errorf("could not start the HTTP server for the API: %w", err)
77+
}
78+
b.API.Start()
79+
return nil
80+
})
7081
if err != nil {
71-
return BeatReceiver{}, fmt.Errorf("could not start the HTTP server for the API: %w", err)
82+
return BeatReceiver{}, fmt.Errorf("error creating api listener after 100 retries: %w", err)
7283
}
73-
b.API.Start()
7484
}
7585

7686
beater, err := creator(&b.Beat, beatConfig)

x-pack/metricbeat/mbreceiver/factory.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func createDefaultConfig() component.Config {
3737
return &Config{}
3838
}
3939

40-
func createReceiver(_ context.Context, set receiver.Settings, baseCfg component.Config, consumer consumer.Logs) (receiver.Logs, error) {
40+
func createReceiver(ctx context.Context, set receiver.Settings, baseCfg component.Config, consumer consumer.Logs) (receiver.Logs, error) {
4141
cfg, ok := baseCfg.(*Config)
4242
if !ok {
4343
return nil, fmt.Errorf("could not convert otel config to metricbeat config")
@@ -57,7 +57,7 @@ func createReceiver(_ context.Context, set receiver.Settings, baseCfg component.
5757
}
5858

5959
beatCreator := beater.DefaultCreator()
60-
br, err := xpInstance.NewBeatReceiver(b, beatCreator)
60+
br, err := xpInstance.NewBeatReceiver(ctx, b, beatCreator)
6161
if err != nil {
6262
return nil, fmt.Errorf("error creating %s: %w", Name, err)
6363
}

0 commit comments

Comments
 (0)