Skip to content

Commit d70fe5b

Browse files
authored
Fix Otlp*MetricExporterBuilderTests (#7313)
1 parent 5bda810 commit d70fe5b

File tree

4 files changed

+136
-41
lines changed

4 files changed

+136
-41
lines changed

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

+5-3
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

+1
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+
testImplementation("com.linecorp.armeria:armeria-grpc-protocol")
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

+58-19
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

+72-19
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.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;
2026
import io.opentelemetry.api.GlobalOpenTelemetry;
2127
import io.opentelemetry.api.OpenTelemetry;
2228
import io.opentelemetry.api.metrics.LongCounter;
@@ -25,6 +31,7 @@
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.ExportMetricsServiceResponse;
2835
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
2936
import io.opentelemetry.sdk.common.export.MemoryMode;
3037
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
@@ -36,9 +43,15 @@
3643
import io.opentelemetry.sdk.metrics.internal.data.ImmutableGaugeData;
3744
import io.opentelemetry.sdk.resources.Resource;
3845
import java.util.Collection;
46+
import java.util.concurrent.CompletableFuture;
47+
import java.util.concurrent.CompletionStage;
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,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

Comments
 (0)