12
12
import static org .mockito .ArgumentMatchers .any ;
13
13
import static org .mockito .ArgumentMatchers .eq ;
14
14
import static org .mockito .Mockito .mock ;
15
+ import static org .mockito .Mockito .times ;
15
16
import static org .mockito .Mockito .verify ;
16
17
import static org .mockito .Mockito .verifyNoInteractions ;
17
18
import static org .mockito .Mockito .verifyNoMoreInteractions ;
18
19
import static org .mockito .Mockito .when ;
19
20
21
+ import com .linecorp .armeria .server .ServerBuilder ;
22
+ import com .linecorp .armeria .server .ServiceRequestContext ;
23
+ import com .linecorp .armeria .server .grpc .protocol .AbstractUnaryGrpcService ;
24
+ import com .linecorp .armeria .server .logging .LoggingService ;
25
+ import com .linecorp .armeria .testing .junit5 .server .ServerExtension ;
20
26
import io .opentelemetry .api .GlobalOpenTelemetry ;
21
27
import io .opentelemetry .api .OpenTelemetry ;
22
28
import io .opentelemetry .api .metrics .LongCounter ;
25
31
import io .opentelemetry .api .metrics .MeterProvider ;
26
32
import io .opentelemetry .api .trace .TracerProvider ;
27
33
import io .opentelemetry .context .propagation .ContextPropagators ;
34
+ import io .opentelemetry .proto .collector .metrics .v1 .ExportMetricsServiceResponse ;
28
35
import io .opentelemetry .sdk .common .InstrumentationScopeInfo ;
29
36
import io .opentelemetry .sdk .common .export .MemoryMode ;
30
37
import io .opentelemetry .sdk .metrics .SdkMeterProvider ;
36
43
import io .opentelemetry .sdk .metrics .internal .data .ImmutableGaugeData ;
37
44
import io .opentelemetry .sdk .resources .Resource ;
38
45
import java .util .Collection ;
46
+ import java .util .concurrent .CompletableFuture ;
47
+ import java .util .concurrent .CompletionStage ;
48
+ import java .util .concurrent .TimeUnit ;
39
49
import java .util .concurrent .atomic .AtomicReference ;
40
50
import java .util .function .Supplier ;
51
+ import org .junit .jupiter .api .AfterEach ;
52
+ import org .junit .jupiter .api .BeforeEach ;
41
53
import org .junit .jupiter .api .Test ;
54
+ import org .junit .jupiter .api .extension .RegisterExtension ;
42
55
import org .mockito .Mockito ;
43
56
44
57
class OtlpGrpcMetricExporterBuilderTest {
@@ -53,11 +66,41 @@ class OtlpGrpcMetricExporterBuilderTest {
53
66
"test" ,
54
67
ImmutableGaugeData .empty ()));
55
68
69
+ @ RegisterExtension
70
+ private static final ServerExtension server =
71
+ new ServerExtension () {
72
+ @ Override
73
+ protected void configure (ServerBuilder sb ) {
74
+ sb .service (
75
+ "/opentelemetry.proto.collector.metrics.v1.MetricsService/Export" ,
76
+ new AbstractUnaryGrpcService () {
77
+ @ Override
78
+ protected CompletionStage <byte []> handleMessage (
79
+ ServiceRequestContext ctx , byte [] message ) {
80
+ return CompletableFuture .completedFuture (
81
+ ExportMetricsServiceResponse .getDefaultInstance ().toByteArray ());
82
+ }
83
+ });
84
+ sb .http (0 );
85
+ sb .decorator (LoggingService .newDecorator ());
86
+ }
87
+ };
88
+
56
89
private final MeterProvider meterProvider = mock (MeterProvider .class );
57
90
private final Meter meter = mock (Meter .class );
58
91
private final LongCounterBuilder counterBuilder = mock (LongCounterBuilder .class );
59
92
private final LongCounter counter = mock (LongCounter .class );
60
93
94
+ @ BeforeEach
95
+ void setup () {
96
+ GlobalOpenTelemetry .resetForTest ();
97
+ }
98
+
99
+ @ AfterEach
100
+ void cleanup () {
101
+ GlobalOpenTelemetry .resetForTest ();
102
+ }
103
+
61
104
@ Test
62
105
void setMeterProvider_null () {
63
106
OtlpGrpcMetricExporterBuilder builder = OtlpGrpcMetricExporter .builder ();
@@ -74,53 +117,61 @@ void setMeterProvider_null() {
74
117
@ Test
75
118
void setMeterProvider () {
76
119
when (meterProvider .get (any ())).thenReturn (meter );
77
- when (meter .counterBuilder (eq ( "otlp.exporter.seen" ))).thenReturn (counterBuilder );
120
+ when (meter .counterBuilder (any ( ))).thenReturn (counterBuilder );
78
121
when (counterBuilder .build ()).thenReturn (counter );
79
122
80
123
try (OtlpGrpcMetricExporter exporter =
81
- OtlpGrpcMetricExporter .builder ().setMeterProvider (meterProvider ).build ()) {
124
+ OtlpGrpcMetricExporter .builder ()
125
+ .setMeterProvider (meterProvider )
126
+ .setEndpoint ("http://localhost:" + server .httpPort ())
127
+ .build ()) {
82
128
verifyNoInteractions (meterProvider , meter , counterBuilder , counter );
83
129
84
130
// Collection before MeterProvider is initialized.
85
131
when (meterProvider .get (any ())).thenReturn (MeterProvider .noop ().get ("test" ));
86
- exporter .export (DATA_SET );
132
+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
87
133
88
134
verifyNoInteractions (meter , counterBuilder , counter );
89
135
90
136
// Collection after MeterProvider is initialized.
91
137
when (meterProvider .get (any ())).thenReturn (meter );
92
- exporter .export (DATA_SET );
138
+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
93
139
94
- verify (meter ).counterBuilder (eq ("otlp.exporter.seen" ));
95
- verify (counter ).add (eq (1L ), any ());
140
+ verify (meter ).counterBuilder ("otlp.exporter.seen" );
141
+ verify (meter ).counterBuilder ("otlp.exporter.exported" );
142
+ verify (counter , times (2 )).add (eq (1L ), any ());
96
143
verifyNoMoreInteractions (meter , counter );
97
144
}
98
145
}
99
146
100
147
@ Test
101
148
void setMeterProvider_supplier () {
102
149
when (meterProvider .get (any ())).thenReturn (meter );
103
- when (meter .counterBuilder (eq ( "otlp.exporter.seen" ))).thenReturn (counterBuilder );
150
+ when (meter .counterBuilder (any ( ))).thenReturn (counterBuilder );
104
151
when (counterBuilder .build ()).thenReturn (counter );
105
152
106
153
@ SuppressWarnings ("unchecked" )
107
154
Supplier <MeterProvider > provider = mock (Supplier .class );
108
155
try (OtlpGrpcMetricExporter exporter =
109
- OtlpGrpcMetricExporter .builder ().setMeterProvider (provider ).build ()) {
156
+ OtlpGrpcMetricExporter .builder ()
157
+ .setMeterProvider (provider )
158
+ .setEndpoint ("http://localhost:" + server .httpPort ())
159
+ .build ()) {
110
160
verifyNoInteractions (provider , meterProvider , meter , counterBuilder , counter );
111
161
112
162
// Collection before MeterProvider is initialized.
113
163
when (provider .get ()).thenReturn (MeterProvider .noop ());
114
- exporter .export (DATA_SET );
164
+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
115
165
116
166
verifyNoInteractions (meterProvider , meter , counterBuilder , counter );
117
167
118
168
// Collection after MeterProvider is initialized.
119
169
when (provider .get ()).thenReturn (meterProvider );
120
- exporter .export (DATA_SET );
170
+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
121
171
122
- verify (meter ).counterBuilder (eq ("otlp.exporter.seen" ));
123
- verify (counter ).add (eq (1L ), any ());
172
+ verify (meter ).counterBuilder ("otlp.exporter.seen" );
173
+ verify (meter ).counterBuilder ("otlp.exporter.exported" );
174
+ verify (counter , times (2 )).add (eq (1L ), any ());
124
175
verifyNoMoreInteractions (meter , counter );
125
176
}
126
177
}
@@ -145,19 +196,21 @@ public ContextPropagators getPropagators() {
145
196
}
146
197
});
147
198
when (meterProvider .get (any ())).thenReturn (meter );
148
- when (meter .counterBuilder (eq ( "otlp.exporter.seen" ))).thenReturn (counterBuilder );
199
+ when (meter .counterBuilder (any ( ))).thenReturn (counterBuilder );
149
200
when (counterBuilder .build ()).thenReturn (counter );
150
201
151
- try (OtlpGrpcMetricExporter exporter = OtlpGrpcMetricExporter .builder ().build ()) {
202
+ try (OtlpGrpcMetricExporter exporter =
203
+ OtlpGrpcMetricExporter .builder ()
204
+ .setEndpoint ("http://localhost:" + server .httpPort ())
205
+ .build ()) {
152
206
verifyNoInteractions (meterProvider , meter , counterBuilder , counter );
153
207
154
- exporter .export (DATA_SET );
208
+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
155
209
156
- verify (meter ).counterBuilder (eq ("otlp.exporter.seen" ));
157
- verify (counter ).add (eq (1L ), any ());
210
+ verify (meter ).counterBuilder ("otlp.exporter.seen" );
211
+ verify (meter ).counterBuilder ("otlp.exporter.exported" );
212
+ verify (counter , times (2 )).add (eq (1L ), any ());
158
213
verifyNoMoreInteractions (meter , counter );
159
- } finally {
160
- GlobalOpenTelemetry .resetForTest ();
161
214
}
162
215
}
163
216
0 commit comments