Skip to content

Commit fed0015

Browse files
authored
Move smoke test infrastructure classes to src/main (#14671)
1 parent 1c1f93a commit fed0015

20 files changed

+121
-103
lines changed

smoke-tests/build.gradle.kts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ otelJava {
1717

1818
val dockerJavaVersion = "3.6.0"
1919
dependencies {
20-
testCompileOnly("com.google.auto.value:auto-value-annotations")
21-
testAnnotationProcessor("com.google.auto.value:auto-value")
20+
compileOnly("com.google.auto.value:auto-value-annotations")
21+
annotationProcessor("com.google.auto.value:auto-value")
2222

2323
api("org.spockframework:spock-core")
2424
api(project(":testing-common"))
@@ -34,12 +34,13 @@ dependencies {
3434
implementation("io.grpc:grpc-protobuf")
3535
implementation("io.grpc:grpc-stub")
3636

37-
testImplementation("com.github.docker-java:docker-java-core:$dockerJavaVersion")
38-
testImplementation("com.github.docker-java:docker-java-transport-httpclient5:$dockerJavaVersion")
37+
implementation("com.github.docker-java:docker-java-core:$dockerJavaVersion")
38+
implementation("com.github.docker-java:docker-java-transport-httpclient5:$dockerJavaVersion")
3939

4040
// make IntelliJ see shaded Armeria and protobuf
41+
compileOnly(project(":testing:armeria-shaded-for-testing", configuration = "shadow"))
4142
testCompileOnly(project(":testing:armeria-shaded-for-testing", configuration = "shadow"))
42-
testCompileOnly(project(":testing:proto-shaded-for-testing", configuration = "shadow"))
43+
compileOnly(project(":testing:proto-shaded-for-testing", configuration = "shadow"))
4344
}
4445

4546
tasks {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.smoketest;
7+
8+
import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest;
9+
import java.util.Collection;
10+
11+
public class MetricsInspector {
12+
final Collection<ExportMetricsServiceRequest> requests;
13+
14+
public MetricsInspector(Collection<ExportMetricsServiceRequest> requests) {
15+
this.requests = requests;
16+
}
17+
18+
public boolean hasMetricsNamed(String metricName) {
19+
return requests.stream()
20+
.flatMap(it -> it.getResourceMetricsList().stream())
21+
.flatMap(it -> it.getScopeMetricsList().stream())
22+
.flatMap(it -> it.getMetricsList().stream())
23+
.anyMatch(it -> metricName.equals(it.getName()));
24+
}
25+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.smoketest;
7+
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import com.google.protobuf.GeneratedMessage;
10+
import com.google.protobuf.util.JsonFormat;
11+
import io.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest;
12+
import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest;
13+
import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest;
14+
import io.opentelemetry.testing.internal.armeria.client.WebClient;
15+
import java.util.Collection;
16+
import java.util.concurrent.TimeUnit;
17+
import java.util.function.Supplier;
18+
import java.util.stream.Collectors;
19+
import java.util.stream.StreamSupport;
20+
21+
public class TelemetryRetriever {
22+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
23+
24+
final WebClient client;
25+
26+
TelemetryRetriever(int backendPort) {
27+
client = WebClient.of("http://localhost:" + backendPort);
28+
}
29+
30+
void clearTelemetry() {
31+
client.get("/clear").aggregate().join();
32+
}
33+
34+
Collection<ExportTraceServiceRequest> waitForTraces() {
35+
return waitForTelemetry("get-traces", ExportTraceServiceRequest::newBuilder);
36+
}
37+
38+
Collection<ExportMetricsServiceRequest> waitForMetrics() {
39+
return waitForTelemetry("get-metrics", ExportMetricsServiceRequest::newBuilder);
40+
}
41+
42+
Collection<ExportLogsServiceRequest> waitForLogs() {
43+
return waitForTelemetry("get-logs", ExportLogsServiceRequest::newBuilder);
44+
}
45+
46+
@SuppressWarnings({"unchecked", "InterruptedExceptionSwallowed"})
47+
private <T extends GeneratedMessage, B extends GeneratedMessage.Builder<?>>
48+
Collection<T> waitForTelemetry(String path, Supplier<B> builderConstructor) {
49+
try {
50+
String content = waitForContent(path);
51+
52+
return StreamSupport.stream(OBJECT_MAPPER.readTree(content).spliterator(), false)
53+
.map(
54+
jsonNode -> {
55+
B builder = builderConstructor.get();
56+
// TODO: Register parser into object mapper to avoid de -> re -> deserialize.
57+
try {
58+
String json = OBJECT_MAPPER.writeValueAsString(jsonNode);
59+
JsonFormat.parser().merge(json, builder);
60+
} catch (Exception e) {
61+
throw new IllegalStateException(e);
62+
}
63+
return (T) builder.build();
64+
})
65+
.collect(Collectors.toList());
66+
} catch (Exception e) {
67+
throw new IllegalStateException(e);
68+
}
69+
}
70+
71+
@SuppressWarnings("SystemOut")
72+
private String waitForContent(String path) throws InterruptedException {
73+
long previousSize = 0;
74+
long deadline = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(30);
75+
String content = "[]";
76+
while (System.currentTimeMillis() < deadline) {
77+
content = client.get(path).aggregate().join().contentUtf8();
78+
if (content.length() > 2 && content.length() == previousSize) {
79+
break;
80+
}
81+
previousSize = content.length();
82+
System.out.println("Current content size $previousSize");
83+
TimeUnit.MILLISECONDS.sleep(500);
84+
}
85+
86+
return content;
87+
}
88+
}

0 commit comments

Comments
 (0)