Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/otelcol/receiver/receiver_test.go
4096 views
1
package receiver_test
2
3
import (
4
"context"
5
"testing"
6
"time"
7
8
"github.com/grafana/agent/component"
9
"github.com/grafana/agent/component/otelcol"
10
"github.com/grafana/agent/component/otelcol/internal/fakeconsumer"
11
"github.com/grafana/agent/component/otelcol/receiver"
12
"github.com/grafana/agent/pkg/flow/componenttest"
13
"github.com/grafana/agent/pkg/util"
14
"github.com/stretchr/testify/require"
15
otelcomponent "go.opentelemetry.io/collector/component"
16
otelconfig "go.opentelemetry.io/collector/config"
17
otelconsumer "go.opentelemetry.io/collector/consumer"
18
"go.opentelemetry.io/collector/pdata/ptrace"
19
)
20
21
func TestReceiver(t *testing.T) {
22
var (
23
consumer otelconsumer.Traces
24
25
waitConsumerTrigger = util.NewWaitTrigger()
26
onTracesConsumer = func(t otelconsumer.Traces) {
27
consumer = t
28
waitConsumerTrigger.Trigger()
29
}
30
31
waitTracesTrigger = util.NewWaitTrigger()
32
nextConsumer = &fakeconsumer.Consumer{
33
ConsumeTracesFunc: func(context.Context, ptrace.Traces) error {
34
waitTracesTrigger.Trigger()
35
return nil
36
},
37
}
38
)
39
40
// Create and start our Flow component. We then wait for it to export a
41
// consumer that we can send data to.
42
te := newTestEnvironment(t, onTracesConsumer)
43
te.Start(fakeReceiverArgs{
44
Output: &otelcol.ConsumerArguments{
45
Metrics: []otelcol.Consumer{nextConsumer},
46
Logs: []otelcol.Consumer{nextConsumer},
47
Traces: []otelcol.Consumer{nextConsumer},
48
},
49
})
50
51
require.NoError(t, waitConsumerTrigger.Wait(time.Second), "no traces consumer sent")
52
53
err := consumer.ConsumeTraces(context.Background(), ptrace.NewTraces())
54
require.NoError(t, err)
55
56
require.NoError(t, waitTracesTrigger.Wait(time.Second), "consumer did not get invoked")
57
}
58
59
type testEnvironment struct {
60
t *testing.T
61
62
Controller *componenttest.Controller
63
}
64
65
func newTestEnvironment(t *testing.T, onTracesConsumer func(t otelconsumer.Traces)) *testEnvironment {
66
t.Helper()
67
68
reg := component.Registration{
69
Name: "testcomponent",
70
Args: fakeReceiverArgs{},
71
Exports: otelcol.ConsumerExports{},
72
Build: func(opts component.Options, args component.Arguments) (component.Component, error) {
73
// Create a factory which always returns our instance of fakeReceiver
74
// defined above.
75
factory := otelcomponent.NewReceiverFactory(
76
"testcomponent",
77
func() otelconfig.Receiver { return nil },
78
otelcomponent.WithTracesReceiver(func(
79
ctx context.Context,
80
rcs otelcomponent.ReceiverCreateSettings,
81
r otelconfig.Receiver,
82
t otelconsumer.Traces,
83
) (otelcomponent.TracesReceiver, error) {
84
85
onTracesConsumer(t)
86
return nil, nil
87
}, otelcomponent.StabilityLevelUndefined),
88
)
89
90
return receiver.New(opts, factory, args.(receiver.Arguments))
91
},
92
}
93
94
return &testEnvironment{
95
t: t,
96
Controller: componenttest.NewControllerFromReg(util.TestLogger(t), reg),
97
}
98
}
99
100
func (te *testEnvironment) Start(args component.Arguments) {
101
go func() {
102
ctx := componenttest.TestContext(te.t)
103
err := te.Controller.Run(ctx, args)
104
require.NoError(te.t, err, "failed to run component")
105
}()
106
}
107
108
type fakeReceiverArgs struct {
109
Output *otelcol.ConsumerArguments
110
}
111
112
var _ receiver.Arguments = fakeReceiverArgs{}
113
114
func (fa fakeReceiverArgs) Convert() (otelconfig.Receiver, error) {
115
settings := otelconfig.NewReceiverSettings(otelconfig.NewComponentID("testcomponent"))
116
return &settings, nil
117
}
118
119
func (fa fakeReceiverArgs) Extensions() map[otelconfig.ComponentID]otelcomponent.Extension {
120
return nil
121
}
122
123
func (fa fakeReceiverArgs) Exporters() map[otelconfig.DataType]map[otelconfig.ComponentID]otelcomponent.Exporter {
124
return nil
125
}
126
127
func (fa fakeReceiverArgs) NextConsumers() *otelcol.ConsumerArguments {
128
return fa.Output
129
}
130
131