Skip to content

Commit 0979b99

Browse files
committed
Adjust JFR checks for J9
1 parent e0242cf commit 0979b99

File tree

6 files changed

+22
-11
lines changed

6 files changed

+22
-11
lines changed

dd-java-agent/agent-profiling/profiling-uploader/src/main/java/com/datadog/profiling/uploader/util/JfrCliHelper.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static datadog.trace.util.AgentThreadFactory.AgentThread.PROFILER_HTTP_DISPATCHER;
44

5+
import datadog.trace.api.Platform;
56
import datadog.trace.api.profiling.RecordingData;
67
import datadog.trace.relocate.api.IOLogger;
78
import datadog.trace.util.AgentThreadFactory;
@@ -44,7 +45,7 @@ public static void invokeOn(final RecordingData data, final IOLogger ioLogger) {
4445
File tmp = null;
4546
try {
4647
Path jfr = Paths.get(System.getProperty("java.home"), "bin", "jfr");
47-
if (!Files.exists(jfr)) {
48+
if (Platform.isJ9() || !Files.exists(jfr)) {
4849
ioLogger.error("Failed to gather information on recording, can't find `jfr`");
4950
return;
5051
}

dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/ProfileUploaderTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import datadog.common.version.VersionInfo;
4343
import datadog.trace.api.Config;
4444
import datadog.trace.api.DDTags;
45+
import datadog.trace.api.Platform;
4546
import datadog.trace.api.profiling.ProfilingSnapshot;
4647
import datadog.trace.api.profiling.RecordingData;
4748
import datadog.trace.api.profiling.RecordingInputStream;
@@ -561,7 +562,10 @@ public void test413Response() throws Exception {
561562

562563
verify(recording).release();
563564

564-
if (Files.exists(Paths.get(System.getProperty("java.home"), "bin", "jfr"))) {
565+
// J9 has 'almost' implemented JFR, but not really
566+
// we need to skip this part for J9
567+
if (!Platform.isJ9()
568+
&& Files.exists(Paths.get(System.getProperty("java.home"), "bin", "jfr"))) {
565569
verify(ioLogger)
566570
.error(
567571
eq("Failed to upload profile, it's too big. Dumping information about the profile"));

dd-java-agent/agent-profiling/profiling-uploader/src/test/java/com/datadog/profiling/uploader/util/JfrCliHelperTest.java

+5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static org.mockito.Mockito.when;
1010
import static org.mockito.Mockito.withSettings;
1111

12+
import datadog.trace.api.Platform;
1213
import datadog.trace.api.profiling.RecordingData;
1314
import datadog.trace.api.profiling.RecordingInputStream;
1415
import datadog.trace.relocate.api.IOLogger;
@@ -24,6 +25,7 @@
2425
import java.util.Set;
2526
import java.util.zip.GZIPOutputStream;
2627
import org.apache.commons.io.IOUtils;
28+
import org.junit.jupiter.api.Assumptions;
2729
import org.junit.jupiter.api.Test;
2830
import org.junit.jupiter.api.extension.ExtendWith;
2931
import org.mockito.Mock;
@@ -44,6 +46,9 @@ public class JfrCliHelperTest {
4446

4547
@Test
4648
public void testInvokeOn() throws Exception {
49+
// J9 may have 'jfr' command present but it requires additional setup
50+
// Currently we don't support J9 JFR so we can safely skip this test
51+
Assumptions.assumeFalse(Platform.isJ9());
4752
final RecordingData recording = mockRecordingData();
4853

4954
JfrCliHelper.invokeOn(recording, ioLogger);

dd-java-agent/agent-profiling/src/main/java/com/datadog/profiling/agent/CompositeController.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,11 @@ public static Controller build(ConfigProvider provider, ControllerContext contex
153153
}
154154
if (!isOracleJDK8) {
155155
try {
156-
Class.forName("jdk.jfr.Event");
157-
controllers.add(OpenJdkController.instance(provider));
156+
if (Platform.hasJfr()) {
157+
controllers.add(OpenJdkController.instance(provider));
158+
} else {
159+
log.debug("JFR is not available on this platform");
160+
}
158161
} catch (Throwable ignored) {
159162
log.debug("Failed to load openjdk profiler", ignored);
160163
}

dd-java-agent/testing/src/test/groovy/AgentTestRunnerTest.groovy

+2-6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import datadog.trace.agent.test.AgentTestRunner
33
import datadog.trace.agent.test.SpockRunner
44
import datadog.trace.agent.test.utils.ClasspathUtils
55
import datadog.trace.api.GlobalTracer
6+
import datadog.trace.api.Platform
67
import datadog.trace.bootstrap.Constants
78
import datadog.trace.bootstrap.instrumentation.api.AgentScope
89
import datadog.trace.bootstrap.instrumentation.api.AgentSpan
@@ -180,11 +181,6 @@ class AgentTestRunnerTest extends AgentTestRunner {
180181
}
181182

182183
boolean isJFRSupported() {
183-
try {
184-
Class.forName("jdk.jfr.Recording")
185-
return true
186-
} catch (Throwable e) {
187-
return false
188-
}
184+
return Platform.hasJfr()
189185
}
190186
}

internal-api/src/main/java/datadog/trace/api/Platform.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ private static boolean checkForJfr() {
4141
* enhanced.
4242
* Need this custom check because ClassLoaderMatchers.hasClassNamed() does not support bootstrap class loader yet.
4343
* Note: the downside of this is that we load some JFR classes at startup.
44+
* Note: as of version 0.49.0 of J9 the JVM contains JFR classes, but it is not fully functional
4445
*/
45-
return ClassLoader.getSystemClassLoader().getResource("jdk/jfr/Event.class") != null;
46+
return !isJ9()
47+
&& ClassLoader.getSystemClassLoader().getResource("jdk/jfr/Event.class") != null;
4648
} catch (Throwable e) {
4749
return false;
4850
}

0 commit comments

Comments
 (0)