@@ -27,13 +27,18 @@ func Module() fxutil.Module {
2727// MetadataProvider is the provider for metadata
2828type MetadataProvider func (context.Context ) time.Duration
2929
30+ // PriorityMetadataProvider is the provider for metadata that needs to be execute at start time of the agent.
31+ // Right now the agent needs the host metadata provider to execute first to ensure host tags are being reported correctly.
32+ // This is a temporary workaorund until we figure a more permanent solution in the backend
33+ // If you need to use this provide please contact the agent-shared-components team
34+ type PriorityMetadataProvider func (context.Context ) time.Duration
35+
3036type runnerImpl struct {
3137 log log.Component
3238 config config.Component
3339
34- // providers are the metada providers to run. They're Optional because some of them can be disabled through the
35- // configuration
36- providers []optional.Option [MetadataProvider ]
40+ providers []MetadataProvider
41+ priorityProviders []PriorityMetadataProvider
3742
3843 wg sync.WaitGroup
3944 stopChan chan struct {}
@@ -45,7 +50,8 @@ type dependencies struct {
4550 Log log.Component
4651 Config config.Component
4752
48- Providers []optional.Option [MetadataProvider ] `group:"metadata_provider"`
53+ Providers []optional.Option [MetadataProvider ] `group:"metadata_provider"`
54+ PriorityProviders []optional.Option [PriorityMetadataProvider ] `group:"metadata_priority_provider"`
4955}
5056
5157// Provider represents the callback from a metada provider. This is returned by 'NewProvider' helper.
@@ -55,13 +61,27 @@ type Provider struct {
5561 Callback optional.Option [MetadataProvider ] `group:"metadata_provider"`
5662}
5763
64+ // PriorityProvider represents the callback from a priority metada provider. This is returned by 'NewPriorityProvider' helper.
65+ type PriorityProvider struct {
66+ fx.Out
67+
68+ Callback optional.Option [PriorityMetadataProvider ] `group:"metadata_priority_provider"`
69+ }
70+
5871// NewProvider registers a new metadata provider by adding a callback to the runner.
5972func NewProvider (callback MetadataProvider ) Provider {
6073 return Provider {
6174 Callback : optional.NewOption [MetadataProvider ](callback ),
6275 }
6376}
6477
78+ // NewPriorityProvider registers a new metadata provider by adding a callback to the runner.
79+ func NewPriorityProvider (callback PriorityMetadataProvider ) PriorityProvider {
80+ return PriorityProvider {
81+ Callback : optional.NewOption [PriorityMetadataProvider ](callback ),
82+ }
83+ }
84+
6585// NewEmptyProvider returns a empty provider which is not going to register anything. This is useful for providers that
6686// can be enabled/disabled through configuration.
6787func NewEmptyProvider () Provider {
@@ -72,11 +92,30 @@ func NewEmptyProvider() Provider {
7292
7393// createRunner instantiates a runner object
7494func createRunner (deps dependencies ) * runnerImpl {
95+ providers := []MetadataProvider {}
96+ priorityProviders := []PriorityMetadataProvider {}
97+
98+ nonNilProviders := fxutil .GetAndFilterGroup (deps .Providers )
99+ nonNilPriorityProviders := fxutil .GetAndFilterGroup (deps .PriorityProviders )
100+
101+ for _ , optionaP := range nonNilProviders {
102+ if p , isSet := optionaP .Get (); isSet {
103+ providers = append (providers , p )
104+ }
105+ }
106+
107+ for _ , optionaP := range nonNilPriorityProviders {
108+ if p , isSet := optionaP .Get (); isSet {
109+ priorityProviders = append (priorityProviders , p )
110+ }
111+ }
112+
75113 return & runnerImpl {
76- log : deps .Log ,
77- config : deps .Config ,
78- providers : fxutil .GetAndFilterGroup (deps .Providers ),
79- stopChan : make (chan struct {}),
114+ log : deps .Log ,
115+ config : deps .Config ,
116+ providers : providers ,
117+ priorityProviders : priorityProviders ,
118+ stopChan : make (chan struct {}),
80119 }
81120}
82121
@@ -100,7 +139,7 @@ func newRunner(lc fx.Lifecycle, deps dependencies) runner.Component {
100139}
101140
102141// handleProvider runs a provider at regular interval until the runner is stopped
103- func (r * runnerImpl ) handleProvider (p MetadataProvider ) {
142+ func (r * runnerImpl ) handleProvider (p func (context. Context ) time. Duration ) {
104143 r .log .Debugf ("Starting runner for MetadataProvider %#v" , p )
105144 r .wg .Add (1 )
106145
@@ -137,12 +176,21 @@ func (r *runnerImpl) handleProvider(p MetadataProvider) {
137176// start is called by FX when the application starts. Lifecycle hooks are blocking and called sequencially. We should
138177// not block here.
139178func (r * runnerImpl ) start () error {
140- r .log .Debugf ("Starting metadata runner with %d providers" , len (r .providers ))
141- for _ , optionaP := range r .providers {
142- if p , isSet := optionaP .Get (); isSet {
143- go r .handleProvider (p )
179+ r .log .Debugf ("Starting metadata runner with %d priority providers and %d regular providers" , len (r .priorityProviders ), len (r .providers ))
180+
181+ go func () {
182+ for _ , priorityProvider := range r .priorityProviders {
183+ // Execute synchronously the priority provider
184+ priorityProvider (context .Background ())
185+
186+ go r .handleProvider (priorityProvider )
144187 }
145- }
188+
189+ for _ , provider := range r .providers {
190+ go r .handleProvider (provider )
191+ }
192+ }()
193+
146194 return nil
147195}
148196
0 commit comments