From 873e9dff1d6fa70c84642000700fd1c7380d1a8f Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Wed, 7 Jan 2026 14:28:06 +0100 Subject: [PATCH 1/2] Mute JNA initialisation when creating ForeignMemoryWriters --- .../src/main/java/datadog/trace/core/CoreTracer.java | 5 +---- .../core/servicediscovery/ForeignMemoryWriterFactory.java | 7 ++++++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index f434fe820b9..e3c1f585a26 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -919,10 +919,7 @@ private CoreTracer( () -> { final ServiceDiscovery serviceDiscovery = serviceDiscoveryFactory.get(); if (serviceDiscovery != null) { - // JNA can do ldconfig and other commands. Those are hidden since internal. - try (final TraceScope blackhole = muteTracing()) { - serviceDiscovery.writeTracerMetadata(config); - } + serviceDiscovery.writeTracerMetadata(config); } }, 1, diff --git a/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriterFactory.java b/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriterFactory.java index 6a8ace43b2e..c9d0a2d963a 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriterFactory.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriterFactory.java @@ -5,6 +5,9 @@ import datadog.environment.JavaVirtualMachine; import datadog.environment.OperatingSystem; import datadog.environment.SystemProperties; +import datadog.trace.api.GlobalTracer; +import datadog.trace.api.Tracer; +import datadog.trace.context.TraceScope; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.util.function.Supplier; import org.slf4j.Logger; @@ -25,7 +28,9 @@ public ForeignMemoryWriter get() { @SuppressForbidden // intentional Class.forName to force loading private ForeignMemoryWriter createForLinux() { - try { + final Tracer tracer = GlobalTracer.get(); + // JNA initialisation can do ldconfig and other commands. Those are hidden since internal. + try (TraceScope closeme = tracer != null ? tracer.muteTracing() : null) { // first check if the arch is supported if (OperatingSystem.architecture() == OperatingSystem.Architecture.UNKNOWN) { log.debug( From fb3fbd761186a0f54bc97fd446a0aa3de5bc69a9 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Wed, 7 Jan 2026 14:42:51 +0100 Subject: [PATCH 2/2] move the blackhole closer to the init --- .../servicediscovery/MemFDUnixWriterJNA.java | 13 ++++++++++++- .../ForeignMemoryWriterFactory.java | 7 +------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterJNA.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterJNA.java index 6743a39bc08..33eaec534fe 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterJNA.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriterJNA.java @@ -5,9 +5,12 @@ import com.sun.jna.Native; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; +import datadog.trace.api.GlobalTracer; +import datadog.trace.api.Tracer; +import datadog.trace.context.TraceScope; public final class MemFDUnixWriterJNA extends MemFDUnixWriter { - private final LibC libc = Native.load("c", LibC.class); + private final LibC libc; private interface LibC extends Library { long syscall(long number, Object... args); @@ -17,6 +20,14 @@ private interface LibC extends Library { int fcntl(int fd, int cmd, int arg); } + public MemFDUnixWriterJNA() { + final Tracer tracer = GlobalTracer.get(); + // JNA initialisation can do ldconfig and other commands. Those are hidden since internal. + try (TraceScope closeme = tracer != null ? tracer.muteTracing() : null) { + libc = Native.load("c", LibC.class); + } + } + @Override protected long syscall(long number, String name, int flags) { return libc.syscall(number, name, flags); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriterFactory.java b/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriterFactory.java index c9d0a2d963a..6a8ace43b2e 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriterFactory.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriterFactory.java @@ -5,9 +5,6 @@ import datadog.environment.JavaVirtualMachine; import datadog.environment.OperatingSystem; import datadog.environment.SystemProperties; -import datadog.trace.api.GlobalTracer; -import datadog.trace.api.Tracer; -import datadog.trace.context.TraceScope; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.util.function.Supplier; import org.slf4j.Logger; @@ -28,9 +25,7 @@ public ForeignMemoryWriter get() { @SuppressForbidden // intentional Class.forName to force loading private ForeignMemoryWriter createForLinux() { - final Tracer tracer = GlobalTracer.get(); - // JNA initialisation can do ldconfig and other commands. Those are hidden since internal. - try (TraceScope closeme = tracer != null ? tracer.muteTracing() : null) { + try { // first check if the arch is supported if (OperatingSystem.architecture() == OperatingSystem.Architecture.UNKNOWN) { log.debug(