diff --git a/receiver/receivercreator/receiver.go b/receiver/receivercreator/receiver.go index 0c40b30e2989..c1aab76c9014 100644 --- a/receiver/receivercreator/receiver.go +++ b/receiver/receivercreator/receiver.go @@ -34,8 +34,19 @@ func newReceiverCreator(params receiver.Settings, cfg *Config) receiver.Metrics } } +// host is an interface that the component.Host passed to receivercreator's Start function must implement +type host interface { + component.Host + GetFactory(component.Kind, component.Type) component.Factory +} + // Start receiver_creator. -func (rc *receiverCreator) Start(_ context.Context, host component.Host) error { +func (rc *receiverCreator) Start(_ context.Context, h component.Host) error { + rcHost, ok := h.(host) + if !ok { + return fmt.Errorf("the receivercreator is not compatible with the provided component.host") + } + rc.observerHandler = &observerHandler{ config: rc.cfg, params: rc.params, @@ -43,14 +54,14 @@ func (rc *receiverCreator) Start(_ context.Context, host component.Host) error { nextLogsConsumer: rc.nextLogsConsumer, nextMetricsConsumer: rc.nextMetricsConsumer, nextTracesConsumer: rc.nextTracesConsumer, - runner: newReceiverRunner(rc.params, host), + runner: newReceiverRunner(rc.params, rcHost), } observers := map[component.ID]observer.Observable{} // Match all configured observables to the extensions that are running. for _, watchObserver := range rc.cfg.WatchObservers { - for cid, ext := range host.GetExtensions() { + for cid, ext := range rcHost.GetExtensions() { if cid != watchObserver { continue } diff --git a/receiver/receivercreator/runner.go b/receiver/receivercreator/runner.go index ab76676f66d6..0eb3b8f89a25 100644 --- a/receiver/receivercreator/runner.go +++ b/receiver/receivercreator/runner.go @@ -31,12 +31,12 @@ type receiverRunner struct { logger *zap.Logger params rcvr.Settings idNamespace component.ID - host component.Host + host host receivers map[string]*wrappedReceiver lock *sync.Mutex } -func newReceiverRunner(params rcvr.Settings, host component.Host) *receiverRunner { +func newReceiverRunner(params rcvr.Settings, host host) *receiverRunner { return &receiverRunner{ logger: params.Logger, params: params,