diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/ConfigManager.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/ConfigManager.java index 073acd40ee..c3ee042f4c 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/ConfigManager.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/ConfigManager.java @@ -35,6 +35,7 @@ public static class StoredConfig { final String reportUUID; final boolean agentless; final boolean sendToErrorTracking; + final boolean extendedInfoEnabled; StoredConfig( String reportUUID, @@ -45,7 +46,8 @@ public static class StoredConfig { String processTags, String runtimeId, boolean agentless, - boolean sendToErrorTracking) { + boolean sendToErrorTracking, + boolean extendedInfoEnabled) { this.service = service; this.env = env; this.version = version; @@ -55,6 +57,11 @@ public static class StoredConfig { this.reportUUID = reportUUID; this.agentless = agentless; this.sendToErrorTracking = sendToErrorTracking; + this.extendedInfoEnabled = extendedInfoEnabled; + } + + public CrashUploaderSettings toCrashUploaderSettings() { + return new CrashUploaderSettings(extendedInfoEnabled); } public static class Builder { @@ -67,6 +74,7 @@ public static class Builder { String reportUUID; boolean agentless; boolean sendToErrorTracking; + boolean extendedInfoEnabled; public Builder(Config config) { // get sane defaults @@ -77,6 +85,7 @@ public Builder(Config config) { this.reportUUID = RandomUtils.randomUUID().toString(); this.agentless = config.isCrashTrackingAgentless(); this.sendToErrorTracking = config.isCrashTrackingErrorsIntakeEnabled(); + this.extendedInfoEnabled = config.isCrashTrackingExtendedInfoEnabled(); } public Builder service(String service) { @@ -119,6 +128,11 @@ public Builder agentless(boolean agentless) { return this; } + public Builder extendedInfoEnabled(boolean extendedInfoEnabled) { + this.extendedInfoEnabled = extendedInfoEnabled; + return this; + } + // @VisibleForTesting Builder reportUUID(String reportUUID) { this.reportUUID = reportUUID; @@ -135,7 +149,8 @@ public StoredConfig build() { processTags, runtimeId, agentless, - sendToErrorTracking); + sendToErrorTracking, + extendedInfoEnabled); } } } @@ -194,6 +209,8 @@ static void writeConfigToFile(Config config, Path cfgPath, String... additionalE writeEntry(bw, "java_home", SystemProperties.get("java.home")); writeEntry(bw, "agentless", Boolean.toString(config.isCrashTrackingAgentless())); writeEntry(bw, "upload_to_et", Boolean.toString(config.isCrashTrackingErrorsIntakeEnabled())); + writeEntry( + bw, "extended_info", Boolean.toString(config.isCrashTrackingExtendedInfoEnabled())); Runtime.getRuntime() .addShutdownHook( @@ -257,6 +274,9 @@ public static StoredConfig readConfig(Config config, Path scriptPath) { case "upload_to_et": cfgBuilder.sendToErrorTracking(Boolean.parseBoolean(value)); break; + case "extended_info": + cfgBuilder.extendedInfoEnabled(Boolean.parseBoolean(value)); + break; default: // ignore break; diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java index 3695592869..a8090459e6 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploader.java @@ -113,6 +113,7 @@ public void onResponse(Call call, Response response) throws IOException { private final Config config; private final ConfigManager.StoredConfig storedConfig; + private final CrashUploaderSettings uploaderSettings; private final HttpUrl telemetryUrl; private final HttpUrl errorTrackingUrl; @@ -131,6 +132,7 @@ public CrashUploader(@Nonnull final ConfigManager.StoredConfig storedConfig) { @NonNull final Config config, @Nonnull final ConfigManager.StoredConfig storedConfig) { this.config = config; this.storedConfig = storedConfig; + this.uploaderSettings = storedConfig.toCrashUploaderSettings(); this.telemetryUrl = HttpUrl.get(config.getFinalCrashTrackingTelemetryUrl()); this.errorTrackingUrl = HttpUrl.get(config.getFinalCrashTrackingErrorTrackingUrl()); this.agentless = config.isCrashTrackingAgentless(); @@ -525,7 +527,7 @@ private RequestBody makeErrorTrackingRequestBody(@Nonnull CrashLog payload, bool } writer.name("type").value(payload.error.kind); writer.name("message").value(payload.error.message); - if (payload.error.threadName != null) { + if (uploaderSettings.isExtendedInfoEnabled() && payload.error.threadName != null) { writer.name("thread_name").value(payload.error.threadName); } writer.name("source_type").value("Crashtracking"); @@ -588,7 +590,8 @@ private RequestBody makeErrorTrackingRequestBody(@Nonnull CrashLog payload, bool } writer.endObject(); } - if (payload.experimental.runtimeArgs != null) { + if (uploaderSettings.isExtendedInfoEnabled() + && payload.experimental.runtimeArgs != null) { writer.name("runtime_args"); writer.beginArray(); for (String arg : payload.experimental.runtimeArgs) { @@ -599,7 +602,7 @@ private RequestBody makeErrorTrackingRequestBody(@Nonnull CrashLog payload, bool writer.endObject(); } // files (e.g. /proc/self/maps or dynamic_libraries) - if (payload.files != null) { + if (uploaderSettings.isExtendedInfoEnabled() && payload.files != null) { writer.name("files"); writer.beginObject(); writer.name(payload.files.name); diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderSettings.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderSettings.java new file mode 100644 index 0000000000..15a79834f5 --- /dev/null +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/CrashUploaderSettings.java @@ -0,0 +1,14 @@ +package datadog.crashtracking; + +/** Immutable settings that control what data {@link CrashUploader} includes in uploaded reports. */ +public final class CrashUploaderSettings { + final boolean extendedInfoEnabled; + + CrashUploaderSettings(boolean extendedInfoEnabled) { + this.extendedInfoEnabled = extendedInfoEnabled; + } + + boolean isExtendedInfoEnabled() { + return extendedInfoEnabled; + } +} diff --git a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/RuntimeArgs.java b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/RuntimeArgs.java index 0e871a4c6a..8a422f5166 100644 --- a/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/RuntimeArgs.java +++ b/dd-java-agent/agent-crashtracking/src/main/java/datadog/crashtracking/parsers/RuntimeArgs.java @@ -14,23 +14,14 @@ *
  • pre-split J9 user arguments, such as individual {@code 2CIUSERARG} records * * - *

    Only a curated subset of arguments is retained for telemetry: {@code -Ddd.*}, {@code -Djdk.*}, - * {@code -Djava.*}, {@code -Dsun.*}, {@code -javaagent:}, {@code -agentlib:}, {@code -X*}, and + *

    Only a curated subset of arguments is retained for telemetry: {@code -Djdk.*}, {@code + * -Djava.*}, {@code -Dsun.*}, {@code -javaagent:}, {@code -agentlib:}, {@code -X*}, and * module/native-access options. */ final class RuntimeArgs { + // Aligned with JDK JEP-8372760 (JFR In-Process Data Redaction) default filter list. private static final String[] SECRET_PROPERTY_KEYWORDS = { - "password", - "passwd", - "secret", - "token", - "apikey", - "api-key", - "accesskey", - "access-key", - "privatekey", - "private-key", - "credential" + "auth", "password", "passwd", "pwd", "passphrase", "secret", "token", "key", "credential" }; private static final String[] MODULE_OPTIONS = { "--add-modules", @@ -72,11 +63,13 @@ private static List filterArgs(List args) { if (arg == null || arg.isEmpty()) { continue; } - if (isAllowedSystemProperty(arg) - || arg.startsWith("-javaagent:") - || arg.startsWith("-agentlib:") - || arg.startsWith("-X") - || isModuleOrNativeAccessOption(arg)) { + if (isAllowedSystemProperty(arg)) { + filtered.add(arg); + } else if (arg.startsWith("-javaagent:") || arg.startsWith("-agentlib:")) { + // Redact options after '=' — only the jar path / library name is sent + int eq = arg.indexOf('=', arg.indexOf(':') + 1); + filtered.add(eq >= 0 ? arg.substring(0, eq) + "=REDACTED" : arg); + } else if (arg.startsWith("-X") || isModuleOrNativeAccessOption(arg)) { filtered.add(arg); } } @@ -96,7 +89,7 @@ private static boolean isAllowedSystemProperty(String arg) { if (hasSecretLikePropertyName(arg)) { return false; } - if (arg.startsWith("-Ddd.") || arg.startsWith("-Djdk.") || arg.startsWith("-Dosgi.")) { + if (arg.startsWith("-Djdk.") || arg.startsWith("-Dosgi.")) { return true; } // J9 lists them as vm args. diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ConfigManagerTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ConfigManagerTest.java index 35d5aae3e2..e46150f497 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ConfigManagerTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/ConfigManagerTest.java @@ -24,6 +24,7 @@ public void testConfigWriteAndRead() throws IOException { .thenReturn(new WellKnownTags("1234", "", "env", "service", "version", "")); when(config.isCrashTrackingAgentless()).thenReturn(false); when(config.isCrashTrackingErrorsIntakeEnabled()).thenReturn(true); + when(config.isCrashTrackingExtendedInfoEnabled()).thenReturn(true); when(config.getMergedCrashTrackingTags()).thenReturn(Collections.singletonMap("key", "value")); File tmpFile = File.createTempFile("ConfigManagerTest", null); tmpFile.deleteOnExit(); @@ -41,6 +42,7 @@ public void testConfigWriteAndRead() throws IOException { deserialized.processTags); assertFalse(deserialized.agentless); assertTrue(deserialized.sendToErrorTracking); + assertTrue(deserialized.extendedInfoEnabled); } @Test @@ -56,5 +58,6 @@ public void testStoredConfigDefaults() { assertEquals("env", storedConfig.env); assertFalse(storedConfig.agentless); assertFalse(storedConfig.sendToErrorTracking); + assertFalse(storedConfig.extendedInfoEnabled); } } diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java index 763cbd01a5..6fde316126 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/CrashUploaderTest.java @@ -323,6 +323,7 @@ public void testErrorTrackingHappyPath(String log) throws Exception { .processTags("a:b") .runtimeId("1234") .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) // take the real ones + .extendedInfoEnabled(true) .build(); // When uploader = new CrashUploader(config, crashConfig); @@ -362,6 +363,28 @@ public void testErrorTrackingHappyPath(String log) throws Exception { .isEqualTo(mapper.writeValueAsString(expected)); } + @Test + public void testErrorTrackingExcludesExtendedInfoByDefault() throws Exception { + // extendedInfoEnabled defaults to false — files, thread_name and runtime_args must not appear + ConfigManager.StoredConfig crashConfig = + new ConfigManager.StoredConfig.Builder(config) + .reportUUID(SAMPLE_UUID) + .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) + .build(); + + uploader = new CrashUploader(config, crashConfig); + server.enqueue(new MockResponse().setResponseCode(200)); + uploader.remoteUpload(readFileAsString("sample-crash-for-telemetry.txt"), false, true); + + final RecordedRequest recordedRequest = server.takeRequest(5, TimeUnit.SECONDS); + final ObjectMapper mapper = new ObjectMapper(); + final JsonNode event = mapper.readTree(recordedRequest.getBody().readUtf8()); + + assertNull(event.get("files")); + assertNull(event.at("/error/thread_name").textValue()); + assertTrue(event.at("/experimental/runtime_args").isMissingNode()); + } + @Test public void testErrorTrackingSerializesRuntimeArgs() throws Exception { ConfigManager.StoredConfig crashConfig = @@ -370,6 +393,7 @@ public void testErrorTrackingSerializesRuntimeArgs() throws Exception { .processTags("a:b") .runtimeId("1234") .tags(ConfigManager.getMergedTagsForSerialization(Config.get())) + .extendedInfoEnabled(true) .build(); uploader = new CrashUploader(config, crashConfig); diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/HotspotCrashLogParserTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/HotspotCrashLogParserTest.java index b23937a41d..cbc020d84f 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/HotspotCrashLogParserTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/HotspotCrashLogParserTest.java @@ -106,8 +106,8 @@ public void testRuntimeArgsFilteringFromHotspotJvmArgs() throws Exception { assertTrue( crashLog.experimental.runtimeArgs.contains( "-javaagent:/opt/REDACT_THIS/datadog-apm-agent/dd-java-agent.jar")); - assertTrue(crashLog.experimental.runtimeArgs.contains("-Ddd.profiling.enabled=true")); - assertTrue(crashLog.experimental.runtimeArgs.contains("-Ddd.service=REDACT_THIS")); + assertFalse(crashLog.experimental.runtimeArgs.contains("-Ddd.profiling.enabled=true")); + assertFalse(crashLog.experimental.runtimeArgs.contains("-Ddd.service=REDACT_THIS")); assertTrue( crashLog.experimental.runtimeArgs.stream().anyMatch(arg -> arg.startsWith("--add-opens="))); assertFalse( diff --git a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/RuntimeArgsTest.java b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/RuntimeArgsTest.java index 83d71c9940..c7dfffff70 100644 --- a/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/RuntimeArgsTest.java +++ b/dd-java-agent/agent-crashtracking/src/test/java/datadog/crashtracking/parsers/RuntimeArgsTest.java @@ -19,11 +19,11 @@ public class RuntimeArgsTest { @TableTest({ "scenario | resource | isIncluded | vmArg ", "telemetry fixture logging property | sample-crash-for-telemetry.txt | true | -Djava.util.logging.config.file=/opt/REDACT_THIS/REDACT_THIS/etc/java.util.logging.properties", - "telemetry fixture dd property | sample-crash-for-telemetry.txt | true | -Ddd.profiling.enabled=true ", + "telemetry fixture dd property | sample-crash-for-telemetry.txt | false | -Ddd.profiling.enabled=true ", "telemetry fixture excluded property | sample-crash-for-telemetry.txt | false | -Dkaraf.startRemoteShell=REDACT_THIS ", "telemetry fixture ws provider | sample-crash-for-telemetry.txt | false | -Djavax.xml.ws.spi.Provider=com.sun.xml.ws.spi.ProviderImpl ", "telemetry with OnError | sample-crash-for-telemetry-2.txt | true | -XX:OnError=/tmp/dd_crash_uploader.sh %p ", - "telemetry jdk8 | sample-crash-for-telemetry-3.txt | true | -Ddd.trace.enabled=false ", + "telemetry jdk8 | sample-crash-for-telemetry-3.txt | false | -Ddd.trace.enabled=false ", "linux aarch64 | sample-crash-linux-aarch64.txt | true | --add-modules=ALL-DEFAULT ", "macos aarch64 | sample-crash-macos-aarch64.txt | true | --enable-native-access=ALL-UNNAMED ", "jdk8 zip | sample-crash-jdk8-zip-getentry.txt | true | -Dsun.zip.disableMemoryMapping=false " @@ -43,24 +43,34 @@ public void testParseVmArgsHotspotArgs(String resource, boolean isIncluded, Stri } @TableTest({ - "scenario | raw | expectedIncluded ", - "quoted onerror unix | -XX:OnError=\"gcore %p;gdb -p %p\" | -XX:OnError=gcore %p;gdb -p %p ", - "quoted onerror windows | -XX:OnError=\"userdump.exe %p\" | -XX:OnError=userdump.exe %p ", - "quoted module path | --module-path \"/opt/app-modules:/opt/other-modules\" | --module-path /opt/app-modules:/opt/other-modules" + "scenario | raw | expectedIncluded ", + "quoted onerror unix | -XX:OnError=\"gcore %p;gdb -p %p\" | -XX:OnError=gcore %p;gdb -p %p ", + "quoted onerror windows | -XX:OnError=\"userdump.exe %p\" | -XX:OnError=userdump.exe %p ", + "quoted module path | --module-path \"/opt/app-modules:/opt/other-modules\" | --module-path /opt/app-modules:/opt/other-modules", + "javaagent without options | -javaagent:/opt/dd-java-agent.jar | -javaagent:/opt/dd-java-agent.jar ", + "javaagent options redacted | -javaagent:/opt/dd-java-agent.jar=apikey=deadbeef | -javaagent:/opt/dd-java-agent.jar=REDACTED ", + "agentlib without options | -agentlib:jdwp | -agentlib:jdwp ", + "agentlib options redacted | -agentlib:jdwp=transport=dt_socket,server=y | -agentlib:jdwp=REDACTED " }) - public void testParseVmArgsHandlesQuotedArguments(String raw, String expectedIncluded) { + public void testParseVmArgsHandlesArgNormalization(String raw, String expectedIncluded) { List runtimeArgs = RuntimeArgs.parseVmArgs(raw); assertThat(runtimeArgs).isNotNull().contains(expectedIncluded); } @TableTest({ - "scenario | raw | isIncluded | vmArg ", - "java password excluded | -Djava.net.password=hunter2 | false | -Djava.net.password=hunter2 ", - "sun token excluded | -Dsun.auth.token=abc123 | false | -Dsun.auth.token=abc123 ", - "dd api key excluded | -Ddd.api-key=deadbeef | false | -Ddd.api-key=deadbeef ", - "java logging kept | -Djava.util.logging.config.file=x | true | -Djava.util.logging.config.file=x", - "osgi install kept | -Dosgi.install.area=/opt/app | true | -Dosgi.install.area=/opt/app " + "scenario | raw | isIncluded | vmArg ", + "jaas login config excluded | -Djava.security.auth.login.config=/etc/jaas.conf | false | -Djava.security.auth.login.config=/etc/jaas.conf ", + "java socks password excluded | -Djava.net.socks.password=hunter2 | false | -Djava.net.socks.password=hunter2 ", + "dd service excluded | -Ddd.service=myapp | false | -Ddd.service=myapp ", + "dd trace enabled excluded | -Ddd.trace.enabled=true | false | -Ddd.trace.enabled=true ", + "dd pwd excluded | -Ddd.db.pwd=hunter2 | false | -Ddd.db.pwd=hunter2 ", + "dd passphrase excluded | -Ddd.ssl.passphrase=topsecret | false | -Ddd.ssl.passphrase=topsecret ", + "dd api key excluded | -Ddd.api-key=deadbeef | false | -Ddd.api-key=deadbeef ", + "dd app key excluded | -Ddd.app-key=deadbeef | false | -Ddd.app-key=deadbeef ", + "dd application key excluded | -Ddd.application-key=deadbeef | false | -Ddd.application-key=deadbeef ", + "java logging kept | -Djava.util.logging.config.file=/opt/logging.props | true | -Djava.util.logging.config.file=/opt/logging.props", + "osgi install kept | -Dosgi.install.area=/opt/app | true | -Dosgi.install.area=/opt/app " }) public void testParseVmArgsExcludesSecretLikeSystemProperties( String raw, boolean isIncluded, String vmArg) { @@ -77,7 +87,7 @@ public void testParseVmArgsExcludesSecretLikeSystemProperties( @TableTest({ "scenario | resource | isIncluded | vmArg ", "truncated ibmj9 optionsfile | redacted-truncated-ibmj9-8-javacore.txt | true | -Xoptionsfile=/opt/REDACTED/java/8.0/jre/lib/ppc64/compressedrefs/options.default ", - "truncated ibmj9 dd arg | redacted-truncated-ibmj9-8-javacore.txt | true | -Ddd.service=REDACTED ", + "truncated ibmj9 dd arg | redacted-truncated-ibmj9-8-javacore.txt | false | -Ddd.service=REDACTED ", "truncated ibmj9 osgi arg | redacted-truncated-ibmj9-8-javacore.txt | true | -Dosgi.install.area=/opt/REDACTED ", "truncated ibmj9 status arg | redacted-truncated-ibmj9-8-javacore.txt | false | -Dwas.status.socket=REDACTED ", "truncated ibmj9 xtq arg | redacted-truncated-ibmj9-8-javacore.txt | false | -Dcom.ibm.xtq.processor.overrideSecureProcessing=true ", diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/CrashTrackingConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/CrashTrackingConfig.java index 7739d9ffdc..c31c26039d 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/CrashTrackingConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/CrashTrackingConfig.java @@ -28,6 +28,10 @@ public final class CrashTrackingConfig { "crashtracking.errors-intake.enabled"; public static final boolean CRASH_TRACKING_ERRORS_INTAKE_ENABLED_DEFAULT = false; + public static final String CRASH_TRACKING_EXTENDED_INFO_ENABLED = + "crashtracking.extended-info.enabled"; + public static final boolean CRASH_TRACKING_EXTENDED_INFO_ENABLED_DEFAULT = false; + public static final String CRASH_TRACKING_START_EARLY = "crashtracking.debug.start-force-first"; public static final boolean CRASH_TRACKING_START_EARLY_DEFAULT = false; 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 be8c530541..3b7534eafb 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -298,6 +298,8 @@ import static datadog.trace.api.config.CrashTrackingConfig.CRASH_TRACKING_AGENTLESS_DEFAULT; import static datadog.trace.api.config.CrashTrackingConfig.CRASH_TRACKING_ERRORS_INTAKE_ENABLED; import static datadog.trace.api.config.CrashTrackingConfig.CRASH_TRACKING_ERRORS_INTAKE_ENABLED_DEFAULT; +import static datadog.trace.api.config.CrashTrackingConfig.CRASH_TRACKING_EXTENDED_INFO_ENABLED; +import static datadog.trace.api.config.CrashTrackingConfig.CRASH_TRACKING_EXTENDED_INFO_ENABLED_DEFAULT; import static datadog.trace.api.config.CrashTrackingConfig.CRASH_TRACKING_TAGS; import static datadog.trace.api.config.CwsConfig.CWS_ENABLED; import static datadog.trace.api.config.CwsConfig.CWS_TLS_REFRESH; @@ -1003,6 +1005,7 @@ public static String getHostName() { private final boolean crashTrackingAgentless; private final Map crashTrackingTags; private final boolean crashTrackingErrorsIntakeEnabled; + private final boolean crashTrackingExtendedInfoEnabled; private final boolean clientIpEnabled; @@ -2220,6 +2223,9 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) crashTrackingErrorsIntakeEnabled = configProvider.getBoolean( CRASH_TRACKING_ERRORS_INTAKE_ENABLED, CRASH_TRACKING_ERRORS_INTAKE_ENABLED_DEFAULT); + crashTrackingExtendedInfoEnabled = + configProvider.getBoolean( + CRASH_TRACKING_EXTENDED_INFO_ENABLED, CRASH_TRACKING_EXTENDED_INFO_ENABLED_DEFAULT); float telemetryInterval = configProvider.getFloat(TELEMETRY_HEARTBEAT_INTERVAL, DEFAULT_TELEMETRY_HEARTBEAT_INTERVAL); @@ -3813,6 +3819,10 @@ public boolean isCrashTrackingErrorsIntakeEnabled() { return crashTrackingErrorsIntakeEnabled; } + public boolean isCrashTrackingExtendedInfoEnabled() { + return crashTrackingExtendedInfoEnabled; + } + public boolean isTelemetryEnabled() { return instrumenterConfig.isTelemetryEnabled(); } @@ -6122,6 +6132,8 @@ public String toString() { + crashTrackingAgentless + ", crashTrackingErrorsIntakeEnabled=" + crashTrackingErrorsIntakeEnabled + + ", crashTrackingExtendedInfoEnabled=" + + crashTrackingExtendedInfoEnabled + ", remoteConfigEnabled=" + remoteConfigEnabled + ", remoteConfigUrl=" diff --git a/metadata/supported-configurations.json b/metadata/supported-configurations.json index fac0f0dff2..bc84e57bbe 100644 --- a/metadata/supported-configurations.json +++ b/metadata/supported-configurations.json @@ -953,6 +953,14 @@ "aliases": [] } ], + "DD_CRASHTRACKING_EXTENDED_INFO_ENABLED": [ + { + "version": "A", + "type": "boolean", + "default": "false", + "aliases": [] + } + ], "DD_CRASHTRACKING_PROXY_HOST": [ { "version": "A",