Skip to content

Commit 00dfd99

Browse files
authored
Alternative fix for flaky jfr telemetry test (#8203)
Reverts #8183 Perhaps the problem is that the gc happens before reading jfr events is started.
1 parent 08236a7 commit 00dfd99

File tree

5 files changed

+13
-17
lines changed

5 files changed

+13
-17
lines changed

instrumentation/runtime-telemetry-jfr/library/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ tasks {
3232
}
3333
include("**/*PsGcMemoryMetricTest.*")
3434
jvmArgs("-XX:+UseParallelGC")
35-
jvmArgs("-Xmx128m")
3635
}
3736

3837
val testSerial by registering(Test::class) {

instrumentation/runtime-telemetry-jfr/library/src/main/java/io/opentelemetry/instrumentation/runtimetelemetryjfr/JfrTelemetry.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.opentelemetry.instrumentation.runtimetelemetryjfr.internal.RecordedEventHandler;
1010
import java.io.Closeable;
1111
import java.util.List;
12+
import java.util.concurrent.CountDownLatch;
1213
import java.util.concurrent.atomic.AtomicBoolean;
1314
import java.util.function.Predicate;
1415
import java.util.logging.Level;
@@ -25,6 +26,7 @@ public final class JfrTelemetry implements Closeable {
2526
private final OpenTelemetry openTelemetry;
2627
private final List<RecordedEventHandler> recordedEventHandlers;
2728
private final RecordingStream recordingStream;
29+
private final CountDownLatch startUpLatch = new CountDownLatch(1);
2830

2931
@SuppressWarnings("CatchingUnchecked")
3032
JfrTelemetry(OpenTelemetry openTelemetry, Predicate<JfrFeature> featurePredicate) {
@@ -39,6 +41,7 @@ public final class JfrTelemetry implements Closeable {
3941
handler.getThreshold().ifPresent(eventSettings::withThreshold);
4042
recordingStream.onEvent(handler.getEventName(), handler);
4143
});
44+
recordingStream.onMetadata(event -> startUpLatch.countDown());
4245
Thread daemonRunner = new Thread(() -> recordingStream.start());
4346
daemonRunner.setDaemon(true);
4447
daemonRunner.start();
@@ -84,6 +87,11 @@ RecordingStream getRecordingStream() {
8487
return recordingStream;
8588
}
8689

90+
// Visible for testing
91+
CountDownLatch getStartUpLatch() {
92+
return startUpLatch;
93+
}
94+
8795
/** Stop recording JFR events. */
8896
@Override
8997
public void close() {

instrumentation/runtime-telemetry-jfr/library/src/test/java/io/opentelemetry/instrumentation/runtimetelemetryjfr/JfrExtension.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.opentelemetry.sdk.testing.assertj.MetricAssert;
1515
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
1616
import java.util.Collection;
17+
import java.util.concurrent.TimeUnit;
1718
import java.util.function.Consumer;
1819
import org.junit.jupiter.api.Assumptions;
1920
import org.junit.jupiter.api.extension.AfterEachCallback;
@@ -33,7 +34,7 @@ public JfrExtension(Consumer<JfrTelemetryBuilder> builderConsumer) {
3334
}
3435

3536
@Override
36-
public void beforeEach(ExtensionContext context) {
37+
public void beforeEach(ExtensionContext context) throws InterruptedException {
3738
try {
3839
Class.forName("jdk.jfr.consumer.RecordingStream");
3940
} catch (ClassNotFoundException exception) {
@@ -46,6 +47,7 @@ public void beforeEach(ExtensionContext context) {
4647
JfrTelemetryBuilder builder = JfrTelemetry.builder(sdk);
4748
builderConsumer.accept(builder);
4849
jfrTelemetry = builder.build();
50+
jfrTelemetry.getStartUpLatch().await(30, TimeUnit.SECONDS);
4951
}
5052

5153
@Override

instrumentation/runtime-telemetry-jfr/library/src/test/java/io/opentelemetry/instrumentation/runtimetelemetryjfr/PsGcMemoryMetricTest.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,23 +76,11 @@ private static void hasGcAttributes(MetricData data) {
7676
.anyMatch(p -> p.getAttributes().equals(ATTR_PS_OLD_GEN));
7777
}
7878

79-
private static void causeGc() {
80-
String s = "1234567890";
81-
try {
82-
while (true) {
83-
s = s + s;
84-
}
85-
} catch (OutOfMemoryError outOfMemoryError) {
86-
// ignore
87-
}
88-
}
89-
9079
@Test
9180
void shouldHaveGcDurationMetrics() {
9281
// TODO: Need a reliable way to test old and young gen GC in isolation.
9382
// Generate some JFR events
94-
// using System.gc() here doesn't reliably get us the GC events we need
95-
causeGc();
83+
System.gc();
9684

9785
Attributes minorGcAttributes =
9886
Attributes.of(ATTR_GC, "PS Scavenge", ATTR_ACTION, END_OF_MINOR_GC);

instrumentation/runtime-telemetry-jfr/library/src/test/java/io/opentelemetry/instrumentation/runtimetelemetryjfr/SerialGcMemoryMetricTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,9 @@ void shouldHaveMemoryMetrics() {
3030
}
3131

3232
@Test
33-
void shouldHaveGcDurationMetrics() throws InterruptedException {
33+
void shouldHaveGcDurationMetrics() {
3434
// TODO: Need a reliable way to test old and young gen GC in isolation.
3535
// Generate some JFR events
36-
Thread.sleep(100);
3736
System.gc();
3837
Attributes minorGcAttributes = Attributes.of(ATTR_GC, "Copy", ATTR_ACTION, END_OF_MINOR_GC);
3938
Attributes majorGcAttributes =

0 commit comments

Comments
 (0)