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 .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 ;
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 .ExportMetricsServiceResponse ;
2835import io .opentelemetry .sdk .common .InstrumentationScopeInfo ;
2936import io .opentelemetry .sdk .common .export .MemoryMode ;
3037import io .opentelemetry .sdk .metrics .SdkMeterProvider ;
3643import io .opentelemetry .sdk .metrics .internal .data .ImmutableGaugeData ;
3744import io .opentelemetry .sdk .resources .Resource ;
3845import java .util .Collection ;
46+ import java .util .concurrent .CompletableFuture ;
47+ import java .util .concurrent .CompletionStage ;
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,41 @@ 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+ "/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+
5689 private final MeterProvider meterProvider = mock (MeterProvider .class );
5790 private final Meter meter = mock (Meter .class );
5891 private final LongCounterBuilder counterBuilder = mock (LongCounterBuilder .class );
5992 private final LongCounter counter = mock (LongCounter .class );
6093
94+ @ BeforeEach
95+ void setup () {
96+ GlobalOpenTelemetry .resetForTest ();
97+ }
98+
99+ @ AfterEach
100+ void cleanup () {
101+ GlobalOpenTelemetry .resetForTest ();
102+ }
103+
61104 @ Test
62105 void setMeterProvider_null () {
63106 OtlpGrpcMetricExporterBuilder builder = OtlpGrpcMetricExporter .builder ();
@@ -74,53 +117,61 @@ void setMeterProvider_null() {
74117 @ Test
75118 void setMeterProvider () {
76119 when (meterProvider .get (any ())).thenReturn (meter );
77- when (meter .counterBuilder (eq ( "otlp.exporter.seen" ))).thenReturn (counterBuilder );
120+ when (meter .counterBuilder (any ( ))).thenReturn (counterBuilder );
78121 when (counterBuilder .build ()).thenReturn (counter );
79122
80123 try (OtlpGrpcMetricExporter exporter =
81- OtlpGrpcMetricExporter .builder ().setMeterProvider (meterProvider ).build ()) {
124+ OtlpGrpcMetricExporter .builder ()
125+ .setMeterProvider (meterProvider )
126+ .setEndpoint ("http://localhost:" + server .httpPort ())
127+ .build ()) {
82128 verifyNoInteractions (meterProvider , meter , counterBuilder , counter );
83129
84130 // Collection before MeterProvider is initialized.
85131 when (meterProvider .get (any ())).thenReturn (MeterProvider .noop ().get ("test" ));
86- exporter .export (DATA_SET );
132+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
87133
88134 verifyNoInteractions (meter , counterBuilder , counter );
89135
90136 // Collection after MeterProvider is initialized.
91137 when (meterProvider .get (any ())).thenReturn (meter );
92- exporter .export (DATA_SET );
138+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
93139
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 ());
96143 verifyNoMoreInteractions (meter , counter );
97144 }
98145 }
99146
100147 @ Test
101148 void setMeterProvider_supplier () {
102149 when (meterProvider .get (any ())).thenReturn (meter );
103- when (meter .counterBuilder (eq ( "otlp.exporter.seen" ))).thenReturn (counterBuilder );
150+ when (meter .counterBuilder (any ( ))).thenReturn (counterBuilder );
104151 when (counterBuilder .build ()).thenReturn (counter );
105152
106153 @ SuppressWarnings ("unchecked" )
107154 Supplier <MeterProvider > provider = mock (Supplier .class );
108155 try (OtlpGrpcMetricExporter exporter =
109- OtlpGrpcMetricExporter .builder ().setMeterProvider (provider ).build ()) {
156+ OtlpGrpcMetricExporter .builder ()
157+ .setMeterProvider (provider )
158+ .setEndpoint ("http://localhost:" + server .httpPort ())
159+ .build ()) {
110160 verifyNoInteractions (provider , meterProvider , meter , counterBuilder , counter );
111161
112162 // Collection before MeterProvider is initialized.
113163 when (provider .get ()).thenReturn (MeterProvider .noop ());
114- exporter .export (DATA_SET );
164+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
115165
116166 verifyNoInteractions (meterProvider , meter , counterBuilder , counter );
117167
118168 // Collection after MeterProvider is initialized.
119169 when (provider .get ()).thenReturn (meterProvider );
120- exporter .export (DATA_SET );
170+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
121171
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 ());
124175 verifyNoMoreInteractions (meter , counter );
125176 }
126177 }
@@ -145,19 +196,21 @@ public ContextPropagators getPropagators() {
145196 }
146197 });
147198 when (meterProvider .get (any ())).thenReturn (meter );
148- when (meter .counterBuilder (eq ( "otlp.exporter.seen" ))).thenReturn (counterBuilder );
199+ when (meter .counterBuilder (any ( ))).thenReturn (counterBuilder );
149200 when (counterBuilder .build ()).thenReturn (counter );
150201
151- try (OtlpGrpcMetricExporter exporter = OtlpGrpcMetricExporter .builder ().build ()) {
202+ try (OtlpGrpcMetricExporter exporter =
203+ OtlpGrpcMetricExporter .builder ()
204+ .setEndpoint ("http://localhost:" + server .httpPort ())
205+ .build ()) {
152206 verifyNoInteractions (meterProvider , meter , counterBuilder , counter );
153207
154- exporter .export (DATA_SET );
208+ exporter .export (DATA_SET ). join ( 10 , TimeUnit . SECONDS ) ;
155209
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 ());
158213 verifyNoMoreInteractions (meter , counter );
159- } finally {
160- GlobalOpenTelemetry .resetForTest ();
161214 }
162215 }
163216
0 commit comments