Path: blob/main/component/otelcol/receiver/receiver_test.go
4096 views
package receiver_test12import (3"context"4"testing"5"time"67"github.com/grafana/agent/component"8"github.com/grafana/agent/component/otelcol"9"github.com/grafana/agent/component/otelcol/internal/fakeconsumer"10"github.com/grafana/agent/component/otelcol/receiver"11"github.com/grafana/agent/pkg/flow/componenttest"12"github.com/grafana/agent/pkg/util"13"github.com/stretchr/testify/require"14otelcomponent "go.opentelemetry.io/collector/component"15otelconfig "go.opentelemetry.io/collector/config"16otelconsumer "go.opentelemetry.io/collector/consumer"17"go.opentelemetry.io/collector/pdata/ptrace"18)1920func TestReceiver(t *testing.T) {21var (22consumer otelconsumer.Traces2324waitConsumerTrigger = util.NewWaitTrigger()25onTracesConsumer = func(t otelconsumer.Traces) {26consumer = t27waitConsumerTrigger.Trigger()28}2930waitTracesTrigger = util.NewWaitTrigger()31nextConsumer = &fakeconsumer.Consumer{32ConsumeTracesFunc: func(context.Context, ptrace.Traces) error {33waitTracesTrigger.Trigger()34return nil35},36}37)3839// Create and start our Flow component. We then wait for it to export a40// consumer that we can send data to.41te := newTestEnvironment(t, onTracesConsumer)42te.Start(fakeReceiverArgs{43Output: &otelcol.ConsumerArguments{44Metrics: []otelcol.Consumer{nextConsumer},45Logs: []otelcol.Consumer{nextConsumer},46Traces: []otelcol.Consumer{nextConsumer},47},48})4950require.NoError(t, waitConsumerTrigger.Wait(time.Second), "no traces consumer sent")5152err := consumer.ConsumeTraces(context.Background(), ptrace.NewTraces())53require.NoError(t, err)5455require.NoError(t, waitTracesTrigger.Wait(time.Second), "consumer did not get invoked")56}5758type testEnvironment struct {59t *testing.T6061Controller *componenttest.Controller62}6364func newTestEnvironment(t *testing.T, onTracesConsumer func(t otelconsumer.Traces)) *testEnvironment {65t.Helper()6667reg := component.Registration{68Name: "testcomponent",69Args: fakeReceiverArgs{},70Exports: otelcol.ConsumerExports{},71Build: func(opts component.Options, args component.Arguments) (component.Component, error) {72// Create a factory which always returns our instance of fakeReceiver73// defined above.74factory := otelcomponent.NewReceiverFactory(75"testcomponent",76func() otelconfig.Receiver { return nil },77otelcomponent.WithTracesReceiver(func(78ctx context.Context,79rcs otelcomponent.ReceiverCreateSettings,80r otelconfig.Receiver,81t otelconsumer.Traces,82) (otelcomponent.TracesReceiver, error) {8384onTracesConsumer(t)85return nil, nil86}, otelcomponent.StabilityLevelUndefined),87)8889return receiver.New(opts, factory, args.(receiver.Arguments))90},91}9293return &testEnvironment{94t: t,95Controller: componenttest.NewControllerFromReg(util.TestLogger(t), reg),96}97}9899func (te *testEnvironment) Start(args component.Arguments) {100go func() {101ctx := componenttest.TestContext(te.t)102err := te.Controller.Run(ctx, args)103require.NoError(te.t, err, "failed to run component")104}()105}106107type fakeReceiverArgs struct {108Output *otelcol.ConsumerArguments109}110111var _ receiver.Arguments = fakeReceiverArgs{}112113func (fa fakeReceiverArgs) Convert() (otelconfig.Receiver, error) {114settings := otelconfig.NewReceiverSettings(otelconfig.NewComponentID("testcomponent"))115return &settings, nil116}117118func (fa fakeReceiverArgs) Extensions() map[otelconfig.ComponentID]otelcomponent.Extension {119return nil120}121122func (fa fakeReceiverArgs) Exporters() map[otelconfig.DataType]map[otelconfig.ComponentID]otelcomponent.Exporter {123return nil124}125126func (fa fakeReceiverArgs) NextConsumers() *otelcol.ConsumerArguments {127return fa.Output128}129130131