Skip to content

Commit 808a798

Browse files
committed
refactor
1 parent 6a0bbf2 commit 808a798

8 files changed

Lines changed: 267 additions & 245 deletions

File tree

dd-java-agent/agent-tooling/build.gradle

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,17 @@ sourceSets {
2424
srcDirs = [file('src/test/java21')]
2525
}
2626
}
27-
register("test_java25") {
28-
java {
29-
srcDirs = [file('src/test/java25')]
30-
}
27+
named("main_java25") {
28+
compileClasspath += sourceSets.main.output
29+
runtimeClasspath += sourceSets.main.output
3130
}
3231
named("test") {
3332
compileClasspath += sourceSets.test_java11.output
3433
runtimeClasspath += sourceSets.test_java11.output
3534
compileClasspath += sourceSets.test_java21.output
3635
runtimeClasspath += sourceSets.test_java21.output
36+
compileClasspath += sourceSets.main_java25.output
37+
runtimeClasspath += sourceSets.main_java25.output
3738
}
3839
}
3940

@@ -47,10 +48,6 @@ configurations {
4748
named("test_java11Implementation") {
4849
extendsFrom testImplementation
4950
}
50-
51-
named("test_java25Implementation") {
52-
extendsFrom testImplementation
53-
}
5451
}
5552

5653

@@ -76,8 +73,6 @@ dependencies {
7673
testImplementation libs.bytebuddy
7774
testImplementation group: 'com.google.guava', name: 'guava-testlib', version: '20.0'
7875

79-
test_java25Implementation libs.bundles.junit5
80-
test_java25Implementation sourceSets.main_java25.output
8176

8277
jmhImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.3.5.RELEASE'
8378
}
@@ -133,30 +128,6 @@ tasks.named("compileTest_java21Java") {
133128
)
134129
}
135130

