Skip to content

Commit b9b8105

Browse files
authored
Extract gRPC exporter test into shared base class. (open-telemetry#3903)
* Extract gRPC exporter test into shared base class. * Split out config test
1 parent 1c1d264 commit b9b8105

17 files changed

Lines changed: 803 additions & 1170 deletions

File tree

dependencyManagement/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ val DEPENDENCY_BOMS = listOf(
1515
"com.fasterxml.jackson:jackson-bom:2.13.0",
1616
"com.google.guava:guava-bom:31.0.1-jre",
1717
"com.google.protobuf:protobuf-bom:3.18.1",
18-
"com.linecorp.armeria:armeria-bom:1.11.0",
18+
"com.linecorp.armeria:armeria-bom:1.13.2",
1919
"io.grpc:grpc-bom:1.41.0",
2020
"io.zipkin.brave:brave-bom:5.13.3",
2121
"io.zipkin.reporter2:zipkin-reporter-bom:2.16.3",

exporters/otlp/common/src/main/java/io/opentelemetry/exporter/otlp/internal/grpc/OkHttpGrpcExporter.java

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ public final class OkHttpGrpcExporter<T extends Marshaler> implements GrpcExport
5656
private static final String GRPC_STATUS = "grpc-status";
5757
private static final String GRPC_MESSAGE = "grpc-message";
5858

59+
private static final String GRPC_STATUS_UNIMPLEMENTED = "12";
60+
private static final String GRPC_STATUS_UNAVAILABLE = "14";
61+
5962
private final ThrottlingLogger logger =
6063
new ThrottlingLogger(Logger.getLogger(OkHttpGrpcExporter.class.getName()));
6164

@@ -146,14 +149,36 @@ public void onResponse(Call call, Response response) {
146149
? "gRPC status code " + status
147150
: "HTTP status code " + response.code();
148151
String errorMessage = grpcMessage(response);
149-
logger.log(
150-
Level.WARNING,
151-
"Failed to export "
152-
+ type
153-
+ "s. Server responded with "
154-
+ codeMessage
155-
+ ". Error message: "
156-
+ errorMessage);
152+
153+
if (GRPC_STATUS_UNIMPLEMENTED.equals(status)) {
154+
logger.log(
155+
Level.SEVERE,
156+
"Failed to export "
157+
+ type
158+
+ "s. Server responded with UNIMPLEMENTED. "
159+
+ "This usually means that your collector is not configured with an otlp "
160+
+ "receiver in the \"pipelines\" section of the configuration. "
161+
+ "Full error message: "
162+
+ errorMessage);
163+
} else if (GRPC_STATUS_UNAVAILABLE.equals(status)) {
164+
logger.log(
165+
Level.SEVERE,
166+
"Failed to export "
167+
+ type
168+
+ "s. Server is UNAVAILABLE. "
169+
+ "Make sure your collector is running and reachable from this network. "
170+
+ "Full error message:"
171+
+ errorMessage);
172+
} else {
173+
logger.log(
174+
Level.WARNING,
175+
"Failed to export "
176+
+ type
177+
+ "s. Server responded with "
178+
+ codeMessage
179+
+ ". Error message: "
180+
+ errorMessage);
181+
}
157182
result.fail();
158183
}
159184
});

