diff --git a/communication/src/main/java/datadog/communication/http/OkHttpUtils.java b/communication/src/main/java/datadog/communication/http/OkHttpUtils.java index e74561f7277..66639212986 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,6 +210,18 @@ 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()); } @@ -216,6 +229,73 @@ public static Request.Builder prepareRequest(final HttpUrl url, Map 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()); + } + } + + String jbossHome = System.getProperty("jboss.home.dir", "unknown"); + String jbossMode = System.getProperty("jboss.server.mode", "unknown"); + String jbossServerName = System.getProperty("jboss.server.name", "unknown"); + + StringBuilder customTags = new StringBuilder(); + if (!"unknown".equals(javaMainClass)) { + if (customTags.length() > 0) customTags.append(","); + customTags.append("java_main_class:").append(javaMainClass); + } + 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); + } + + System.out.println(customTags); + return customTags.toString(); + } + public static Request.Builder prepareRequest( final HttpUrl url, final Map headers, 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/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(); 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();