From 79c0bf1b2873c81883114e703d005224df6a6618 Mon Sep 17 00:00:00 2001 From: Tyler Helmuth <12352919+TylerHelmuth@users.noreply.github.com> Date: Fri, 26 Jul 2024 10:37:17 -0600 Subject: [PATCH] [receiver/receivercreator] Make receivercreator expose its required interface (#34234) **Description:** Updates receivercreator in preparation for `component.Host.GetFactory` to be removed. **Link to tracking Issue:** Related to https://github.com/open-telemetry/opentelemetry-collector/issues/9511 **Testing:** Unit tests. I cant add a unit test yet that fails the interface check since being compliant with `component.Host` still requires the `GetFactory` method. --- receiver/receivercreator/receiver.go | 17 ++++++++++++++--- receiver/receivercreator/runner.go | 4 ++-- 2 files changed, 16 insertions(+), 5 deletions(-) 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,