Skip to content

Commit 666f2af

Browse files
authored
Support DD_TRACE_<INTEGRATION>_ENABLED (#7718)
1 parent 84d0670 commit 666f2af

File tree

2 files changed

+90
-1
lines changed

2 files changed

+90
-1
lines changed

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,9 +286,35 @@ public boolean isIntegrationsEnabled() {
286286
return integrationsEnabled;
287287
}
288288

289+
/**
290+
* isIntegrationEnabled determines whether an integration under the specified name(s) is enabled
291+
* according to the following list of configurations, from highest to lowest precedence:
292+
* trace.name.enabled, trace.integration.name.enabled, integration.name.enabled. If none of these
293+
* configurations is set, the defaultEnabled value is used. All system properties take precedence
294+
* over all env vars.
295+
*
296+
* @param integrationNames the name(s) that represent(s) the integration
297+
* @param defaultEnabled true if enabled by default, else false
298+
* @return boolean on whether the integration is enabled
299+
*/
289300
public boolean isIntegrationEnabled(
290301
final Iterable<String> integrationNames, final boolean defaultEnabled) {
291-
return configProvider.isEnabled(integrationNames, "integration.", ".enabled", defaultEnabled);
302+
// If default is enabled, we want to disable individually.
303+
// If default is disabled, we want to enable individually.
304+
boolean anyEnabled = defaultEnabled;
305+
for (final String name : integrationNames) {
306+
final String primaryKey = "trace." + name + ".enabled";
307+
final String[] aliases = {
308+
"trace.integration." + name + ".enabled", "integration." + name + ".enabled"
309+
}; // listed in order of precedence
310+
final boolean configEnabled = configProvider.getBoolean(primaryKey, defaultEnabled, aliases);
311+
if (defaultEnabled) {
312+
anyEnabled &= configEnabled;
313+
} else {
314+
anyEnabled |= configEnabled;
315+
}
316+
}
317+
return anyEnabled;
292318
}
293319

294320
public boolean isIntegrationShortcutMatchingEnabled(

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

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class InstrumenterConfigTest extends DDSpecification {
88
setup:
99
environmentVariables.set("DD_INTEGRATION_ORDER_ENABLED", "false")
1010
environmentVariables.set("DD_INTEGRATION_TEST_ENV_ENABLED", "true")
11+
environmentVariables.set("DD_TRACE_NEW_ENV_ENABLED", "false")
1112
environmentVariables.set("DD_INTEGRATION_DISABLED_ENV_ENABLED", "false")
1213

1314
System.setProperty("dd.integration.order.enabled", "true")
@@ -16,6 +17,7 @@ class InstrumenterConfigTest extends DDSpecification {
1617

1718
environmentVariables.set("DD_INTEGRATION_ORDER_MATCHING_SHORTCUT_ENABLED", "false")
1819
environmentVariables.set("DD_INTEGRATION_TEST_ENV_MATCHING_SHORTCUT_ENABLED", "true")
20+
environmentVariables.set("DD_INTEGRATION_NEW_ENV_MATCHING_SHORTCUT_ENABLED", "false")
1921
environmentVariables.set("DD_INTEGRATION_DISABLED_ENV_MATCHING_SHORTCUT_ENABLED", "false")
2022

2123
System.setProperty("dd.integration.order.matching.shortcut.enabled", "true")
@@ -44,11 +46,72 @@ class InstrumenterConfigTest extends DDSpecification {
4446
["disabled-env", "test-env"] | false | true
4547
["test-prop", "disabled-prop"] | true | false
4648
["disabled-env", "test-env"] | true | false
49+
["new-env"] | true | false
4750
// spotless:on
4851

4952
integrationNames = new TreeSet<>(names)
5053
}
5154

55+
def setEnv(String key, String value) {
56+
environmentVariables.set(key, value)
57+
}
58+
59+
def setSysProp(String key, String value) {
60+
System.setProperty(key, value)
61+
}
62+
63+
def randomIntegrationEnabled() {
64+
return InstrumenterConfig.get().isIntegrationEnabled(["random"], true)
65+
}
66+
67+
def "verify integration enabled hierarchy"() {
68+
when:
69+
// the below should have no effect
70+
setEnv("DD_RANDOM_ENABLED", "false")
71+
setSysProp("dd.random.enabled", "false")
72+
73+
then:
74+
randomIntegrationEnabled() == true
75+
76+
when:
77+
setEnv("DD_INTEGRATION_RANDOM_ENABLED", "false")
78+
79+
then:
80+
randomIntegrationEnabled() == false
81+
82+
when:
83+
setEnv("DD_TRACE_INTEGRATION_RANDOM_ENABLED", "true")
84+
85+
then:
86+
randomIntegrationEnabled() == true
87+
88+
when:
89+
setEnv("DD_TRACE_RANDOM_ENABLED", "false")
90+
91+
then:
92+
randomIntegrationEnabled() == false
93+
94+
// assert all system properties take precedence over all env vars
95+
when:
96+
setSysProp("dd.integration.random.enabled", "true")
97+
98+
then:
99+
randomIntegrationEnabled() == true
100+
101+
when:
102+
setSysProp("dd.trace.integration.random.enabled", "false")
103+
104+
then:
105+
randomIntegrationEnabled() == false
106+
107+
when:
108+
setSysProp("dd.trace.random.enabled", "true")
109+
110+
then:
111+
randomIntegrationEnabled() == true
112+
113+
}
114+
52115
def "valid resolver presets"() {
53116
setup:
54117
injectSysConfig("resolver.cache.config", preset)

0 commit comments

Comments
 (0)