From 76b41064309327bad4caf23f2131eaf87e3d0480 Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Fri, 14 Mar 2025 14:00:13 -0700 Subject: [PATCH 01/15] Add JMXFetch to TracerInstaller for GraalVM Native Error: Discovered unresolved method during parsing: org.datadog.jmxfetch.App.(org.datadog.jmxfetch.AppConfig). --- .../src/main/java/datadog/trace/bootstrap/Agent.java | 9 ++++----- dd-java-agent/agent-tooling/build.gradle | 1 + .../datadog/trace/agent/tooling/TracerInstaller.java | 6 ++++++ .../nativeimage/ResourcesFeatureInstrumentation.java | 4 +++- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index 69156ff9393..63f667c1f25 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -178,12 +178,11 @@ public static void start( createAgentClassloader(agentJarURL); if (Platform.isNativeImageBuilder()) { - // these default services are not used during native-image builds - jmxFetchEnabled = false; - remoteConfigEnabled = false; - telemetryEnabled = false; - // apply trace instrumentation, but skip starting other services + // apply trace instrumentation at native-image build time startDatadogAgent(initTelemetry, inst); + // TODO: are we sure we want measure native-image build instrumentation? + // This is very different, happens at build time and doesn't include any service + // initialization time. StaticEventLogger.end("Agent.start"); return; diff --git a/dd-java-agent/agent-tooling/build.gradle b/dd-java-agent/agent-tooling/build.gradle index 5c488c9d1fa..19c2e16bba3 100644 --- a/dd-java-agent/agent-tooling/build.gradle +++ b/dd-java-agent/agent-tooling/build.gradle @@ -41,6 +41,7 @@ dependencies { api(project(':dd-java-agent:agent-bootstrap')) { exclude group: 'com.datadoghq', module: 'agent-logging' } + compileOnly project(':dd-java-agent:agent-jmxfetch') compileOnly project(':dd-java-agent:agent-profiling') api group: 'com.blogspot.mydailyjava', name: 'weak-lock-free', version: '0.17' api libs.bytebuddy diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java index 6bd27c31bb1..14cd8acf4ee 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java @@ -1,8 +1,11 @@ package datadog.trace.agent.tooling; import datadog.communication.ddagent.SharedCommunicationObjects; +import datadog.communication.monitor.DDAgentStatsDClientManager; +import datadog.trace.agent.jmxfetch.JMXFetch; import datadog.trace.api.Config; import datadog.trace.api.GlobalTracer; +import datadog.trace.api.StatsDClientManager; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.ProfilingContextIntegration; import datadog.trace.core.CoreTracer; @@ -25,6 +28,9 @@ public static synchronized void installGlobalTracer( .pollForTracingConfiguration() .build(); installGlobalTracer(tracer); + + StatsDClientManager statsDClientManager = DDAgentStatsDClientManager.statsDClientManager(); + JMXFetch.run(statsDClientManager); } else { log.debug("GlobalTracer already registered."); } diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java index 8b195962e59..a69fed9db6b 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java @@ -43,7 +43,9 @@ public static void onExit() { "profiling/jfr/dd.jfp", "profiling/jfr/safepoints.jfp", "profiling/jfr/overrides/comprehensive.jfp", - "profiling/jfr/overrides/minimal.jfp" + "profiling/jfr/overrides/minimal.jfp", + "metrics/project.properties" // JMXFetch version file needed for + // org.datadog.jmxfetch.AppConfig }; for (String original : tracerResources) { From e3c10065fc948ae8bed90a15738c09cf2df85490 Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Fri, 4 Apr 2025 22:53:56 -0700 Subject: [PATCH 02/15] Fix "Discovered unresolved method during parsing: org.datadog.jmxfetch.App.(org.datadog.jmxfetch.AppConfig)." --- ...nSubstitutionProcessorInstrumentation.java | 8 +++++-- .../Target_org_datadog_jmxfetch_App.java | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_App.java diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java index 616c2bb6e61..5af4a4e5757 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java @@ -37,7 +37,9 @@ public void methodAdvice(MethodTransformer transformer) { public String[] helperClassNames() { return new String[] { packageName + ".Target_datadog_jctools_counters_FixedSizeStripedLongCounterFields", - packageName + ".Target_datadog_jctools_util_UnsafeRefArrayAccess" + packageName + ".Target_datadog_jctools_util_UnsafeRefArrayAccess", + packageName + ".Target_org_datadog_jmxfetch_App", + "com.fasterxml.jackson.core.JsonProcessingException" // referenced by jmxfetch.App }; } @@ -49,7 +51,8 @@ public String[] muzzleIgnoredClassNames() { "jdk.vm.ci.meta.ResolvedJavaField", // ignore helper class names as usual packageName + ".Target_datadog_jctools_counters_FixedSizeStripedLongCounterFields", - packageName + ".Target_datadog_jctools_util_UnsafeRefArrayAccess" + packageName + ".Target_datadog_jctools_util_UnsafeRefArrayAccess", + packageName + ".Target_org_datadog_jmxfetch_App" }; } @@ -58,6 +61,7 @@ public static class FindTargetClassesAdvice { public static void onExit(@Advice.Return(readOnly = false) List> result) { result.add(Target_datadog_jctools_counters_FixedSizeStripedLongCounterFields.class); result.add(Target_datadog_jctools_util_UnsafeRefArrayAccess.class); + result.add(Target_org_datadog_jmxfetch_App.class); } } } diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_App.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_App.java new file mode 100644 index 00000000000..44df2fcfa74 --- /dev/null +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_App.java @@ -0,0 +1,21 @@ +package datadog.trace.instrumentation.graal.nativeimage; + +import com.oracle.svm.core.annotate.Substitute; +import com.oracle.svm.core.annotate.TargetClass; + +@TargetClass(className = "org.datadog.jmxfetch.App") +public final class Target_org_datadog_jmxfetch_App { + @Substitute + private boolean getJsonConfigs() { + // Replace org.datadog.jmxfetch.App.getJsonConfigs to fix the GraalVM native build error. + // + // This method has references to the excluded transitive dependencies: + // - jackson-core (catch JsonProcessingException) + // - jackson-jr-objects (referenced in org.datadog.jmxfetch.JsonParser). + // GraalVM Native detects it during the reachability analysis and results in + // "Discovered unresolved method during parsing: + // org.datadog.jmxfetch.App.(org.datadog.jmxfetch.AppConfig)." + // because of the missing classes that belong to the excluded dependencies. + return false; + } +} From fe07e3faa1c8fbe4fb850703554f5be096e37292 Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Mon, 7 Apr 2025 11:44:55 -0700 Subject: [PATCH 03/15] Replace org.datadog.jmxfetch.Status.generateJson to fix the GraalVM native build error. --- ...nSubstitutionProcessorInstrumentation.java | 7 +++++-- .../Target_org_datadog_jmxfetch_Status.java | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_Status.java diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java index 5af4a4e5757..c352ba6b200 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java @@ -39,7 +39,8 @@ public String[] helperClassNames() { packageName + ".Target_datadog_jctools_counters_FixedSizeStripedLongCounterFields", packageName + ".Target_datadog_jctools_util_UnsafeRefArrayAccess", packageName + ".Target_org_datadog_jmxfetch_App", - "com.fasterxml.jackson.core.JsonProcessingException" // referenced by jmxfetch.App + "com.fasterxml.jackson.core.JsonProcessingException", // referenced by jmxfetch.App + packageName + ".Target_org_datadog_jmxfetch_Status", }; } @@ -52,7 +53,8 @@ public String[] muzzleIgnoredClassNames() { // ignore helper class names as usual packageName + ".Target_datadog_jctools_counters_FixedSizeStripedLongCounterFields", packageName + ".Target_datadog_jctools_util_UnsafeRefArrayAccess", - packageName + ".Target_org_datadog_jmxfetch_App" + packageName + ".Target_org_datadog_jmxfetch_App", + packageName + ".Target_org_datadog_jmxfetch_Status", }; } @@ -62,6 +64,7 @@ public static void onExit(@Advice.Return(readOnly = false) List> result result.add(Target_datadog_jctools_counters_FixedSizeStripedLongCounterFields.class); result.add(Target_datadog_jctools_util_UnsafeRefArrayAccess.class); result.add(Target_org_datadog_jmxfetch_App.class); + result.add(Target_org_datadog_jmxfetch_Status.class); } } } diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_Status.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_Status.java new file mode 100644 index 00000000000..1064b600e0f --- /dev/null +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_Status.java @@ -0,0 +1,19 @@ +package datadog.trace.instrumentation.graal.nativeimage; + +import com.oracle.svm.core.annotate.Substitute; +import com.oracle.svm.core.annotate.TargetClass; +import java.io.IOException; + +@TargetClass(className = "org.datadog.jmxfetch.Status") +public final class Target_org_datadog_jmxfetch_Status { + @Substitute + private String generateJson() throws IOException { + // Replace org.datadog.jmxfetch.Status.generateJson to fix the GraalVM native build error. + // + // This method has a reference to the excluded transitive dependency jackson-jr-objects. + // GraalVM Native detects it during the reachability analysis and results in + // "Discovered unresolved type during parsing: com.fasterxml.jackson.jr.ob.JSON." + // because of the missing classes that belong to the excluded dependencies. + return ""; + } +} From 0731f76f95ba9eb7978685944127efe5c5687f16 Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Mon, 7 Apr 2025 13:07:17 -0700 Subject: [PATCH 04/15] Replace org.datadog.jmxfetch.reporter.JsonReporter.doSendServiceCheck to fix the GraalVM native build error. --- ...nSubstitutionProcessorInstrumentation.java | 3 +++ ...atadog_jmxfetch_reporter_JsonReporter.java | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_reporter_JsonReporter.java diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java index c352ba6b200..575eebf9809 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java @@ -41,6 +41,7 @@ public String[] helperClassNames() { packageName + ".Target_org_datadog_jmxfetch_App", "com.fasterxml.jackson.core.JsonProcessingException", // referenced by jmxfetch.App packageName + ".Target_org_datadog_jmxfetch_Status", + packageName + ".Target_org_datadog_jmxfetch_reporter_JsonReporter", }; } @@ -55,6 +56,7 @@ public String[] muzzleIgnoredClassNames() { packageName + ".Target_datadog_jctools_util_UnsafeRefArrayAccess", packageName + ".Target_org_datadog_jmxfetch_App", packageName + ".Target_org_datadog_jmxfetch_Status", + packageName + ".Target_org_datadog_jmxfetch_reporter_JsonReporter", }; } @@ -65,6 +67,7 @@ public static void onExit(@Advice.Return(readOnly = false) List> result result.add(Target_datadog_jctools_util_UnsafeRefArrayAccess.class); result.add(Target_org_datadog_jmxfetch_App.class); result.add(Target_org_datadog_jmxfetch_Status.class); + result.add(Target_org_datadog_jmxfetch_reporter_JsonReporter.class); } } } diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_reporter_JsonReporter.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_reporter_JsonReporter.java new file mode 100644 index 00000000000..6848c53e88a --- /dev/null +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_reporter_JsonReporter.java @@ -0,0 +1,19 @@ +package datadog.trace.instrumentation.graal.nativeimage; + +import com.oracle.svm.core.annotate.Substitute; +import com.oracle.svm.core.annotate.TargetClass; + +@TargetClass(className = "org.datadog.jmxfetch.reporter.JsonReporter") +public final class Target_org_datadog_jmxfetch_reporter_JsonReporter { + @Substitute + public void doSendServiceCheck( + String serviceCheckName, String status, String message, String[] tags) { + // Replace org.datadog.jmxfetch.reporter.JsonReporter.doSendServiceCheck to fix the GraalVM + // native build error. + // + // This method has a reference to the excluded transitive dependency jackson-jr-objects. + // GraalVM Native detects it during the reachability analysis and results in + // "Discovered unresolved type during parsing: com.fasterxml.jackson.jr.ob.JSON." + // because of the missing classes that belong to the excluded dependencies. + } +} From 648a939327bf6ebae3cbdfb8b7a326db94c5d9c4 Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Mon, 7 Apr 2025 15:07:03 -0700 Subject: [PATCH 05/15] Add jmxfetch config resources needed at runtime. --- .../nativeimage/ResourcesFeatureInstrumentation.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java index a69fed9db6b..38f2bf32a22 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java @@ -44,8 +44,14 @@ public static void onExit() { "profiling/jfr/safepoints.jfp", "profiling/jfr/overrides/comprehensive.jfp", "profiling/jfr/overrides/minimal.jfp", - "metrics/project.properties" // JMXFetch version file needed for - // org.datadog.jmxfetch.AppConfig + // jmxfetch configs + "metrics/project.properties", // org.datadog.jmxfetch.AppConfig reads its version + "metrics/org/datadog/jmxfetch/default-jmx-metrics.yaml", + "metrics/org/datadog/jmxfetch/new-gc-default-jmx-metrics.yaml", + "metrics/org/datadog/jmxfetch/old-gc-default-jmx-metrics.yaml", + // tracer's jmxfetch configs + "metrics/jmxfetch-config.yaml", + "metrics/jmxfetch-websphere-config.yaml", }; for (String original : tracerResources) { From 8ff595174542d73e7eca689d0a718cece1f513d2 Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Tue, 15 Apr 2025 12:56:12 -0700 Subject: [PATCH 06/15] Move JMXFetch.run to TracerActivation --- .../java/datadog/trace/agent/tooling/TracerInstaller.java | 6 ------ .../trace/agent/tooling/nativeimage/TracerActivation.java | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java index 14cd8acf4ee..6bd27c31bb1 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java @@ -1,11 +1,8 @@ package datadog.trace.agent.tooling; import datadog.communication.ddagent.SharedCommunicationObjects; -import datadog.communication.monitor.DDAgentStatsDClientManager; -import datadog.trace.agent.jmxfetch.JMXFetch; import datadog.trace.api.Config; import datadog.trace.api.GlobalTracer; -import datadog.trace.api.StatsDClientManager; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.ProfilingContextIntegration; import datadog.trace.core.CoreTracer; @@ -28,9 +25,6 @@ public static synchronized void installGlobalTracer( .pollForTracingConfiguration() .build(); installGlobalTracer(tracer); - - StatsDClientManager statsDClientManager = DDAgentStatsDClientManager.statsDClientManager(); - JMXFetch.run(statsDClientManager); } else { log.debug("GlobalTracer already registered."); } diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/nativeimage/TracerActivation.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/nativeimage/TracerActivation.java index 51114d9807f..9c5f769ad19 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/nativeimage/TracerActivation.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/nativeimage/TracerActivation.java @@ -2,8 +2,11 @@ import com.datadog.profiling.controller.openjdk.JFREventContextIntegration; import datadog.communication.ddagent.SharedCommunicationObjects; +import datadog.communication.monitor.DDAgentStatsDClientManager; +import datadog.trace.agent.jmxfetch.JMXFetch; import datadog.trace.agent.tooling.ProfilerInstaller; import datadog.trace.agent.tooling.TracerInstaller; +import datadog.trace.api.StatsDClientManager; import datadog.trace.bootstrap.instrumentation.api.ProfilingContextIntegration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,6 +23,9 @@ public static void activate() { withProfiler ? new JFREventContextIntegration() : ProfilingContextIntegration.NoOp.INSTANCE); + + StatsDClientManager statsDClientManager = DDAgentStatsDClientManager.statsDClientManager(); + JMXFetch.run(statsDClientManager); } catch (Throwable e) { log.warn("Problem activating datadog tracer", e); } From 5d06a2f4199b0735c3a773302bc81eb4406c0993 Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Tue, 15 Apr 2025 12:58:03 -0700 Subject: [PATCH 07/15] Remove JsonProcessingException stub that won't be needed for com.datadoghq:jmxfetch:0.49.7+ --- .../com/fasterxml/jackson/core/JsonProcessingException.java | 4 ---- .../AnnotationSubstitutionProcessorInstrumentation.java | 1 - 2 files changed, 5 deletions(-) delete mode 100644 dd-java-agent/agent-jmxfetch/src/main/java/com/fasterxml/jackson/core/JsonProcessingException.java diff --git a/dd-java-agent/agent-jmxfetch/src/main/java/com/fasterxml/jackson/core/JsonProcessingException.java b/dd-java-agent/agent-jmxfetch/src/main/java/com/fasterxml/jackson/core/JsonProcessingException.java deleted file mode 100644 index 4ceefbc5622..00000000000 --- a/dd-java-agent/agent-jmxfetch/src/main/java/com/fasterxml/jackson/core/JsonProcessingException.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.fasterxml.jackson.core; - -// empty stub; here to satisfy a catch reference in org.datadog.jmxfetch.App -public class JsonProcessingException extends java.io.IOException {} diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java index 575eebf9809..fb46599f3f8 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/AnnotationSubstitutionProcessorInstrumentation.java @@ -39,7 +39,6 @@ public String[] helperClassNames() { packageName + ".Target_datadog_jctools_counters_FixedSizeStripedLongCounterFields", packageName + ".Target_datadog_jctools_util_UnsafeRefArrayAccess", packageName + ".Target_org_datadog_jmxfetch_App", - "com.fasterxml.jackson.core.JsonProcessingException", // referenced by jmxfetch.App packageName + ".Target_org_datadog_jmxfetch_Status", packageName + ".Target_org_datadog_jmxfetch_reporter_JsonReporter", }; From 03e3c12a87fd9268169826faaa9e6d6e413ee2fb Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Tue, 15 Apr 2025 13:11:35 -0700 Subject: [PATCH 08/15] Adjust GraalVM Native substitutions for JMXFetch --- .../nativeimage/Target_org_datadog_jmxfetch_App.java | 8 ++------ .../nativeimage/Target_org_datadog_jmxfetch_Status.java | 4 +--- ...Target_org_datadog_jmxfetch_reporter_JsonReporter.java | 4 +--- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_App.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_App.java index 44df2fcfa74..0106ca1de1b 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_App.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_App.java @@ -7,15 +7,11 @@ public final class Target_org_datadog_jmxfetch_App { @Substitute private boolean getJsonConfigs() { - // Replace org.datadog.jmxfetch.App.getJsonConfigs to fix the GraalVM native build error. - // - // This method has references to the excluded transitive dependencies: - // - jackson-core (catch JsonProcessingException) - // - jackson-jr-objects (referenced in org.datadog.jmxfetch.JsonParser). + // This method has a reference to the excluded transitive dependency jackson-jr-objects. // GraalVM Native detects it during the reachability analysis and results in // "Discovered unresolved method during parsing: // org.datadog.jmxfetch.App.(org.datadog.jmxfetch.AppConfig)." // because of the missing classes that belong to the excluded dependencies. - return false; + throw new IllegalStateException("Unreachable"); } } diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_Status.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_Status.java index 1064b600e0f..395f3a34983 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_Status.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_Status.java @@ -8,12 +8,10 @@ public final class Target_org_datadog_jmxfetch_Status { @Substitute private String generateJson() throws IOException { - // Replace org.datadog.jmxfetch.Status.generateJson to fix the GraalVM native build error. - // // This method has a reference to the excluded transitive dependency jackson-jr-objects. // GraalVM Native detects it during the reachability analysis and results in // "Discovered unresolved type during parsing: com.fasterxml.jackson.jr.ob.JSON." // because of the missing classes that belong to the excluded dependencies. - return ""; + throw new IllegalStateException("Unreachable"); } } diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_reporter_JsonReporter.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_reporter_JsonReporter.java index 6848c53e88a..8ff63ca180f 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_reporter_JsonReporter.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/Target_org_datadog_jmxfetch_reporter_JsonReporter.java @@ -8,12 +8,10 @@ public final class Target_org_datadog_jmxfetch_reporter_JsonReporter { @Substitute public void doSendServiceCheck( String serviceCheckName, String status, String message, String[] tags) { - // Replace org.datadog.jmxfetch.reporter.JsonReporter.doSendServiceCheck to fix the GraalVM - // native build error. - // // This method has a reference to the excluded transitive dependency jackson-jr-objects. // GraalVM Native detects it during the reachability analysis and results in // "Discovered unresolved type during parsing: com.fasterxml.jackson.jr.ob.JSON." // because of the missing classes that belong to the excluded dependencies. + throw new IllegalStateException("Unreachable"); } } From 2329be90f22f9beafe558361efb9ee2e58930a94 Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Fri, 18 Apr 2025 11:41:43 -0700 Subject: [PATCH 09/15] GraalVM Native JMXFetch smoke test --- .../application/build.gradle | 1 + ...SpringBootNativeInstrumentationTest.groovy | 41 ++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/dd-smoke-tests/spring-boot-3.0-native/application/build.gradle b/dd-smoke-tests/spring-boot-3.0-native/application/build.gradle index 868dcf3239e..992fa0eaa6f 100644 --- a/dd-smoke-tests/spring-boot-3.0-native/application/build.gradle +++ b/dd-smoke-tests/spring-boot-3.0-native/application/build.gradle @@ -39,6 +39,7 @@ if (hasProperty('agentPath')) { if (withProfiler && property('profiler') == 'true') { buildArgs.add("-J-Ddd.profiling.enabled=true") } + buildArgs.add("--enable-monitoring=jmxserver") } } } diff --git a/dd-smoke-tests/spring-boot-3.0-native/src/test/groovy/SpringBootNativeInstrumentationTest.groovy b/dd-smoke-tests/spring-boot-3.0-native/src/test/groovy/SpringBootNativeInstrumentationTest.groovy index c5b9edeea24..972419cbbba 100644 --- a/dd-smoke-tests/spring-boot-3.0-native/src/test/groovy/SpringBootNativeInstrumentationTest.groovy +++ b/dd-smoke-tests/spring-boot-3.0-native/src/test/groovy/SpringBootNativeInstrumentationTest.groovy @@ -1,4 +1,5 @@ import datadog.smoketest.AbstractServerSmokeTest +import datadog.trace.agent.test.utils.PortUtils import okhttp3.Request import org.openjdk.jmc.common.item.IItemCollection import org.openjdk.jmc.common.item.ItemFilters @@ -13,6 +14,10 @@ import java.nio.file.Files import java.nio.file.Path import java.nio.file.SimpleFileVisitor import java.nio.file.attribute.BasicFileAttributes +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit +import java.util.concurrent.TimeoutException import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.locks.LockSupport @@ -21,6 +26,9 @@ class SpringBootNativeInstrumentationTest extends AbstractServerSmokeTest { @TempDir def testJfrDir + @Shared + def statsdPort = PortUtils.randomOpenPort() + @Override ProcessBuilder createProcessBuilder() { String springNativeExecutable = System.getProperty('datadog.smoketest.spring.native.executable') @@ -39,7 +47,10 @@ class SpringBootNativeInstrumentationTest extends AbstractServerSmokeTest { '-Ddd.profiling.upload.period=1', '-Ddd.profiling.start-force-first=true', "-Ddd.profiling.debug.dump_path=${testJfrDir}", - "-Ddd.integration.spring-boot.enabled=true" + "-Ddd.integration.spring-boot.enabled=true", + "-Ddd.trace.debug=true", + "-Ddd.jmxfetch.statsd.port=${statsdPort}", + "-Ddd.jmxfetch.start-delay=0", ]) ProcessBuilder processBuilder = new ProcessBuilder(command) processBuilder.directory(new File(buildDirectory)) @@ -66,8 +77,18 @@ class SpringBootNativeInstrumentationTest extends AbstractServerSmokeTest { super.isErrorLog(log) || log.contains("ClassNotFoundException") } + def setupSpec() { + try { + processTestLogLines { it.contains("JMXFetch config: ") } + } catch (TimeoutException toe) { + throw new AssertionError("'JMXFetch config: ' not found in logs. Make sure it's enabled.", toe) + } + } + def "check native instrumentation"() { setup: + CompletableFuture udpMessage = receiveUdpMessage(statsdPort, 1000) + String url = "http://localhost:${httpPort}/hello" when: @@ -87,6 +108,8 @@ class SpringBootNativeInstrumentationTest extends AbstractServerSmokeTest { LockSupport.parkNanos(1_000_000) } countJfrs() > 0 + + udpMessage.get(1, TimeUnit.SECONDS) contains "service:smoke-test-java-app,version:99,env:smoketest" } int countJfrs() { @@ -115,4 +138,20 @@ class SpringBootNativeInstrumentationTest extends AbstractServerSmokeTest { }) return jfrCount.get() } + + CompletableFuture receiveUdpMessage(int port, int bufferSize) { + def future = new CompletableFuture() + Executors.newSingleThreadExecutor().submit { + try (DatagramSocket socket = new DatagramSocket(port)) { + byte[] buffer = new byte[bufferSize] + DatagramPacket packet = new DatagramPacket(buffer, buffer.length) + socket.receive(packet) + def received = new String(packet.data, 0, packet.length) + future.complete(received) + } catch (Exception e) { + future.completeExceptionally(e) + } + } + return future + } } From 4b438daa7a637b2880fe45a3912318b65343e461 Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Mon, 5 May 2025 11:17:52 -0700 Subject: [PATCH 10/15] Bump jmxfetch to 0.49.7 for GraalVM Native --- dd-java-agent/agent-jmxfetch/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/agent-jmxfetch/build.gradle b/dd-java-agent/agent-jmxfetch/build.gradle index 22774b81756..c7c26f3c04f 100644 --- a/dd-java-agent/agent-jmxfetch/build.gradle +++ b/dd-java-agent/agent-jmxfetch/build.gradle @@ -11,7 +11,7 @@ plugins { apply from: "$rootDir/gradle/java.gradle" dependencies { - api('com.datadoghq:jmxfetch:0.49.6') { + api('com.datadoghq:jmxfetch:0.49.7') { exclude group: 'org.slf4j', module: 'slf4j-api' exclude group: 'org.slf4j', module: 'slf4j-jdk14' exclude group: 'com.beust', module: 'jcommander' From a61b6b18665afb21cbce814613f704266ec8647d Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Tue, 6 May 2025 09:27:30 -0700 Subject: [PATCH 11/15] Clean up TODO --- .../src/main/java/datadog/trace/bootstrap/Agent.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index 1522b744c0e..66ebd3d7ac8 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -185,11 +185,7 @@ public static void start( if (Platform.isNativeImageBuilder()) { // apply trace instrumentation at native-image build time startDatadogAgent(initTelemetry, inst); - // TODO: are we sure we want measure native-image build instrumentation? - // This is very different, happens at build time and doesn't include any service - // initialization time. StaticEventLogger.end("Agent.start"); - return; } From 55b6ee3a9c249d0607e0c7ce0fbddf34438dc6a1 Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Tue, 6 May 2025 09:59:58 -0700 Subject: [PATCH 12/15] Disable remoteConfig and telemetry for Native builds --- .../src/main/java/datadog/trace/bootstrap/Agent.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index 66ebd3d7ac8..534acbb8434 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -183,6 +183,9 @@ public static void start( createAgentClassloader(agentJarURL); if (Platform.isNativeImageBuilder()) { + // these default services are not used during native-image builds + remoteConfigEnabled = false; + telemetryEnabled = false; // apply trace instrumentation at native-image build time startDatadogAgent(initTelemetry, inst); StaticEventLogger.end("Agent.start"); From c56773b67d4c3b0bcb2ba5ab680f44ece960a87d Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Wed, 7 May 2025 09:54:09 -0700 Subject: [PATCH 13/15] Code review follow up --- .../src/main/java/datadog/trace/bootstrap/Agent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java index 534acbb8434..00b54848832 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java @@ -186,7 +186,7 @@ public static void start( // these default services are not used during native-image builds remoteConfigEnabled = false; telemetryEnabled = false; - // apply trace instrumentation at native-image build time + // apply trace instrumentation, but skip other products at native-image build time startDatadogAgent(initTelemetry, inst); StaticEventLogger.end("Agent.start"); return; From 7364f8cde700bbe8cbfc53680af925077b8c35d2 Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Wed, 7 May 2025 23:08:26 -0700 Subject: [PATCH 14/15] Add jmxfetch integrations metricconfigs for native builds Add more extensive error reporting related to metricconfigs --- .../trace/agent/jmxfetch/JMXFetch.java | 15 +++- .../ResourcesFeatureInstrumentation.java | 72 +++++++++++++------ 2 files changed, 65 insertions(+), 22 deletions(-) diff --git a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java index d81415a7d68..319f455c85e 100644 --- a/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java +++ b/dd-java-agent/agent-jmxfetch/src/main/java/datadog/trace/agent/jmxfetch/JMXFetch.java @@ -9,6 +9,7 @@ import datadog.trace.api.StatsDClient; import datadog.trace.api.StatsDClientManager; import datadog.trace.api.flare.TracerFlare; +import datadog.trace.api.telemetry.LogCollector; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.io.IOException; import java.io.InputStream; @@ -174,6 +175,7 @@ private static List getInternalMetricFiles() { log.debug("metricconfigs not found. returning empty set"); return Collections.emptyList(); } + log.debug("reading found metricconfigs"); Scanner scanner = new Scanner(metricConfigsStream); scanner.useDelimiter("\n"); final List result = new ArrayList<>(); @@ -183,8 +185,19 @@ private static List getInternalMetricFiles() { integrationName.clear(); integrationName.add(config.replace(".yaml", "")); - if (Config.get().isJmxFetchIntegrationEnabled(integrationName, false)) { + if (!Config.get().isJmxFetchIntegrationEnabled(integrationName, false)) { + log.debug( + "skipping metric config `{}` because integration {} is disabled", + config, + integrationName); + } else { final URL resource = JMXFetch.class.getResource("metricconfigs/" + config); + if (resource == null) { + log.debug( + LogCollector.SEND_TELEMETRY, "metric config `{}` not found. skipping", config); + continue; + } + log.debug("adding metric config `{}`", config); // jar!/ means a file internal to a jar, only add the part after if it exists final String path = resource.getPath(); diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java index 38f2bf32a22..0909ba45ce6 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java @@ -7,7 +7,12 @@ import com.oracle.svm.core.jdk.Resources; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; +import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; import net.bytebuddy.asm.Advice; @AutoService(InstrumenterModule.class) @@ -33,32 +38,57 @@ public static void onExit() { // (drop trace/shared prefixes from embedded resources, so we can find them in native-image // as the final executable won't have our isolating class-loader to map these resources) - String[] tracerResources = { - "dd-java-agent.version", - "dd-trace-api.version", - "trace/dd-trace-core.version", - "shared/dogstatsd/version.properties", - "shared/version-utils.version", - "shared/datadog/okhttp3/internal/publicsuffix/publicsuffixes.gz", - "profiling/jfr/dd.jfp", - "profiling/jfr/safepoints.jfp", - "profiling/jfr/overrides/comprehensive.jfp", - "profiling/jfr/overrides/minimal.jfp", - // jmxfetch configs - "metrics/project.properties", // org.datadog.jmxfetch.AppConfig reads its version - "metrics/org/datadog/jmxfetch/default-jmx-metrics.yaml", - "metrics/org/datadog/jmxfetch/new-gc-default-jmx-metrics.yaml", - "metrics/org/datadog/jmxfetch/old-gc-default-jmx-metrics.yaml", - // tracer's jmxfetch configs - "metrics/jmxfetch-config.yaml", - "metrics/jmxfetch-websphere-config.yaml", - }; + List tracerResources = new ArrayList<>(); + tracerResources.add("dd-java-agent.version"); + tracerResources.add("dd-trace-api.version"); + tracerResources.add("trace/dd-trace-core.version"); + tracerResources.add("shared/dogstatsd/version.properties"); + tracerResources.add("shared/version-utils.version"); + tracerResources.add("shared/datadog/okhttp3/internal/publicsuffix/publicsuffixes.gz"); + tracerResources.add("profiling/jfr/dd.jfp"); + tracerResources.add("profiling/jfr/safepoints.jfp"); + tracerResources.add("profiling/jfr/overrides/comprehensive.jfp"); + tracerResources.add("profiling/jfr/overrides/minimal.jfp"); + // jmxfetch configs + tracerResources.add( + "metrics/project.properties"); // org.datadog.jmxfetch.AppConfig reads its version + tracerResources.add("metrics/org/datadog/jmxfetch/default-jmx-metrics.yaml"); + tracerResources.add("metrics/org/datadog/jmxfetch/new-gc-default-jmx-metrics.yaml"); + tracerResources.add("metrics/org/datadog/jmxfetch/old-gc-default-jmx-metrics.yaml"); + + // tracer's jmxfetch configs + tracerResources.add("metrics/jmxfetch-config.yaml"); + tracerResources.add("metrics/jmxfetch-websphere-config.yaml"); + + { + // jmxfetch integrations metricconfigs + String metricConfigsPath = "metrics/datadog/trace/agent/jmxfetch/"; + String metricConfigs = metricConfigsPath + "metricconfigs.txt"; + tracerResources.add(metricConfigs); + InputStream is = ClassLoader.getSystemResourceAsStream(metricConfigs); + if (is == null) { + System.err.println("ERROR: metricconfigs.txt not found"); + } else + try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) { + String metricConfig; + while ((metricConfig = reader.readLine()) != null) { + if (!metricConfig.trim().isEmpty()) { + tracerResources.add(metricConfigsPath + "metricconfigs/" + metricConfig); + } + } + } catch (IOException e) { + System.err.println("ERROR: reading metricconfig: " + e); + } + } + + // registering tracer resources to include in the native build for (String original : tracerResources) { String flattened = original.substring(original.indexOf('/') + 1); try (InputStream is = ClassLoader.getSystemResourceAsStream(original)) { Resources.registerResource(flattened, is); - } catch (Throwable ignore) { + } catch (Throwable t) { + System.err.println("ERROR: reading `" + original + "` " + t); } } } From 83482403de112a9194efe85928f5fac13524b95d Mon Sep 17 00:00:00 2001 From: Yury Gribkov Date: Thu, 8 May 2025 08:37:32 -0700 Subject: [PATCH 15/15] Fix fobidden api error --- .../ResourcesFeatureInstrumentation.java | 34 +++++++------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java index 0909ba45ce6..bf546d0b97f 100644 --- a/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java +++ b/dd-java-agent/instrumentation/graal/native-image/src/main/java/datadog/trace/instrumentation/graal/nativeimage/ResourcesFeatureInstrumentation.java @@ -8,7 +8,6 @@ import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; @@ -61,25 +60,19 @@ public static void onExit() { tracerResources.add("metrics/jmxfetch-config.yaml"); tracerResources.add("metrics/jmxfetch-websphere-config.yaml"); - { - // jmxfetch integrations metricconfigs - String metricConfigsPath = "metrics/datadog/trace/agent/jmxfetch/"; - String metricConfigs = metricConfigsPath + "metricconfigs.txt"; - tracerResources.add(metricConfigs); - InputStream is = ClassLoader.getSystemResourceAsStream(metricConfigs); - if (is == null) { - System.err.println("ERROR: metricconfigs.txt not found"); - } else - try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) { - String metricConfig; - while ((metricConfig = reader.readLine()) != null) { - if (!metricConfig.trim().isEmpty()) { - tracerResources.add(metricConfigsPath + "metricconfigs/" + metricConfig); - } - } - } catch (IOException e) { - System.err.println("ERROR: reading metricconfig: " + e); + // jmxfetch integrations metricconfigs + String metricConfigsPath = "metrics/datadog/trace/agent/jmxfetch/"; + String metricConfigs = metricConfigsPath + "metricconfigs.txt"; + tracerResources.add(metricConfigs); + try (InputStream is = ClassLoader.getSystemResourceAsStream(metricConfigs); + BufferedReader reader = new BufferedReader(new InputStreamReader(is))) { + String metricConfig; + while ((metricConfig = reader.readLine()) != null) { + if (!metricConfig.trim().isEmpty()) { + tracerResources.add(metricConfigsPath + "metricconfigs/" + metricConfig); } + } + } catch (Throwable ignore) { } // registering tracer resources to include in the native build @@ -87,8 +80,7 @@ public static void onExit() { String flattened = original.substring(original.indexOf('/') + 1); try (InputStream is = ClassLoader.getSystemResourceAsStream(original)) { Resources.registerResource(flattened, is); - } catch (Throwable t) { - System.err.println("ERROR: reading `" + original + "` " + t); + } catch (Throwable ignore) { } } }