From dbabe9ad7f45a47b1fd9870c7c5e3641ce9e0ed4 Mon Sep 17 00:00:00 2001 From: Jordan Wong Date: Tue, 1 Apr 2025 10:31:47 -0400 Subject: [PATCH 1/3] first commit test add to dd_tags before send traces to agent --- .../datadog/communication/http/OkHttpUtils.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/communication/src/main/java/datadog/communication/http/OkHttpUtils.java b/communication/src/main/java/datadog/communication/http/OkHttpUtils.java index e74561f7277..e614edabe53 100644 --- a/communication/src/main/java/datadog/communication/http/OkHttpUtils.java +++ b/communication/src/main/java/datadog/communication/http/OkHttpUtils.java @@ -213,6 +213,20 @@ public static Request.Builder prepareRequest(final HttpUrl url, Map Date: Wed, 2 Apr 2025 13:06:26 -0400 Subject: [PATCH 2/3] add info to X-Datadog-Process-Tags --- .../communication/http/OkHttpUtils.java | 62 +++++++++++++++---- .../common/writer/ddagent/DDAgentApi.java | 2 + 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/communication/src/main/java/datadog/communication/http/OkHttpUtils.java b/communication/src/main/java/datadog/communication/http/OkHttpUtils.java index e614edabe53..ca41e982a28 100644 --- a/communication/src/main/java/datadog/communication/http/OkHttpUtils.java +++ b/communication/src/main/java/datadog/communication/http/OkHttpUtils.java @@ -13,6 +13,7 @@ import java.io.IOException; import java.net.InetSocketAddress; import java.net.Proxy; +import java.net.URL; import java.nio.ByteBuffer; import java.util.Collections; import java.util.List; @@ -209,23 +210,58 @@ public static Request.Builder prepareRequest(final HttpUrl url, Map e : headers.entrySet()) { - builder.addHeader(e.getKey(), e.getValue()); + String javaCommand = System.getProperty("sun.java.command", "unknown"); + String[] parts = javaCommand.split(" "); + String mainTarget = parts.length > 0 ? parts[0] : "unknown"; + System.out.println("javacommand is: " + javaCommand); + boolean isJar = mainTarget.endsWith(".jar"); + String javaMainClass = isJar ? "unknown" : mainTarget; + String javaJarFile = "unknown"; + String javaJarPath = "unknown"; + + if (isJar) { + javaJarFile = mainTarget; + try { + // Load it as a resource + URL jarUrl = new File(javaJarFile).toURI().toURL(); // Assumes relative path + File jarFile = new File(jarUrl.toURI()); + + if (jarFile.exists()) { + javaJarPath = jarFile.getAbsolutePath(); + } + } catch (Exception e) { + System.out.println("Unable to get JAR file: " + e.getMessage()); + } + } else { + try { + Class mainClass = Class.forName(javaMainClass); + javaJarPath = + mainClass.getProtectionDomain().getCodeSource().getLocation().toURI().getPath(); + } catch (Exception e) { + System.out.println("Unable to load main class or get JAR file: " + e.getMessage()); + } } - StringBuilder tags = new StringBuilder(); - if (System.getProperty("sun.java.command") != null) { - tags.append("java_main_class:").append(System.getProperty("sun.java.command")).append(","); + String jbossHome = System.getProperty("jboss.home.dir", "unknown"); + String jbossMode = System.getProperty("jboss.server.mode", "unknown"); + String jbossServerName = System.getProperty("jboss.server.name", "unknown"); + + String customTags = + String.format( + "JavaMainClass:%s,JavaJarFile:%s,JavaJarPath:%s,JbossHome:%s,JbossMode:%s,JbossServerName:%s", + javaMainClass, javaJarFile, javaJarPath, jbossHome, jbossMode, jbossServerName); + + String existingProcessTags = headers.getOrDefault("X-Datadog-Process-Tags", ""); + if (!existingProcessTags.isEmpty() && !existingProcessTags.endsWith(",")) { + existingProcessTags += ","; } + headers.put("X-Datadog-Process-Tags", existingProcessTags + customTags); + + System.out.println(customTags); - /* - String jarFile = OkHttpUtils.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath(); - if (jarFile != null) { - tags.append("java_jar_file:").append(jarFile).append(","); - tags.append("java_jar_path:").append(new File(jarFile).getParent()).append(","); - }*/ - System.out.println(tags.toString()); - System.setProperty("dd.tags", tags.toString()); + for (Map.Entry e : headers.entrySet()) { + builder.addHeader(e.getKey(), e.getValue()); + } return builder; } diff --git a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java index 645bbc4b9e9..1d17e81519b 100644 --- a/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java +++ b/dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java @@ -117,6 +117,8 @@ public Response sendSerializedTraces(final Payload payload) { : "") .put(payload.toRequest()) .build(); + System.out.println("HELLO REQUEST SENT IS THIS:"); + System.out.println(request.headers()); this.totalTraces += payload.traceCount(); this.receivedTraces += payload.traceCount(); try (final Recording recording = sendPayloadTimer.start(); From 4635bef682fc1f35f18919e06f8ccc25721e67a7 Mon Sep 17 00:00:00 2001 From: Jordan Wong Date: Fri, 4 Apr 2025 16:41:30 -0400 Subject: [PATCH 3/3] change tag names, add tags only if they are known, add feature flag for experimental tags --- .../communication/http/OkHttpUtils.java | 60 ++++++++++++++----- .../trace/api/config/GeneralConfig.java | 2 + .../main/java/datadog/trace/api/Config.java | 8 +++ 3 files changed, 55 insertions(+), 15 deletions(-) diff --git a/communication/src/main/java/datadog/communication/http/OkHttpUtils.java b/communication/src/main/java/datadog/communication/http/OkHttpUtils.java index ca41e982a28..66639212986 100644 --- a/communication/src/main/java/datadog/communication/http/OkHttpUtils.java +++ b/communication/src/main/java/datadog/communication/http/OkHttpUtils.java @@ -210,6 +210,26 @@ public static Request.Builder prepareRequest(final HttpUrl url, Map 0) { + headers.put("X-Datadog-Process-Tags", existingProcessTags + customTags); + } + } + + for (Map.Entry e : headers.entrySet()) { + builder.addHeader(e.getKey(), e.getValue()); + } + + return builder; + } + + private static String getCustomTags() { String javaCommand = System.getProperty("sun.java.command", "unknown"); String[] parts = javaCommand.split(" "); String mainTarget = parts.length > 0 ? parts[0] : "unknown"; @@ -246,24 +266,34 @@ public static Request.Builder prepareRequest(final HttpUrl url, Map 0) customTags.append(","); + customTags.append("java_main_class:").append(javaMainClass); } - headers.put("X-Datadog-Process-Tags", existingProcessTags + customTags); - - System.out.println(customTags); - - for (Map.Entry e : headers.entrySet()) { - builder.addHeader(e.getKey(), e.getValue()); + if (!"unknown".equals(javaJarFile)) { + if (customTags.length() > 0) customTags.append(","); + customTags.append("java_jar_file:").append(javaJarFile); + } + if (!"unknown".equals(javaJarPath)) { + if (customTags.length() > 0) customTags.append(","); + customTags.append("java_jar_path:").append(javaJarPath); + } + if (!"unknown".equals(jbossHome)) { + if (customTags.length() > 0) customTags.append(","); + customTags.append("jboss_home:").append(jbossHome); + } + if (!"unknown".equals(jbossMode)) { + if (customTags.length() > 0) customTags.append(","); + customTags.append("jboss_mode:").append(jbossMode); + } + if (!"unknown".equals(jbossServerName)) { + if (customTags.length() > 0) customTags.append(","); + customTags.append("jboss_server_name:").append(jbossServerName); } - return builder; + System.out.println(customTags); + return customTags.toString(); } public static Request.Builder prepareRequest( diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java index a882a097e59..7b8983fa624 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java @@ -95,6 +95,8 @@ public final class GeneralConfig { public static final String AGENTLESS_LOG_SUBMISSION_URL = "agentless.log.submission.url"; public static final String APM_TRACING_ENABLED = "apm.tracing.enabled"; public static final String JDK_SOCKET_ENABLED = "jdk.socket.enabled"; + public static final String EXPERIMENTAL_PROCESS_TAGS_ENABLED = + "experimental.process.tags.enabled"; private GeneralConfig() {} } diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index c2218e01ef7..b462d227128 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -570,6 +570,7 @@ public static String getHostName() { private final Set experimentalFeaturesEnabled; private final boolean jdkSocketEnabled; + private final boolean experimentalProcessTagsEnabled; // Read order: System Properties -> Env Variables, [-> properties file], [-> default value] private Config() { @@ -2011,6 +2012,9 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) this.jdkSocketEnabled = configProvider.getBoolean(JDK_SOCKET_ENABLED, true); + this.experimentalProcessTagsEnabled = + configProvider.getBoolean(EXPERIMENTAL_PROCESS_TAGS_ENABLED, false); + log.debug("New instance: {}", this); } @@ -3617,6 +3621,10 @@ public boolean isJdkSocketEnabled() { return jdkSocketEnabled; } + public boolean isExperimentalProcessTagsEnabled() { + return experimentalProcessTagsEnabled; + } + /** @return A map of tags to be applied only to the local application root span. */ public Map getLocalRootSpanTags() { final Map runtimeTags = getRuntimeTags();