Skip to content

[receiver/wavefront] wrap metrics receiver under carbon receiver instead of using export function #27248

Closed
@sakulali

Description

@sakulali

Component(s)

receiver/wavefront

Is your feature request related to a problem? Please describe.

wavefrontreceiver references carbonreceiver export function carbonreceiver.New(...), but when i use checkapi tool(go run cmd/checkapi/main.go .), found error as shown below:

2023/09/28 01:03:33 receiver/carbonreceiver has more than one function: "New,NewFactory" exit status 1

That seems function carbonreceiver.New() should not export.

We can make some adjustments to fix this error, refer to packages purefareceiver, purefbreceiver or simpleprometheusreceiver, we can add metricsReceiver struct, add Start and Shutdown methods, go do something similar, because similar implementation

Describe the solution you'd like

  1. Add receiver.go in receiver/wavefrontreceiver directory, define metricsReceiver struct, wrap metrics receiver with carbonreceiver
package wavefrontreceiver

type metricsReceiver struct {
	cfg            *Config
	set            receiver.CreateSettings
	nextConsumer   consumer.Metrics
	carbonReceiver receiver.Metrics
}

func newMetricsReceiver(cfg *Config, set receiver.CreateSettings, nextConsumer consumer.Metrics) *metricsReceiver {
	return &metricsReceiver{
		cfg:          cfg,
		set:          set,
		nextConsumer: nextConsumer,
	}
}

func (r *metricsReceiver) Start(ctx context.Context, host component.Host) error {
	fact := carbonreceiver.NewFactory()

	// Wavefront is very similar to Carbon: it is TCP based in which each received
	// text line represents a single metric data point. They differ on the format
	// of their textual representation.
	//
	// The Wavefront receiver leverages the Carbon receiver code by implementing
	// a dedicated parser for its format.
	carbonCfg := &carbonreceiver.Config{
		...
	}

	carbonReceiver, err := fact.CreateMetricsReceiver(ctx, r.set, carbonCfg, r.nextConsumer)
	if err != nil {
		return err
	}
	r.carbonReceiver = carbonReceiver

	if err := r.carbonReceiver.Start(ctx, host); err != nil {
		return err
	}

	return nil
}

func (r *metricsReceiver) Shutdown(ctx context.Context) error {
	if r.carbonReceiver != nil {
		return r.carbonReceiver.Shutdown(ctx)
	}
	return nil
}
  1. chore factory.go with unexport function newMetricsReceiver :
func createMetricsReceiver(
	_ context.Context,
	params receiver.CreateSettings,
	cfg component.Config,
	consumer consumer.Metrics,
) (receiver.Metrics, error) {
	rCfg, ok := cfg.(*Config)
	if !ok {
		return nil, fmt.Errorf("a wavefront receiver config was expected by the receiver factory, but got %T", rCfg)
	}
	return newMetricsReceiver(rCfg, params, consumer), nil
}

Describe alternatives you've considered

No response

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions