1212import static org .mockito .ArgumentMatchers .any ;
1313import static org .mockito .ArgumentMatchers .eq ;
1414import static org .mockito .Mockito .mock ;
15+ import static org .mockito .Mockito .times ;
1516import static org .mockito .Mockito .verify ;
1617import static org .mockito .Mockito .verifyNoInteractions ;
1718import static org .mockito .Mockito .verifyNoMoreInteractions ;
1819import static org .mockito .Mockito .when ;
1920
21+ import com .linecorp .armeria .server .ServerBuilder ;
22+ import com .linecorp .armeria .server .grpc .GrpcService ;
23+ import com .linecorp .armeria .server .logging .LoggingService ;
24+ import com .linecorp .armeria .testing .junit5 .server .ServerExtension ;
25+ import io .grpc .stub .StreamObserver ;
2026import io .opentelemetry .api .GlobalOpenTelemetry ;
2127import io .opentelemetry .api .OpenTelemetry ;
2228import io .opentelemetry .api .metrics .LongCounter ;
2531import io .opentelemetry .api .metrics .MeterProvider ;
2632import io .opentelemetry .api .trace .TracerProvider ;
2733import io .opentelemetry .context .propagation .ContextPropagators ;
34+ import io .opentelemetry .proto .collector .metrics .v1 .ExportMetricsServiceRequest ;
35+ import io .opentelemetry .proto .collector .metrics .v1 .ExportMetricsServiceResponse ;
36+ import io .opentelemetry .proto .collector .metrics .v1 .MetricsServiceGrpc ;
2837import io .opentelemetry .sdk .common .InstrumentationScopeInfo ;
2938import io .opentelemetry .sdk .common .export .MemoryMode ;
3039import io .opentelemetry .sdk .metrics .SdkMeterProvider ;
3645import io .opentelemetry .sdk .metrics .internal .data .ImmutableGaugeData ;
3746import io .opentelemetry .sdk .resources .Resource ;
3847import java .util .Collection ;
48+ import java .util .concurrent .TimeUnit ;
3949import java .util .concurrent .atomic .AtomicReference ;
4050import java .util .function .Supplier ;
51+ import org .junit .jupiter .api .AfterEach ;
52+ import org .junit .jupiter .api .BeforeEach ;
4153import org .junit .jupiter .api .Test ;
54+ import org .junit .jupiter .api .extension .RegisterExtension ;
4255import org .mockito .Mockito ;
4356
4457class OtlpGrpcMetricExporterBuilderTest {
@@ -53,11 +66,48 @@ class OtlpGrpcMetricExporterBuilderTest {
5366 "test" ,
5467 ImmutableGaugeData .empty ()));
5568
69+ @ RegisterExtension
70+ private static final ServerExtension server =
71+ new ServerExtension () {
72+ @ Override
73+ protected void configure (ServerBuilder sb ) {
74+ sb .service (
75+ GrpcService .builder ()
76+ .addService (
77+ new MetricsServiceGrpc .MetricsServiceImplBase () {
78+ @ Override
79+ public void export (
80+ ExportMetricsServiceRequest request ,
81+ StreamObserver <
82+ io .opentelemetry .proto .collector .metrics .v1
83+ .ExportMetricsServiceResponse >
84+ responseObserver ) {
85+ responseObserver .onNext (
86+ ExportMetricsServiceResponse .getDefaultInstance ());
87+ responseObserver .onCompleted ();
88+ responseObserver .onCompleted ();
89+ }
90+ })
91+ .build ());
92+ sb .decorator (LoggingService .newDecorator ());
93+ }
94+ };
95+
5696 private final MeterProvider meterProvider = mock (MeterProvider .class );
5797 private final Meter meter = mock (Meter .class );
5898 private final LongCounterBuilder counterBuilder = mock (LongCounterBuilder .class );
5999 private final LongCounter counter = mock (LongCounter .class );
60100
101+ @ BeforeEach
102+ void setup () {
103+ GlobalOpenTelemetry .resetForTest ();
104+ }
105+
106+ @ AfterEach
107+ void cleanup () {
108+ GlobalOpenTelemetry .resetForTest ();
109+ }
110+
61111 @ Test
62112 void setMeterProvider_null () {
63113 OtlpGrpcMetricExporterBuilder builder = OtlpGrpcMetricExporter .builder ();
@@ -74,53 +124,61 @@ void setMeterProvider_null() {
74124 @ Test
75125 void setMeterProvider () {
76126 when (meterProvider .get (any ())).thenReturn (meter );
77- when (meter .counterBuilder (eq ( "otlp.exporter.seen" ))).thenReturn (counterBuilder );
127+ when (meter .counterBuilder (any ( ))).thenReturn (counterBuilder );
78128 when (counterBuilder .build ()).thenReturn (counter );
79129
80130 try (OtlpGrpcMetricExporter exporter =
81- OtlpGrpcMetricExporter .builder ().setMeterProvider (meterProvider ).build ()) {
131+ OtlpGrpcMetricExporter .builder ()
132+ .setMeterProvider (meterProvider )
133+ .setEndpoint ("http://localhost:" + server .httpPort ())
134+ .build ()) {
82135 verifyNoInteractions (meterProvider , meter , counterBuilder , counter );
83136
84137 // Collection before MeterProvider is initialized.
85138 when (meterProvider .get (any ())).thenReturn (MeterProvider .noop ().get ("test" ));
86- exporter .export (DATA_SET );
139+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
87140
88141 verifyNoInteractions (meter , counterBuilder , counter );
89142
90143 // Collection after MeterProvider is initialized.
91144 when (meterProvider .get (any ())).thenReturn (meter );
92- exporter .export (DATA_SET );
145+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
93146
94- verify (meter ).counterBuilder (eq ("otlp.exporter.seen" ));
95- verify (counter ).add (eq (1L ), any ());
147+ verify (meter ).counterBuilder ("otlp.exporter.seen" );
148+ verify (meter ).counterBuilder ("otlp.exporter.exported" );
149+ verify (counter , times (2 )).add (eq (1L ), any ());
96150 verifyNoMoreInteractions (meter , counter );
97151 }
98152 }
99153
100154 @ Test
101155 void setMeterProvider_supplier () {
102156 when (meterProvider .get (any ())).thenReturn (meter );
103- when (meter .counterBuilder (eq ( "otlp.exporter.seen" ))).thenReturn (counterBuilder );
157+ when (meter .counterBuilder (any ( ))).thenReturn (counterBuilder );
104158 when (counterBuilder .build ()).thenReturn (counter );
105159
106160 @ SuppressWarnings ("unchecked" )
107161 Supplier <MeterProvider > provider = mock (Supplier .class );
108162 try (OtlpGrpcMetricExporter exporter =
109- OtlpGrpcMetricExporter .builder ().setMeterProvider (provider ).build ()) {
163+ OtlpGrpcMetricExporter .builder ()
164+ .setMeterProvider (provider )
165+ .setEndpoint ("http://localhost:" + server .httpPort ())
166+ .build ()) {
110167 verifyNoInteractions (provider , meterProvider , meter , counterBuilder , counter );
111168
112169 // Collection before MeterProvider is initialized.
113170 when (provider .get ()).thenReturn (MeterProvider .noop ());
114- exporter .export (DATA_SET );
171+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
115172
116173 verifyNoInteractions (meterProvider , meter , counterBuilder , counter );
117174
118175 // Collection after MeterProvider is initialized.
119176 when (provider .get ()).thenReturn (meterProvider );
120- exporter .export (DATA_SET );
177+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
121178
122- verify (meter ).counterBuilder (eq ("otlp.exporter.seen" ));
123- verify (counter ).add (eq (1L ), any ());
179+ verify (meter ).counterBuilder ("otlp.exporter.seen" );
180+ verify (meter ).counterBuilder ("otlp.exporter.exported" );
181+ verify (counter , times (2 )).add (eq (1L ), any ());
124182 verifyNoMoreInteractions (meter , counter );
125183 }
126184 }
@@ -145,19 +203,21 @@ public ContextPropagators getPropagators() {
145203 }
146204 });
147205 when (meterProvider .get (any ())).thenReturn (meter );
148- when (meter .counterBuilder (eq ( "otlp.exporter.seen" ))).thenReturn (counterBuilder );
206+ when (meter .counterBuilder (any ( ))).thenReturn (counterBuilder );
149207 when (counterBuilder .build ()).thenReturn (counter );
150208
151- try (OtlpGrpcMetricExporter exporter = OtlpGrpcMetricExporter .builder ().build ()) {
209+ try (OtlpGrpcMetricExporter exporter =
210+ OtlpGrpcMetricExporter .builder ()
211+ .setEndpoint ("http://localhost:" + server .httpPort ())
212+ .build ()) {
152213 verifyNoInteractions (meterProvider , meter , counterBuilder , counter );
153214
154- exporter .export (DATA_SET );
215+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
155216
156- verify (meter ).counterBuilder (eq ("otlp.exporter.seen" ));
157- verify (counter ).add (eq (1L ), any ());
217+ verify (meter ).counterBuilder ("otlp.exporter.seen" );
218+ verify (meter ).counterBuilder ("otlp.exporter.exported" );
219+ verify (counter , times (2 )).add (eq (1L ), any ());
158220 verifyNoMoreInteractions (meter , counter );
159- } finally {
160- GlobalOpenTelemetry .resetForTest ();
161221 }
162222 }
163223
0 commit comments