@@ -12,13 +12,15 @@ import (
12
12
"os/signal"
13
13
"path/filepath"
14
14
"strings"
15
+ "sync"
15
16
"syscall"
16
17
"time"
17
18
18
19
"go.elastic.co/apm"
19
20
apmtransport "go.elastic.co/apm/transport"
20
21
"gopkg.in/yaml.v2"
21
22
23
+ "github.com/hashicorp/go-multierror"
22
24
"github.com/spf13/cobra"
23
25
24
26
"github.com/elastic/elastic-agent-libs/api"
@@ -61,6 +63,7 @@ const (
61
63
)
62
64
63
65
type cfgOverrider func (cfg * configuration.Configuration )
66
+ type awaiters []<- chan struct {}
64
67
65
68
func newRunCommandWithArgs (_ []string , streams * cli.IOStreams ) * cobra.Command {
66
69
cmd := & cobra.Command {
@@ -136,17 +139,38 @@ func run(override cfgOverrider, testingMode bool, fleetInitTimeout time.Duration
136
139
go service .ProcessWindowsControlEvents (stopBeat )
137
140
138
141
// detect otel
139
- if runAsOtel := otel .IsOtelConfig (ctx , paths .ConfigFile ()); runAsOtel {
140
- return otel .Run (ctx , cancel , stop , testingMode )
142
+ runAsOtel := otel .IsOtelConfig (ctx , paths .ConfigFile ())
143
+ var awaiters awaiters
144
+ var resErr error
145
+ if runAsOtel {
146
+ var otelStartWg sync.WaitGroup
147
+ otelAwaiter := make (chan struct {})
148
+ awaiters = append (awaiters , otelAwaiter )
149
+
150
+ otelStartWg .Add (1 )
151
+ go func () {
152
+ otelStartWg .Done ()
153
+ if err := otel .Run (ctx , stop ); err != nil {
154
+ resErr = multierror .Append (resErr , err )
155
+ }
156
+
157
+ // close awaiter handled in run loop
158
+ close (otelAwaiter )
159
+ }()
160
+
161
+ // wait for otel to start
162
+ otelStartWg .Wait ()
141
163
}
142
164
143
- // not otel continue as usual
144
- return runElasticAgent (ctx , cancel , override , stop , testingMode , fleetInitTimeout , modifiers ... )
165
+ if err := runElasticAgent (ctx , cancel , override , stop , testingMode , fleetInitTimeout , runAsOtel , awaiters , modifiers ... ); err != nil {
166
+ resErr = multierror .Append (resErr , err )
167
+ }
145
168
169
+ return resErr
146
170
}
147
171
148
- func runElasticAgent (ctx context.Context , cancel context.CancelFunc , override cfgOverrider , stop chan bool , testingMode bool , fleetInitTimeout time.Duration , modifiers ... component.PlatformModifier ) error {
149
- cfg , err := loadConfig (ctx , override )
172
+ func runElasticAgent (ctx context.Context , cancel context.CancelFunc , override cfgOverrider , stop chan bool , testingMode bool , fleetInitTimeout time.Duration , runAsOtel bool , awaiters awaiters , modifiers ... component.PlatformModifier ) error {
173
+ cfg , err := loadConfig (ctx , override , runAsOtel )
150
174
if err != nil {
151
175
return err
152
176
}
@@ -259,7 +283,7 @@ func runElasticAgent(ctx context.Context, cancel context.CancelFunc, override cf
259
283
l .Info ("APM instrumentation disabled" )
260
284
}
261
285
262
- coord , configMgr , composable , err := application .New (ctx , l , baseLogger , logLvl , agentInfo , rex , tracer , testingMode , fleetInitTimeout , configuration .IsFleetServerBootstrap (cfg .Fleet ), modifiers ... )
286
+ coord , configMgr , composable , err := application .New (ctx , l , baseLogger , logLvl , agentInfo , rex , tracer , testingMode , fleetInitTimeout , configuration .IsFleetServerBootstrap (cfg .Fleet ), runAsOtel , modifiers ... )
263
287
if err != nil {
264
288
return err
265
289
}
@@ -366,6 +390,9 @@ LOOP:
366
390
}
367
391
cancel ()
368
392
err = <- appErr
393
+ for _ , a := range awaiters {
394
+ <- a // wait for awaiter to be done
395
+ }
369
396
370
397
if logShutdown {
371
398
l .Info ("Shutting down completed." )
@@ -376,7 +403,11 @@ LOOP:
376
403
return err
377
404
}
378
405
379
- func loadConfig (ctx context.Context , override cfgOverrider ) (* configuration.Configuration , error ) {
406
+ func loadConfig (ctx context.Context , override cfgOverrider , runAsOtel bool ) (* configuration.Configuration , error ) {
407
+ if runAsOtel {
408
+ return configuration .DefaultConfiguration (), nil
409
+ }
410
+
380
411
pathConfigFile := paths .ConfigFile ()
381
412
rawConfig , err := config .LoadFile (pathConfigFile )
382
413
if err != nil {
@@ -527,7 +558,7 @@ func tryDelayEnroll(ctx context.Context, logger *logger.Logger, cfg *configurati
527
558
errors .M ("path" , enrollPath )))
528
559
}
529
560
logger .Info ("Successfully performed delayed enrollment of this Elastic Agent." )
530
- return loadConfig (ctx , override )
561
+ return loadConfig (ctx , override , false )
531
562
}
532
563
533
564
func initTracer (agentName , version string , mcfg * monitoringCfg.MonitoringConfig ) (* apm.Tracer , error ) {
0 commit comments