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",