Skip to content

Commit 62484da

Browse files
committed
Fix Otlp*MetricExporterBuilderTests
1 parent 29523e6 commit 62484da

File tree

4 files changed

+143
-41
lines changed

4 files changed

+143
-41
lines changed

exporters/common/src/main/java/io/opentelemetry/exporter/internal/ExporterMetrics.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,11 @@ private LongCounter exported() {
8787
}
8888

8989
private Meter meter() {
90-
return meterProviderSupplier
91-
.get()
92-
.get("io.opentelemetry.exporters." + exporterName + "-" + transportName);
90+
MeterProvider meterProvider = meterProviderSupplier.get();
91+
if (meterProvider == null) {
92+
meterProvider = MeterProvider.noop();
93+
}
94+
return meterProvider.get("io.opentelemetry.exporters." + exporterName + "-" + transportName);
9395
}
9496

9597
private static boolean isNoop(LongCounter counter) {

exporters/otlp/all/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ dependencies {
2626

2727
testImplementation(project(":exporters:otlp:testing-internal"))
2828
testImplementation("com.linecorp.armeria:armeria-junit5")
29+
implementation("com.linecorp.armeria:armeria-grpc")
2930
testImplementation("io.grpc:grpc-stub")
3031

3132
jmhImplementation(project(":sdk:testing"))

exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/http/metrics/OtlpHttpMetricExporterBuilderTest.java

Lines changed: 58 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,16 @@
1212
import static org.mockito.ArgumentMatchers.any;
1313
import static org.mockito.ArgumentMatchers.eq;
1414
import static org.mockito.Mockito.mock;
15+
import static org.mockito.Mockito.times;
1516
import static org.mockito.Mockito.verify;
1617
import static org.mockito.Mockito.verifyNoInteractions;
1718
import static org.mockito.Mockito.verifyNoMoreInteractions;
1819
import static org.mockito.Mockito.when;
1920

21+
import com.linecorp.armeria.common.HttpResponse;
22+
import com.linecorp.armeria.common.HttpStatus;
23+
import com.linecorp.armeria.server.ServerBuilder;
24+
import com.linecorp.armeria.testing.junit5.server.ServerExtension;
2025
import io.opentelemetry.api.GlobalOpenTelemetry;
2126
import io.opentelemetry.api.OpenTelemetry;
2227
import io.opentelemetry.api.metrics.LongCounter;
@@ -36,9 +41,13 @@
3641
import io.opentelemetry.sdk.metrics.internal.data.ImmutableGaugeData;
3742
import io.opentelemetry.sdk.resources.Resource;
3843
import java.util.Collection;
44+
import java.util.concurrent.TimeUnit;
3945
import java.util.concurrent.atomic.AtomicReference;
4046
import java.util.function.Supplier;
47+
import org.junit.jupiter.api.AfterEach;
48+
import org.junit.jupiter.api.BeforeEach;
4149
import org.junit.jupiter.api.Test;
50+
import org.junit.jupiter.api.extension.RegisterExtension;
4251
import org.mockito.Mockito;
4352

4453
class OtlpHttpMetricExporterBuilderTest {
@@ -53,11 +62,31 @@ class OtlpHttpMetricExporterBuilderTest {
5362
"test",
5463
ImmutableGaugeData.empty()));
5564

65+
@RegisterExtension
66+
private static final ServerExtension server =
67+
new ServerExtension() {
68+
@Override
69+
protected void configure(ServerBuilder sb) {
70+
sb.service("/v1/metrics", (ctx, req) -> HttpResponse.of(HttpStatus.OK));
71+
sb.http(0);
72+
}
73+
};
74+
5675
private final SdkMeterProvider meterProvider = mock(SdkMeterProvider.class);
5776
private final Meter meter = mock(Meter.class);
5877
private final LongCounterBuilder counterBuilder = mock(LongCounterBuilder.class);
5978
private final LongCounter counter = mock(LongCounter.class);
6079

80+
@BeforeEach
81+
void setup() {
82+
GlobalOpenTelemetry.resetForTest();
83+
}
84+
85+
@AfterEach
86+
void cleanup() {
87+
GlobalOpenTelemetry.resetForTest();
88+
}
89+
6190
@Test
6291
void setMeterProvider_null() {
6392
OtlpHttpMetricExporterBuilder builder = OtlpHttpMetricExporter.builder();
@@ -74,53 +103,61 @@ void setMeterProvider_null() {
74103
@Test
75104
void setMeterProvider() {
76105
when(meterProvider.get(any())).thenReturn(meter);
77-
when(meter.counterBuilder(eq("otlp.exporter.seen"))).thenReturn(counterBuilder);
106+
when(meter.counterBuilder(any())).thenReturn(counterBuilder);
78107
when(counterBuilder.build()).thenReturn(counter);
79108

80109
try (OtlpHttpMetricExporter exporter =
81-
OtlpHttpMetricExporter.builder().setMeterProvider(meterProvider).build()) {
110+
OtlpHttpMetricExporter.builder()
111+
.setMeterProvider(meterProvider)
112+
.setEndpoint("http://localhost:" + server.httpPort() + "/v1/metrics")
113+
.build()) {
82114
verifyNoInteractions(meterProvider, meter, counterBuilder, counter);
83115

84116
// Collection before MeterProvider is initialized.
85117
when(meterProvider.get(any())).thenReturn(MeterProvider.noop().get("test"));
86-
exporter.export(DATA_SET);
118+
exporter.export(DATA_SET).join(10, TimeUnit.SECONDS);
87119

88120
verifyNoInteractions(meter, counterBuilder, counter);
89121

90122
// Collection after MeterProvider is initialized.
91123
when(meterProvider.get(any())).thenReturn(meter);
92-
exporter.export(DATA_SET);
124+
exporter.export(DATA_SET).join(10, TimeUnit.SECONDS);
93125

94-
verify(meter).counterBuilder(eq("otlp.exporter.seen"));
95-
verify(counter).add(eq(1L), any());
126+
verify(meter).counterBuilder("otlp.exporter.seen");
127+
verify(meter).counterBuilder("otlp.exporter.exported");
128+
verify(counter, times(2)).add(eq(1L), any());
96129
verifyNoMoreInteractions(meter, counter);
97130
}
98131
}
99132

100133
@Test
101134
void setMeterProvider_supplier() {
102135
when(meterProvider.get(any())).thenReturn(meter);
103-
when(meter.counterBuilder(eq("otlp.exporter.seen"))).thenReturn(counterBuilder);
136+
when(meter.counterBuilder(any())).thenReturn(counterBuilder);
104137
when(counterBuilder.build()).thenReturn(counter);
105138

106139
@SuppressWarnings("unchecked")
107140
Supplier<MeterProvider> provider = mock(Supplier.class);
108141
try (OtlpHttpMetricExporter exporter =
109-
OtlpHttpMetricExporter.builder().setMeterProvider(provider).build()) {
142+
OtlpHttpMetricExporter.builder()
143+
.setMeterProvider(provider)
144+
.setEndpoint("http://localhost:" + server.httpPort() + "/v1/metrics")
145+
.build()) {
110146
verifyNoInteractions(provider, meterProvider, meter, counterBuilder, counter);
111147

112148
// Collection before MeterProvider is initialized.
113149
when(provider.get()).thenReturn(MeterProvider.noop());
114-
exporter.export(DATA_SET);
150+
exporter.export(DATA_SET).join(10, TimeUnit.SECONDS);
115151

116152
verifyNoInteractions(meterProvider, meter, counterBuilder, counter);
117153

118154
// Collection after MeterProvider is initialized.
119155
when(provider.get()).thenReturn(meterProvider);
120-
exporter.export(DATA_SET);
156+
exporter.export(DATA_SET).join(10, TimeUnit.SECONDS);
121157

122-
verify(meter).counterBuilder(eq("otlp.exporter.seen"));
123-
verify(counter).add(eq(1L), any());
158+
verify(meter).counterBuilder("otlp.exporter.seen");
159+
verify(meter).counterBuilder("otlp.exporter.exported");
160+
verify(counter, times(2)).add(eq(1L), any());
124161
verifyNoMoreInteractions(meter, counter);
125162
}
126163
}
@@ -145,19 +182,21 @@ public ContextPropagators getPropagators() {
145182
}
146183
});
147184
when(meterProvider.get(any())).thenReturn(meter);
148-
when(meter.counterBuilder(eq("otlp.exporter.seen"))).thenReturn(counterBuilder);
185+
when(meter.counterBuilder(any())).thenReturn(counterBuilder);
149186
when(counterBuilder.build()).thenReturn(counter);
150187

151-
try (OtlpHttpMetricExporter exporter = OtlpHttpMetricExporter.builder().build()) {
188+
try (OtlpHttpMetricExporter exporter =
189+
OtlpHttpMetricExporter.builder()
190+
.setEndpoint("http://localhost:" + server.httpPort() + "/v1/metrics")
191+
.build()) {
152192
verifyNoInteractions(meterProvider, meter, counterBuilder, counter);
153193

154-
exporter.export(DATA_SET);
194+
exporter.export(DATA_SET).join(10, TimeUnit.SECONDS);
155195

156-
verify(meter).counterBuilder(eq("otlp.exporter.seen"));
157-
verify(counter).add(eq(1L), any());
196+
verify(meter).counterBuilder("otlp.exporter.seen");
197+
verify(meter).counterBuilder("otlp.exporter.exported");
198+
verify(counter, times(2)).add(eq(1L), any());
158199
verifyNoMoreInteractions(meter, counter);
159-
} finally {
160-
GlobalOpenTelemetry.resetForTest();
161200
}
162201
}
163202

exporters/otlp/all/src/test/java/io/opentelemetry/exporter/otlp/metrics/OtlpGrpcMetricExporterBuilderTest.java

Lines changed: 79 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,17 @@
1212
import static org.mockito.ArgumentMatchers.any;
1313
import static org.mockito.ArgumentMatchers.eq;
1414
import static org.mockito.Mockito.mock;
15+
import static org.mockito.Mockito.times;
1516
import static org.mockito.Mockito.verify;
1617
import static org.mockito.Mockito.verifyNoInteractions;
1718
import static org.mockito.Mockito.verifyNoMoreInteractions;
1819
import 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;
2026
import io.opentelemetry.api.GlobalOpenTelemetry;
2127
import io.opentelemetry.api.OpenTelemetry;
2228
import io.opentelemetry.api.metrics.LongCounter;
@@ -25,6 +31,9 @@
2531
import io.opentelemetry.api.metrics.MeterProvider;
2632
import io.opentelemetry.api.trace.TracerProvider;
2733
import 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;
2837
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
2938
import io.opentelemetry.sdk.common.export.MemoryMode;
3039
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
@@ -36,9 +45,13 @@
3645
import io.opentelemetry.sdk.metrics.internal.data.ImmutableGaugeData;
3746
import io.opentelemetry.sdk.resources.Resource;
3847
import java.util.Collection;
48+
import java.util.concurrent.TimeUnit;
3949
import java.util.concurrent.atomic.AtomicReference;
4050
import java.util.function.Supplier;
51+
import org.junit.jupiter.api.AfterEach;
52+
import org.junit.jupiter.api.BeforeEach;
4153
import org.junit.jupiter.api.Test;
54+
import org.junit.jupiter.api.extension.RegisterExtension;
4255
import org.mockito.Mockito;
4356

4457
class 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

Comments
 (0)