diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java index feeed4ea386..480c8fbd79c 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/servicediscovery/MemFDUnixWriter.java @@ -33,29 +33,29 @@ private interface LibC extends Library { private static final int F_SEAL_GROW = 0x0004; @Override - public void write(byte[] payload) { + public void write(String fileName, byte[] payload) { final LibC libc = Native.load("c", LibC.class); - int memFd = libc.memfd_create("datadog-tracer-info-", MFD_CLOEXEC | MFD_ALLOW_SEALING); + int memFd = libc.memfd_create(fileName, MFD_CLOEXEC | MFD_ALLOW_SEALING); if (memFd < 0) { - log.warn("datadog-tracer-info memfd create failed, errno={}", Native.getLastError()); + log.warn("{} memfd create failed, errno={}", fileName, Native.getLastError()); return; } - log.debug("datadog-tracer-info memfd created (fd={})", memFd); + log.debug("{} memfd created (fd={})", fileName, memFd); Memory buf = new Memory(payload.length); buf.write(0, payload, 0, payload.length); NativeLong written = libc.write(memFd, buf, new NativeLong(payload.length)); if (written.longValue() != payload.length) { - log.warn("write to datadog-tracer-info memfd failed errno={}", Native.getLastError()); + log.warn("write to {} memfd failed errno={}", fileName, Native.getLastError()); return; } log.debug("wrote {} bytes to memfd {}", written.longValue(), memFd); int returnCode = libc.fcntl(memFd, F_ADD_SEALS, F_SEAL_SHRINK | F_SEAL_GROW | F_SEAL_SEAL); if (returnCode == -1) { - log.warn("failed to add seal to datadog-tracer-info memfd errno={}", Native.getLastError()); + log.warn("failed to add seal to {} memfd errno={}", fileName, Native.getLastError()); return; } // memfd is not closed to keep it readable for the lifetime of the process. diff --git a/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriter.java b/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriter.java index 34ef2c06b1d..a74ba71bde8 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriter.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ForeignMemoryWriter.java @@ -2,5 +2,5 @@ @FunctionalInterface public interface ForeignMemoryWriter { - void write(byte[] payload); + void write(String fileName, byte[] payload); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ServiceDiscovery.java b/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ServiceDiscovery.java index 5ebc74b298c..0af1e8fd020 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ServiceDiscovery.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ServiceDiscovery.java @@ -9,6 +9,7 @@ import datadog.trace.api.Config; import datadog.trace.api.ProcessTags; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; +import datadog.trace.util.RandomUtils; import java.nio.ByteBuffer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,12 +36,17 @@ public void writeTracerMetadata(Config config) { ProcessTags.getTagsForSerialization(), ContainerInfo.get().getContainerId()); - foreignMemoryWriter.write(payload); + foreignMemoryWriter.write(generateFileName(), payload); } catch (Throwable t) { log.debug("service discovery memfd write failed", t); } } + private static String generateFileName() { + String suffix = RandomUtils.randomUUID().toString().substring(0, 8); + return "datadog-tracer-info-" + suffix; + } + static byte[] encodePayload( String tracerVersion, String hostname, diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/servicediscovery/ServiceDiscoveryTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/servicediscovery/ServiceDiscoveryTest.groovy index a25d4b2641a..adf421a1c07 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/servicediscovery/ServiceDiscoveryTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/servicediscovery/ServiceDiscoveryTest.groovy @@ -44,4 +44,12 @@ class ServiceDiscoveryTest extends DDCoreSpecification { and: map.toString() == '{"schema_version":2,"tracer_language":"java","tracer_version":"1.2.3","hostname":"my_host"}' } + def "generateFileName"() { + when: + String name = ServiceDiscovery.generateFileName() + + then: + name.startsWith("datadog-tracer-info-") + name.length() == "datadog-tracer-info-".length() + 8 + } }