Skip to content

Commit 51a4a9d

Browse files
committed
chore(ssi): track the source of installation
1 parent 05d97db commit 51a4a9d

File tree

6 files changed

+69
-0
lines changed

6 files changed

+69
-0
lines changed

dd-java-agent/src/main/java/datadog/trace/bootstrap/AgentBootstrap.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
public final class AgentBootstrap {
4747
static final String LIB_INJECTION_ENABLED_ENV_VAR = "DD_INJECTION_ENABLED";
4848
static final String LIB_INJECTION_FORCE_SYS_PROP = "dd.inject.force";
49+
static final String LIB_INSTRUMENTATION_SOURCE_SYS_PROP = "dd.instrumentation.source";
4950

5051
private static final Class<?> thisClass = AgentBootstrap.class;
5152
private static final int MAX_EXCEPTION_CHAIN_LENGTH = 99;
@@ -134,6 +135,12 @@ private static void agentmainImpl(
134135
return;
135136
}
136137

138+
if (getConfig(LIB_INJECTION_ENABLED_ENV_VAR)) {
139+
recordInstrumentationSource("ssi");
140+
} else {
141+
recordInstrumentationSource("cmd_line");
142+
}
143+
137144
final URL agentJarURL = installAgentJar(inst);
138145
final Class<?> agentClass;
139146
try {
@@ -164,6 +171,10 @@ static boolean getConfig(String configName) {
164171
}
165172
}
166173

174+
private static void recordInstrumentationSource(String source) {
175+
SystemUtils.trySetProperty(LIB_INSTRUMENTATION_SOURCE_SYS_PROP, source);
176+
}
177+
167178
static boolean exceptionCauseChainContains(Throwable ex, String exClassName) {
168179
Set<Throwable> stack = Collections.newSetFromMap(new IdentityHashMap<>());
169180
Throwable t = ex;

dd-java-agent/src/main/java/datadog/trace/bootstrap/SystemUtils.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ public static String tryGetProperty(String property) {
2323
}
2424
}
2525

26+
public static String trySetProperty(String property, String value) {
27+
try {
28+
return System.setProperty(property, value);
29+
} catch (SecurityException e) {
30+
return null;
31+
}
32+
}
33+
2634
public static String getPropertyOrDefault(String property, String defaultValue) {
2735
try {
2836
return System.getProperty(property, defaultValue);

dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,9 @@ public final class ConfigDefaults {
240240
static final boolean DEFAULT_TELEMETRY_LOG_COLLECTION_ENABLED = true;
241241
static final int DEFAULT_TELEMETRY_DEPENDENCY_RESOLUTION_QUEUE_SIZE = 100000;
242242

243+
static final boolean DEFAULT_SSI_INJECTION_FORCE = false;
244+
static final String DEFAULT_INSTRUMENTATION_SOURCE = "manual";
245+
243246
static final Set<String> DEFAULT_TRACE_EXPERIMENTAL_FEATURES_ENABLED =
244247
new HashSet<>(
245248
asList("DD_TAGS", "DD_LOGS_INJECTION", "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED"));

dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,9 @@ public final class GeneralConfig {
103103

104104
public static final String STACK_TRACE_LENGTH_LIMIT = "stack.trace.length.limit";
105105

106+
public static final String SSI_INJECTION_ENABLED = "injection.enabled";
107+
public static final String SSI_INJECTION_FORCE = "inject.force";
108+
public static final String INSTRUMENTATION_SOURCE = "instrumentation.source";
109+
106110
private GeneralConfig() {}
107111
}

internal-api/src/main/java/datadog/trace/api/Config.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,10 @@ public static String getHostName() {
237237

238238
private final boolean traceGitMetadataEnabled;
239239

240+
private final boolean ssiInjectionForce;
241+
private final String ssiInjectionEnabled;
242+
private final String instrumentationSource;
243+
240244
private final Map<String, String> traceSamplingServiceRules;
241245
private final Map<String, String> traceSamplingOperationRules;
242246
private final String traceSamplingRules;
@@ -2041,6 +2045,13 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment())
20412045
"AppSec SCA is enabled but telemetry is disabled. AppSec SCA will not work.");
20422046
}
20432047

2048+
// Used to report telemetry on SSI injection
2049+
this.ssiInjectionEnabled = configProvider.getString(SSI_INJECTION_ENABLED);
2050+
this.ssiInjectionForce =
2051+
configProvider.getBoolean(SSI_INJECTION_FORCE, DEFAULT_SSI_INJECTION_FORCE);
2052+
this.instrumentationSource =
2053+
configProvider.getString(INSTRUMENTATION_SOURCE, DEFAULT_INSTRUMENTATION_SOURCE);
2054+
20442055
this.apmTracingEnabled = configProvider.getBoolean(GeneralConfig.APM_TRACING_ENABLED, true);
20452056

20462057
this.jdkSocketEnabled = configProvider.getBoolean(JDK_SOCKET_ENABLED, true);

internal-api/src/test/groovy/datadog/trace/api/ConfigTest.groovy

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ import static datadog.trace.api.config.GeneralConfig.SITE
5858
import static datadog.trace.api.config.GeneralConfig.TAGS
5959
import static datadog.trace.api.config.GeneralConfig.TRACER_METRICS_IGNORED_RESOURCES
6060
import static datadog.trace.api.config.GeneralConfig.VERSION
61+
import static datadog.trace.api.config.GeneralConfig.SSI_INJECTION_ENABLED
62+
import static datadog.trace.api.config.GeneralConfig.SSI_INJECTION_FORCE
63+
import static datadog.trace.api.config.GeneralConfig.INSTRUMENTATION_SOURCE
6164
import static datadog.trace.api.config.JmxFetchConfig.JMX_FETCH_CHECK_PERIOD
6265
import static datadog.trace.api.config.JmxFetchConfig.JMX_FETCH_ENABLED
6366
import static datadog.trace.api.config.JmxFetchConfig.JMX_FETCH_METRICS_CONFIGS
@@ -2597,6 +2600,35 @@ class ConfigTest extends DDSpecification {
25972600
"450" | 450
25982601
}
25992602
2603+
def "ssi injection enabled"() {
2604+
when:
2605+
def prop = new Properties()
2606+
prop.setProperty(SSI_INJECTION_ENABLED, "tracer")
2607+
Config config = Config.get(prop)
2608+
2609+
then:
2610+
config.ssiInjectionEnabled == "tracer"
2611+
}
2612+
2613+
def "ssi inject force"() {
2614+
when:
2615+
def prop = new Properties()
2616+
prop.setProperty(SSI_INJECTION_FORCE, true)
2617+
Config config = Config.get(prop)
2618+
2619+
then:
2620+
config.ssiInjectionForce == true
2621+
}
2622+
2623+
def "instrumentation source"() {
2624+
when:
2625+
def prop = new Properties()
2626+
prop.setProperty(INSTRUMENTATION_SOURCE, "ssi")
2627+
2628+
then:
2629+
config.instrumentationSource == "ssi"
2630+
}
2631+
26002632
def "long running trace invalid flush_interval set to default: #configuredFlushInterval"() {
26012633
when:
26022634
def prop = new Properties()

0 commit comments

Comments
 (0)