136-
tasks.named("compileTest_java25Java") {
137-
configureCompiler(
138-
it,
139-
25,
140-
JavaVersion.VERSION_1_8,
141-
"Java 25 test sourceset, compiled with Java 25 but targeting Java 8 bytecode."
142-
)
143-
}
144-
145-
tasks.register("test_java25", Test) {
146-
description = "Runs tests from test_java25 sourceset that require Java 25+"
147-
group = "verification"
148-
testClassesDirs = sourceSets.test_java25.output.classesDirs
149-
classpath = sourceSets.test_java25.runtimeClasspath
150-
useJUnitPlatform()
151-
testJvmConstraints {
152-
minJavaVersion = JavaVersion.VERSION_25
153-
}
154-
}
155-
156-
tasks.named("test") {
157-
dependsOn(tasks.named("test_java25"))
158-
}
159-
160131
tasks.named("jmh") {
161132
dependsOn(tasks.named("compileTestJava"))
162133
outputs.upToDateWhen { false }

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package datadog.trace.agent.tooling;
22

33
import datadog.communication.ddagent.SharedCommunicationObjects;
4-
import datadog.environment.JavaVirtualMachine;
54
import datadog.environment.OperatingSystem;
65
import datadog.trace.api.Config;
76
import datadog.trace.api.GlobalTracer;
@@ -10,9 +9,9 @@
109
import datadog.trace.bootstrap.instrumentation.api.ProfilingContextIntegration;
1110
import datadog.trace.core.CoreTracer;
1211
import datadog.trace.core.servicediscovery.ForeignMemoryWriter;
12+
import datadog.trace.core.servicediscovery.ForeignMemoryWriterFactory;
1313
import datadog.trace.core.servicediscovery.ServiceDiscovery;
1414
import datadog.trace.core.servicediscovery.ServiceDiscoveryFactory;
15-
import de.thetaphi.forbiddenapis.SuppressForbidden;
1615
import org.slf4j.Logger;
1716
import org.slf4j.LoggerFactory;
1817

@@ -58,25 +57,12 @@ private static ServiceDiscoveryFactory serviceDiscoveryFactory() {
5857
return TracerInstaller::initServiceDiscovery;
5958
}
6059

61-
@SuppressForbidden // intentional use of Class.forName
6260
private static ServiceDiscovery initServiceDiscovery() {
63-
try {
64-
// use reflection to load MemFDUnixWriter so it doesn't get picked up when we
65-
// transitively look for all tracer class dependencies to install in GraalVM via
66-
// VMRuntimeInstrumentation
67-
final Class<?> memFdClass;
68-
if (JavaVirtualMachine.isJavaVersionAtLeast(25)) {
69-
memFdClass =
70-
Class.forName("datadog.trace.agent.tooling.servicediscovery.ForeignMemoryWriterImpl");
71-
} else {
72-
memFdClass = Class.forName("datadog.trace.agent.tooling.servicediscovery.MemFDUnixWriter");
73-
}
74-
ForeignMemoryWriter memFd = (ForeignMemoryWriter) memFdClass.getConstructor().newInstance();
75-
return new ServiceDiscovery(memFd);
76-
} catch (Throwable e) {
77-
log.debug("service discovery not supported", e);
78-
return null;
61+
final ForeignMemoryWriter writer = new ForeignMemoryWriterFactory().get();
62+
if (writer != null) {
63+
return new ServiceDiscovery(writer);
7964
}
65+
return null;
8066
}
8167

8268
public static void installGlobalTracer(final CoreTracer tracer) {

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,23 @@
22

33
import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY;
44

5-
import com.sun.jna.Library;
6-
import com.sun.jna.Memory;
75
import com.sun.jna.Native;
8-
import com.sun.jna.NativeLong;
9-
import com.sun.jna.Pointer;
106
import datadog.environment.OperatingSystem;
7+
import datadog.environment.SystemProperties;
118
import datadog.trace.core.servicediscovery.ForeignMemoryWriter;
129
import org.slf4j.Logger;
1310
import org.slf4j.LoggerFactory;
1411

15-
public class MemFDUnixWriter implements ForeignMemoryWriter {
12+
abstract class MemFDUnixWriter implements ForeignMemoryWriter {
1613
private static final Logger log = LoggerFactory.getLogger(MemFDUnixWriter.class);
1714

18-
private interface LibC extends Library {
19-
int syscall(int number, Object... args);
15+
protected abstract long syscall(long number, String name, int flags);
2016

21-
NativeLong write(int fd, Pointer buf, NativeLong count);
17+
protected abstract long write(int fd, byte[] payload);
2218

23-
int fcntl(int fd, int cmd, int arg);
24-
}
19+
protected abstract int fcntl(int fd, int cmd, int arg);
20+
21+
protected abstract int getLastError();
2522

2623
// https://elixir.bootlin.com/linux/v6.17.1/source/include/uapi/linux/memfd.h#L8-L9
2724
private static final int MFD_CLOEXEC = 0x0001;
@@ -36,36 +33,33 @@ private interface LibC extends Library {
3633
private static final int F_SEAL_GROW = 0x0004;
3734

3835
@Override
39-
public void write(String fileName, byte[] payload) {
40-
final LibC libc = Native.load("c", LibC.class);
41-
36+
public final void write(String fileName, byte[] payload) {
4237
OperatingSystem.Architecture arch = OperatingSystem.architecture();
4338
int memfdSyscall = getMemfdSyscall(arch);
4439
if (memfdSyscall <= 0) {
45-
log.debug(SEND_TELEMETRY, "service discovery not supported for arch={}", arch);
40+
log.debug(
41+
SEND_TELEMETRY,
42+
"service discovery not supported for arch={}",
43+
SystemProperties.get("os.arch"));
4644
return;
4745
}
48-
int memFd = libc.syscall(memfdSyscall, fileName, MFD_CLOEXEC | MFD_ALLOW_SEALING);
46+
int memFd = (int) syscall(memfdSyscall, fileName, MFD_CLOEXEC | MFD_ALLOW_SEALING);
4947
if (memFd < 0) {
50-
log.warn("{} memfd create failed, errno={}", fileName, Native.getLastError());
48+
log.warn("{} memfd create failed, errno={}", fileName, getLastError());
5149
return;
5250
}
5351

5452
log.debug("{} memfd created (fd={})", fileName, memFd);
5553

56-
Memory buf = new Memory(payload.length);
57-
buf.write(0, payload, 0, payload.length);
58-
59-
NativeLong written = libc.write(memFd, buf, new NativeLong(payload.length));
60-
if (written.longValue() != payload.length) {
54+
long written = write(memFd, payload);
55+
if (written != payload.length) {
6156
log.warn("write to {} memfd failed errno={}", fileName, Native.getLastError());
6257
return;
6358
}
64-
log.debug("wrote {} bytes to memfd {}", written.longValue(), memFd);
65-
int returnCode = libc.fcntl(memFd, F_ADD_SEALS, F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_SEAL);
59+
log.debug("wrote {} bytes to memfd {}", written, memFd);
60+
int returnCode = fcntl(memFd, F_ADD_SEALS, F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_SEAL);
6661
if (returnCode == -1) {
6762
log.warn("failed to add seal to {} memfd errno={}", fileName, Native.getLastError());
68-
return;
6963
}
7064
// memfd is not closed to keep it readable for the lifetime of the process.
7165
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package datadog.trace.agent.tooling.servicediscovery;
2+
3+
import com.sun.jna.Library;
4+
import com.sun.jna.Memory;
5+
import com.sun.jna.Native;
6+
import com.sun.jna.NativeLong;
7+
import com.sun.jna.Pointer;
8+
9+
public final class MemFDUnixWriterJNA extends MemFDUnixWriter {
10+
private final LibC libc = Native.load("c", LibC.class);
11+
12+
private interface LibC extends Library {
13+
long syscall(long number, Object... args);
14+
15+
NativeLong write(int fd, Pointer buf, NativeLong count);
16+
17+
int fcntl(int fd, int cmd, int arg);
18+
}
19+
20+
@Override
21+
protected long syscall(long number, String name, int flags) {
22+
return libc.syscall(number, name, flags);
23+
}
24+
25+
@Override
26+
protected long write(int fd, byte[] payload) {
27+
Memory buf = new Memory(payload.length);
28+
buf.write(0, payload, 0, payload.length);
29+
return libc.write(fd, buf, new NativeLong(payload.length)).longValue();
30+
}
31+
32+
@Override
33+
protected int fcntl(int fd, int cmd, int arg) {
34+
return libc.fcntl(fd, cmd, arg);
35+
}
36+
37+
@Override
38+
protected int getLastError() {
39+
return Native.getLastError();
40+
}
41+
}

0 commit comments

Comments
 (0)