exporters/otlp/logs/build.gradle.kts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,9 @@ dependencies {
2323

2424
compileOnly("io.grpc:grpc-stub")
2525

26+
testImplementation(project(":exporters:otlp:testing-internal"))
2627
testImplementation(project(":sdk:testing"))
2728

28-
testImplementation("com.google.protobuf:protobuf-java")
29-
testImplementation("io.grpc:grpc-protobuf")
30-
testImplementation("io.grpc:grpc-testing")
31-
testImplementation("io.opentelemetry.proto:opentelemetry-proto")
32-
testImplementation("org.slf4j:slf4j-simple")
33-
3429
add("testGrpcNettyImplementation", "com.linecorp.armeria:armeria-grpc")
3530
add("testGrpcNettyImplementation", "com.linecorp.armeria:armeria-junit5")
3631
add("testGrpcNettyRuntimeOnly", "io.grpc:grpc-netty")
@@ -57,11 +52,3 @@ tasks {
5752
dependsOn("testGrpcNetty", "testGrpcNettyShaded", "testGrpcOkhttp", "testOkHttpOnly")
5853
}
5954
}
60-
61-
configurations {
62-
named("testOkHttpOnlyRuntimeClasspath") {
63-
dependencies {
64-
exclude("io.grpc")
65-
}
66-
}
67-
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.exporter.otlp.logs;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.assertj.core.api.Assertions.assertThatCode;
10+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
11+
12+
import io.opentelemetry.exporter.otlp.internal.grpc.OkHttpGrpcExporterBuilder;
13+
import java.nio.charset.StandardCharsets;
14+
import java.time.Duration;
15+
import java.util.concurrent.TimeUnit;
16+
import org.junit.jupiter.api.Test;
17+
18+
class ConfigTest {
19+
20+
@Test
21+
@SuppressWarnings("PreferJavaTimeOverload")
22+
void validConfig() {
23+
assertThatCode(() -> OtlpGrpcLogExporter.builder().setTimeout(0, TimeUnit.MILLISECONDS))
24+
.doesNotThrowAnyException();
25+
assertThatCode(() -> OtlpGrpcLogExporter.builder().setTimeout(Duration.ofMillis(0)))
26+
.doesNotThrowAnyException();
27+
assertThatCode(() -> OtlpGrpcLogExporter.builder().setTimeout(10, TimeUnit.MILLISECONDS))
28+
.doesNotThrowAnyException();
29+
assertThatCode(() -> OtlpGrpcLogExporter.builder().setTimeout(Duration.ofMillis(10)))
30+
.doesNotThrowAnyException();
31+
32+
assertThatCode(() -> OtlpGrpcLogExporter.builder().setEndpoint("http://localhost:4317"))
33+
.doesNotThrowAnyException();
34+
assertThatCode(() -> OtlpGrpcLogExporter.builder().setEndpoint("http://localhost"))
35+
.doesNotThrowAnyException();
36+
assertThatCode(() -> OtlpGrpcLogExporter.builder().setEndpoint("https://localhost"))
37+
.doesNotThrowAnyException();
38+
assertThatCode(() -> OtlpGrpcLogExporter.builder().setEndpoint("http://foo:bar@localhost"))
39+
.doesNotThrowAnyException();
40+
41+
assertThatCode(() -> OtlpGrpcLogExporter.builder().setCompression("gzip"))
42+
.doesNotThrowAnyException();
43+
assertThatCode(() -> OtlpGrpcLogExporter.builder().setCompression("none"))
44+
.doesNotThrowAnyException();
45+
46+
assertThatCode(
47+
() -> OtlpGrpcLogExporter.builder().addHeader("foo", "bar").addHeader("baz", "qux"))
48+
.doesNotThrowAnyException();
49+
50+
assertThatCode(
51+
() ->
52+
OtlpGrpcLogExporter.builder()
53+
.setTrustedCertificates("foobar".getBytes(StandardCharsets.UTF_8)))
54+
.doesNotThrowAnyException();
55+
}
56+
57+
@Test
58+
@SuppressWarnings("PreferJavaTimeOverload")
59+
void invalidConfig() {
60+
assertThatThrownBy(() -> OtlpGrpcLogExporter.builder().setTimeout(-1, TimeUnit.MILLISECONDS))
61+
.isInstanceOf(IllegalArgumentException.class)
62+
.hasMessage("timeout must be non-negative");
63+
assertThatThrownBy(() -> OtlpGrpcLogExporter.builder().setTimeout(1, null))
64+
.isInstanceOf(NullPointerException.class)
65+
.hasMessage("unit");
66+
assertThatThrownBy(() -> OtlpGrpcLogExporter.builder().setTimeout(null))
67+
.isInstanceOf(NullPointerException.class)
68+
.hasMessage("timeout");
69+
70+
assertThatThrownBy(() -> OtlpGrpcLogExporter.builder().setEndpoint(null))
71+
.isInstanceOf(NullPointerException.class)
72+
.hasMessage("endpoint");
73+
assertThatThrownBy(() -> OtlpGrpcLogExporter.builder().setEndpoint("😺://localhost"))
74+
.isInstanceOf(IllegalArgumentException.class)
75+
.hasMessage("Invalid endpoint, must be a URL: 😺://localhost");
76+
assertThatThrownBy(() -> OtlpGrpcLogExporter.builder().setEndpoint("localhost"))
77+
.isInstanceOf(IllegalArgumentException.class)
78+
.hasMessage("Invalid endpoint, must start with http:// or https://: localhost");
79+
assertThatThrownBy(() -> OtlpGrpcLogExporter.builder().setEndpoint("gopher://localhost"))
80+
.isInstanceOf(IllegalArgumentException.class)
81+
.hasMessage("Invalid endpoint, must start with http:// or https://: gopher://localhost");
82+
83+
assertThatThrownBy(() -> OtlpGrpcLogExporter.builder().setCompression(null))
84+
.isInstanceOf(NullPointerException.class)
85+
.hasMessage("compressionMethod");
86+
assertThatThrownBy(() -> OtlpGrpcLogExporter.builder().setCompression("foo"))
87+
.isInstanceOf(IllegalArgumentException.class)
88+
.hasMessage(
89+
"Unsupported compression method. Supported compression methods include: gzip, none.");
90+
}
91+
92+
@Test
93+
void usingOkHttp() {
94+
assertThat(OtlpGrpcLogExporter.builder().delegate)
95+
.isInstanceOf(OkHttpGrpcExporterBuilder.class);
96+
}
97+
}

0 commit comments

Comments
 (0)