@@ -12,50 +12,87 @@ import (
12
12
"github.com/stretchr/testify/require"
13
13
"go.opentelemetry.io/collector/component/componenttest"
14
14
"go.opentelemetry.io/collector/consumer/consumertest"
15
+ "go.opentelemetry.io/collector/exporter"
15
16
"go.opentelemetry.io/collector/exporter/exportertest"
16
17
"go.opentelemetry.io/collector/pdata/pcommon"
17
18
"go.opentelemetry.io/collector/pdata/pmetric"
19
+ "go.opentelemetry.io/collector/receiver"
18
20
"go.opentelemetry.io/collector/receiver/receivertest"
19
21
"go.uber.org/zap"
20
22
21
23
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/stefexporter"
24
+ "github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil"
22
25
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/stefreceiver/internal/metadata"
23
26
)
24
27
25
- func TestRoundtrip (t * testing.T ) {
28
+ func genMetrics () pmetric.Metrics {
29
+ data := pmetric .NewMetrics ()
30
+ metricPoint := data .ResourceMetrics ().AppendEmpty ().ScopeMetrics ().AppendEmpty ().Metrics ().AppendEmpty ()
31
+ metricPoint .SetName ("foo" )
32
+ gauge := metricPoint .SetEmptyGauge ()
33
+ dp := gauge .DataPoints ().AppendEmpty ()
34
+ dp .SetIntValue (1 )
35
+ dp .SetTimestamp (pcommon .NewTimestampFromTime (time .Now ()))
36
+ return data
37
+ }
38
+
39
+ func createReceiver (t * testing.T , endpoint string ) (receiver.Metrics , * consumertest.MetricsSink ) {
26
40
sink := & consumertest.MetricsSink {}
27
41
settings := receivertest .NewNopSettings (metadata .Type )
28
42
settings .Logger , _ = zap .NewDevelopment ()
29
- m , err := NewFactory ().CreateMetrics (context .Background (), settings , createDefaultConfig (), sink )
30
- t .Cleanup (func () {
31
- err = m .Shutdown (context .Background ())
32
- require .NoError (t , err )
33
- })
43
+ rcvCfg := createDefaultConfig ()
44
+ rcvCfg .(* Config ).NetAddr .Endpoint = endpoint
45
+ m , err := NewFactory ().CreateMetrics (context .Background (), settings , rcvCfg , sink )
34
46
require .NoError (t , m .Start (context .Background (), componenttest .NewNopHost ()))
35
47
require .NoError (t , err )
48
+ return m , sink
49
+ }
50
+
51
+ func createExporter (t * testing.T , endpoint string ) exporter.Metrics {
36
52
cfg := stefexporter .NewFactory ().CreateDefaultConfig ().(* stefexporter.Config )
37
- cfg .Endpoint = "localhost:4320"
53
+ cfg .Endpoint = endpoint
38
54
cfg .TLSSetting .Insecure = true
39
- exporterSettings := exportertest .NewNopSettings (metadata .Type )
40
- exporterSettings .Logger , _ = zap .NewDevelopment ()
41
- exporter , err := stefexporter .NewFactory ().CreateMetrics (context .Background (), exporterSettings , cfg )
55
+ settings := exportertest .NewNopSettings (metadata .Type )
56
+ settings .Logger , _ = zap .NewDevelopment ()
57
+ exp , err := stefexporter .NewFactory ().CreateMetrics (context .Background (), settings , cfg )
42
58
require .NoError (t , err )
43
- t .Cleanup (func () {
44
- err = exporter .Shutdown (context .Background ())
45
- require .NoError (t , err )
46
- })
59
+ require .NoError (t , exp .Start (context .Background (), componenttest .NewNopHost ()))
60
+ return exp
61
+ }
47
62
48
- require . NoError ( t , exporter . Start ( context . Background (), componenttest . NewNopHost ()))
49
- data := pmetric . NewMetrics ( )
50
- metricPoint := data . ResourceMetrics (). AppendEmpty (). ScopeMetrics (). AppendEmpty (). Metrics (). AppendEmpty ( )
51
- metricPoint . SetName ( "foo" )
52
- gauge := metricPoint . SetEmptyGauge ()
53
- dp := gauge . DataPoints (). AppendEmpty ( )
54
- dp . SetIntValue ( 1 )
55
- dp . SetTimestamp ( pcommon . NewTimestampFromTime ( time . Now ()))
56
- err = exporter .ConsumeMetrics (context .Background (), data )
63
+ func TestRoundtrip ( t * testing. T ) {
64
+ endpoint := testutil . GetAvailableLocalAddress ( t )
65
+ m , sink := createReceiver ( t , endpoint )
66
+ t . Cleanup ( func () { require . NoError ( t , m . Shutdown ( context . Background ())) } )
67
+
68
+ exporter := createExporter ( t , endpoint )
69
+ t . Cleanup ( func () { require . NoError ( t , exporter . Shutdown ( context . Background ())) } )
70
+
71
+ err : = exporter .ConsumeMetrics (context .Background (), genMetrics () )
57
72
require .NoError (t , err )
58
73
assert .EventuallyWithT (t , func (tt * assert.CollectT ) {
59
74
assert .Len (tt , sink .AllMetrics (), 1 )
60
75
}, 1 * time .Minute , 10 * time .Millisecond )
61
76
}
77
+
78
+ func TestShutdownWhenConnected (t * testing.T ) {
79
+ endpoint := testutil .GetAvailableLocalAddress (t )
80
+ receiver , sink := createReceiver (t , endpoint )
81
+ exporter := createExporter (t , endpoint )
82
+
83
+ require .NoError (t , exporter .ConsumeMetrics (context .Background (), genMetrics ()))
84
+
85
+ assert .EventuallyWithT (
86
+ t , func (tt * assert.CollectT ) {
87
+ assert .Len (tt , sink .AllMetrics (), 1 )
88
+ }, 1 * time .Minute , 10 * time .Millisecond ,
89
+ )
90
+
91
+ // Try shutdown receiver before shutting down exporter.
92
+ // This means there is an active connection at the receiver.
93
+ // Previously we had a bug causing the receiver Shutdown to hang forever
94
+ // in this situation.
95
+ require .NoError (t , receiver .Shutdown (context .Background ()))
96
+
97
+ require .NoError (t , exporter .Shutdown (context .Background ()))
98
+ }
0 commit comments