5
5
6
6
package io .opentelemetry .exporter .otlp .internal ;
7
7
8
+ import static java .util .Collections .emptyMap ;
9
+ import static java .util .Collections .singletonMap ;
8
10
import static org .assertj .core .api .Assertions .assertThat ;
9
11
import static org .assertj .core .api .Assertions .assertThatThrownBy ;
10
12
import static org .mockito .ArgumentMatchers .any ;
13
+ import static org .mockito .Mockito .doAnswer ;
11
14
import static org .mockito .Mockito .doReturn ;
12
15
import static org .mockito .Mockito .never ;
13
16
import static org .mockito .Mockito .times ;
14
17
import static org .mockito .Mockito .verify ;
15
18
16
19
import com .linecorp .armeria .testing .junit5 .server .SelfSignedCertificateExtension ;
20
+ import io .opentelemetry .api .metrics .MeterProvider ;
17
21
import io .opentelemetry .exporter .otlp .http .metrics .OtlpHttpMetricExporter ;
18
22
import io .opentelemetry .exporter .otlp .http .metrics .OtlpHttpMetricExporterBuilder ;
19
23
import io .opentelemetry .exporter .otlp .metrics .OtlpGrpcMetricExporter ;
20
24
import io .opentelemetry .exporter .otlp .metrics .OtlpGrpcMetricExporterBuilder ;
25
+ import io .opentelemetry .sdk .OpenTelemetrySdk ;
21
26
import io .opentelemetry .sdk .autoconfigure .spi .ConfigurationException ;
22
27
import io .opentelemetry .sdk .autoconfigure .spi .internal .DefaultConfigProperties ;
23
28
import io .opentelemetry .sdk .common .export .MemoryMode ;
24
29
import io .opentelemetry .sdk .metrics .export .MetricExporter ;
25
30
import java .io .IOException ;
31
+ import java .lang .reflect .Field ;
26
32
import java .nio .file .Files ;
27
33
import java .nio .file .Path ;
28
34
import java .security .cert .CertificateEncodingException ;
29
35
import java .time .Duration ;
30
- import java .util .Collections ;
31
36
import java .util .HashMap ;
32
37
import java .util .Map ;
38
+ import java .util .concurrent .atomic .AtomicReference ;
39
+ import java .util .function .Supplier ;
33
40
import org .junit .jupiter .api .BeforeEach ;
34
41
import org .junit .jupiter .api .Test ;
35
42
import org .junit .jupiter .api .extension .ExtendWith ;
@@ -94,7 +101,7 @@ void createExporter_UnsupportedProtocol() {
94
101
() ->
95
102
provider .createExporter (
96
103
DefaultConfigProperties .createFromMap (
97
- Collections . singletonMap ("otel.exporter.otlp.protocol" , "foo" ))))
104
+ singletonMap ("otel.exporter.otlp.protocol" , "foo" ))))
98
105
.isInstanceOf (ConfigurationException .class )
99
106
.hasMessageContaining ("Unsupported OTLP metrics protocol: foo" );
100
107
}
@@ -104,21 +111,21 @@ void createExporter_NoMocks() {
104
111
// Verifies createExporter after resetting the spy overrides
105
112
Mockito .reset (provider );
106
113
try (MetricExporter exporter =
107
- provider .createExporter (DefaultConfigProperties .createFromMap (Collections . emptyMap ()))) {
114
+ provider .createExporter (DefaultConfigProperties .createFromMap (emptyMap ()))) {
108
115
assertThat (exporter ).isInstanceOf (OtlpGrpcMetricExporter .class );
109
116
}
110
117
try (MetricExporter exporter =
111
118
provider .createExporter (
112
119
DefaultConfigProperties .createFromMap (
113
- Collections . singletonMap ("otel.exporter.otlp.protocol" , "http/protobuf" )))) {
120
+ singletonMap ("otel.exporter.otlp.protocol" , "http/protobuf" )))) {
114
121
assertThat (exporter ).isInstanceOf (OtlpHttpMetricExporter .class );
115
122
}
116
123
}
117
124
118
125
@ Test
119
126
void createExporter_GrpcDefaults () {
120
127
try (MetricExporter exporter =
121
- provider .createExporter (DefaultConfigProperties .createFromMap (Collections . emptyMap ()))) {
128
+ provider .createExporter (DefaultConfigProperties .createFromMap (emptyMap ()))) {
122
129
assertThat (exporter ).isInstanceOf (OtlpGrpcMetricExporter .class );
123
130
verify (grpcBuilder , times (1 )).build ();
124
131
verify (grpcBuilder ).setComponentLoader (any ());
@@ -204,8 +211,7 @@ void createExporter_HttpDefaults() {
204
211
try (MetricExporter exporter =
205
212
provider .createExporter (
206
213
DefaultConfigProperties .createFromMap (
207
- Collections .singletonMap (
208
- "otel.exporter.otlp.metrics.protocol" , "http/protobuf" )))) {
214
+ singletonMap ("otel.exporter.otlp.metrics.protocol" , "http/protobuf" )))) {
209
215
assertThat (exporter ).isInstanceOf (OtlpHttpMetricExporter .class );
210
216
verify (httpBuilder , times (1 )).build ();
211
217
verify (httpBuilder ).setComponentLoader (any ());
@@ -288,4 +294,107 @@ void createExporter_HttpWithSignalConfiguration() throws CertificateEncodingExce
288
294
}
289
295
Mockito .verifyNoInteractions (grpcBuilder );
290
296
}
297
+
298
+ @ Test
299
+ void meterProviderRef_InitializedWithNoop () throws Exception {
300
+ AtomicReference <MeterProvider > meterProviderRef = getMeterProviderRef (provider );
301
+
302
+ assertThat (meterProviderRef .get ()).isSameAs (MeterProvider .noop ());
303
+ }
304
+
305
+ @ Test
306
+ void afterAutoConfigure_UpdatesMeterProviderRef () throws Exception {
307
+ OpenTelemetrySdk sdk = OpenTelemetrySdk .builder ().build ();
308
+
309
+ AtomicReference <MeterProvider > meterProviderRef = getMeterProviderRef (provider );
310
+ assertThat (meterProviderRef .get ()).isSameAs (MeterProvider .noop ());
311
+
312
+ provider .afterAutoConfigure (sdk );
313
+
314
+ assertThat (meterProviderRef .get ()).isSameAs (sdk .getMeterProvider ());
315
+ }
316
+
317
+ @ Test
318
+ @ SuppressWarnings ("unchecked" )
319
+ void createExporter_GrpcSetsMeterProviderSupplier () {
320
+ AtomicReference <Supplier <MeterProvider >> capturedSupplier = new AtomicReference <>();
321
+
322
+ OpenTelemetrySdk sdk = OpenTelemetrySdk .builder ().build ();
323
+ provider .afterAutoConfigure (sdk );
324
+
325
+ doAnswer (
326
+ invocation -> {
327
+ capturedSupplier .set (invocation .getArgument (0 ));
328
+ return grpcBuilder ;
329
+ })
330
+ .when (grpcBuilder )
331
+ .setMeterProvider (any (Supplier .class ));
332
+
333
+ try (MetricExporter exporter =
334
+ provider .createExporter (DefaultConfigProperties .createFromMap (emptyMap ()))) {
335
+
336
+ assertThat (exporter ).isInstanceOf (OtlpGrpcMetricExporter .class );
337
+ assertThat (capturedSupplier .get ()).isNotNull ();
338
+ assertThat (capturedSupplier .get ().get ()).isSameAs (sdk .getMeterProvider ());
339
+ }
340
+ Mockito .verifyNoInteractions (httpBuilder );
341
+ }
342
+
343
+ @ Test
344
+ @ SuppressWarnings ("unchecked" )
345
+ void createExporter_HttpSetsMeterProviderSupplier () {
346
+ AtomicReference <Supplier <MeterProvider >> capturedSupplier = new AtomicReference <>();
347
+
348
+ OpenTelemetrySdk sdk = OpenTelemetrySdk .builder ().build ();
349
+ provider .afterAutoConfigure (sdk );
350
+
351
+ doAnswer (
352
+ invocation -> {
353
+ capturedSupplier .set (invocation .getArgument (0 ));
354
+ return httpBuilder ;
355
+ })
356
+ .when (httpBuilder )
357
+ .setMeterProvider (any (Supplier .class ));
358
+
359
+ try (MetricExporter exporter =
360
+ provider .createExporter (
361
+ DefaultConfigProperties .createFromMap (
362
+ singletonMap ("otel.exporter.otlp.metrics.protocol" , "http/protobuf" )))) {
363
+
364
+ assertThat (exporter ).isInstanceOf (OtlpHttpMetricExporter .class );
365
+ assertThat (capturedSupplier .get ()).isNotNull ();
366
+ assertThat (capturedSupplier .get ().get ()).isSameAs (sdk .getMeterProvider ());
367
+ }
368
+ Mockito .verifyNoInteractions (grpcBuilder );
369
+ }
370
+
371
+ @ Test
372
+ @ SuppressWarnings ("unchecked" )
373
+ void meterProviderSupplier_ReturnsNoopBeforeAutoConfigure () {
374
+ AtomicReference <Supplier <MeterProvider >> capturedSupplier = new AtomicReference <>();
375
+
376
+ doAnswer (
377
+ invocation -> {
378
+ capturedSupplier .set (invocation .getArgument (0 ));
379
+ return grpcBuilder ;
380
+ })
381
+ .when (grpcBuilder )
382
+ .setMeterProvider (any (Supplier .class ));
383
+
384
+ try (MetricExporter exporter =
385
+ provider .createExporter (DefaultConfigProperties .createFromMap (emptyMap ()))) {
386
+
387
+ assertThat (exporter ).isInstanceOf (OtlpGrpcMetricExporter .class );
388
+ assertThat (capturedSupplier .get ()).isNotNull ();
389
+ assertThat (capturedSupplier .get ().get ()).isSameAs (MeterProvider .noop ());
390
+ }
391
+ }
392
+
393
+ @ SuppressWarnings ("unchecked" )
394
+ private static AtomicReference <MeterProvider > getMeterProviderRef (
395
+ OtlpMetricExporterProvider provider ) throws Exception {
396
+ Field field = OtlpMetricExporterProvider .class .getDeclaredField ("meterProviderRef" );
397
+ field .setAccessible (true );
398
+ return (AtomicReference <MeterProvider >) field .get (provider );
399
+ }
291
400
}
0 commit comments