Skip to content

Commit 233d7d8

Browse files
zeitlingerotelbot[bot]laurit
authored
convert groovy smoke test to java, part 2 (#14683)
Co-authored-by: otelbot <[email protected]> Co-authored-by: Lauri Tulmin <[email protected]>
1 parent 9f021ff commit 233d7d8

29 files changed

+778
-621
lines changed
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 GroovyTestTelemetryRetriever {
22+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
23+
24+
final WebClient client;
25+
26+
GroovyTestTelemetryRetriever(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+
}

smoke-tests/src/main/java/io/opentelemetry/smoketest/JavaTelemetryRetriever.java

Lines changed: 0 additions & 113 deletions
This file was deleted.
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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.instrumentation.testing.junit.InstrumentationExtension;
9+
import org.junit.jupiter.api.extension.ExtensionContext;
10+
11+
/**
12+
* JUnit 5 extension for writing smoke tests that use a {@link TelemetryRetriever} to retrieve
13+
* telemetry data from the fake backend.
14+
*
15+
* <p>Example usage:
16+
*
17+
* <pre>
18+
* class MySmokeTest implements TelemetryRetrieverProvider {
19+
* {@literal @}RegisterExtension
20+
* static final InstrumentationExtension testing = SmokeTestInstrumentationExtension.create();
21+
*
22+
* {@literal @}Test
23+
* void test() {
24+
* // test code ...
25+
*
26+
* var spans = testing.spans();
27+
* // assertions on collected spans ...
28+
* }
29+
* }
30+
* </pre>
31+
*/
32+
public class SmokeTestInstrumentationExtension extends InstrumentationExtension {
33+
private SmokeTestInstrumentationExtension() {
34+
super(SmokeTestRunner.instance());
35+
}
36+
37+
public static SmokeTestInstrumentationExtension create() {
38+
return new SmokeTestInstrumentationExtension();
39+
}
40+
41+
@Override
42+
public void beforeEach(ExtensionContext extensionContext) {
43+
Object testInstance = extensionContext.getRequiredTestInstance();
44+
45+
if (!(testInstance instanceof TelemetryRetrieverProvider)) {
46+
throw new AssertionError(
47+
"SmokeTestInstrumentationExtension can only be applied to a subclass of "
48+
+ "TelemetryRetrieverProvider");
49+
}
50+
51+
SmokeTestRunner smokeTestRunner = (SmokeTestRunner) getTestRunner();
52+
smokeTestRunner.setTelemetryRetriever(
53+
((TelemetryRetrieverProvider) testInstance).getTelemetryRetriever());
54+
55+
super.beforeEach(extensionContext);
56+
}
57+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
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.api.OpenTelemetry;
9+
import io.opentelemetry.instrumentation.testing.InstrumentationTestRunner;
10+
import io.opentelemetry.sdk.logs.data.LogRecordData;
11+
import io.opentelemetry.sdk.metrics.data.MetricData;
12+
import io.opentelemetry.sdk.trace.data.SpanData;
13+
import java.util.List;
14+
15+
/**
16+
* An implementation of {@link InstrumentationTestRunner} that uses {@link TelemetryRetriever} to
17+
* fetch traces, metrics and logs from the fake backend.
18+
*/
19+
public class SmokeTestRunner extends InstrumentationTestRunner {
20+
21+
private static final SmokeTestRunner INSTANCE = new SmokeTestRunner();
22+
23+
private TelemetryRetriever telemetryRetriever;
24+
25+
public static SmokeTestRunner instance() {
26+
return INSTANCE;
27+
}
28+
29+
private SmokeTestRunner() {
30+
super(OpenTelemetry.noop());
31+
}
32+
33+
void setTelemetryRetriever(TelemetryRetriever telemetryRetriever) {
34+
this.telemetryRetriever = telemetryRetriever;
35+
}
36+
37+
@Override
38+
public void beforeTestClass() {}
39+
40+
@Override
41+
public void afterTestClass() {}
42+
43+
@Override
44+
public void clearAllExportedData() {
45+
telemetryRetriever.clearTelemetry();
46+
}
47+
48+
@Override
49+
public OpenTelemetry getOpenTelemetry() {
50+
throw new UnsupportedOperationException();
51+
}
52+
53+
@Override
54+
public List<SpanData> getExportedSpans() {
55+
return telemetryRetriever.waitForTraces();
56+
}
57+
58+
@Override
59+
public List<MetricData> getExportedMetrics() {
60+
return telemetryRetriever.waitForMetrics();
61+
}
62+
63+
@Override
64+
public List<LogRecordData> getExportedLogRecords() {
65+
return telemetryRetriever.waitForLogs();
66+
}
67+
68+
@Override
69+
public boolean forceFlushCalled() {
70+
throw new UnsupportedOperationException();
71+
}
72+
}

smoke-tests/src/main/java/io/opentelemetry/smoketest/TargetRunner.java

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)