Skip to content

Commit ffe9afc

Browse files
Implement backend config setting and killswitch for impacted tests detection
1 parent c4928eb commit ffe9afc

File tree

9 files changed

+58
-6
lines changed

9 files changed

+58
-6
lines changed

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/CiVisibilitySettings.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ public class CiVisibilitySettings {
88

99
public static final CiVisibilitySettings DEFAULT =
1010
new CiVisibilitySettings(
11-
false, false, false, false, false, EarlyFlakeDetectionSettings.DEFAULT);
11+
false, false, false, false, false, false, EarlyFlakeDetectionSettings.DEFAULT);
1212

1313
private final boolean itrEnabled;
1414
private final boolean codeCoverage;
1515
private final boolean testsSkipping;
1616
private final boolean requireGit;
1717
private final boolean flakyTestRetriesEnabled;
18+
private final boolean impactedTestsDetectionEnabled;
1819
private final EarlyFlakeDetectionSettings earlyFlakeDetectionSettings;
1920

2021
private CiVisibilitySettings(
@@ -23,12 +24,14 @@ private CiVisibilitySettings(
2324
boolean testsSkipping,
2425
boolean requireGit,
2526
boolean flakyTestRetriesEnabled,
27+
boolean impactedTestsDetectionEnabled,
2628
EarlyFlakeDetectionSettings earlyFlakeDetectionSettings) {
2729
this.itrEnabled = itrEnabled;
2830
this.codeCoverage = codeCoverage;
2931
this.testsSkipping = testsSkipping;
3032
this.requireGit = requireGit;
3133
this.flakyTestRetriesEnabled = flakyTestRetriesEnabled;
34+
this.impactedTestsDetectionEnabled = impactedTestsDetectionEnabled;
3235
this.earlyFlakeDetectionSettings = earlyFlakeDetectionSettings;
3336
}
3437

@@ -52,6 +55,10 @@ public boolean isFlakyTestRetriesEnabled() {
5255
return flakyTestRetriesEnabled;
5356
}
5457

58+
public boolean isImpactedTestsDetectionEnabled() {
59+
return impactedTestsDetectionEnabled;
60+
}
61+
5562
public EarlyFlakeDetectionSettings getEarlyFlakeDetectionSettings() {
5663
return earlyFlakeDetectionSettings;
5764
}
@@ -76,6 +83,7 @@ public CiVisibilitySettings fromJson(Map<String, Object> json) {
7683
getBoolean(json, "tests_skipping", false),
7784
getBoolean(json, "require_git", false),
7885
getBoolean(json, "flaky_test_retries_enabled", false),
86+
getBoolean(json, "impacted_tests_enabled", false),
7987
EarlyFlakeDetectionSettingsJsonAdapter.INSTANCE.fromJson(
8088
(Map<String, Object>) json.get("early_flake_detection")));
8189
}

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettings.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class ExecutionSettings {
2222
false,
2323
false,
2424
false,
25+
false,
2526
EarlyFlakeDetectionSettings.DEFAULT,
2627
null,
2728
Collections.emptyMap(),
@@ -34,6 +35,7 @@ public class ExecutionSettings {
3435
private final boolean codeCoverageEnabled;
3536
private final boolean testSkippingEnabled;
3637
private final boolean flakyTestRetriesEnabled;
38+
private final boolean impactedTestsDetectionEnabled;
3739
@Nonnull private final EarlyFlakeDetectionSettings earlyFlakeDetectionSettings;
3840
@Nullable private final String itrCorrelationId;
3941
@Nonnull private final Map<TestIdentifier, TestMetadata> skippableTests;
@@ -47,6 +49,7 @@ public ExecutionSettings(
4749
boolean codeCoverageEnabled,
4850
boolean testSkippingEnabled,
4951
boolean flakyTestRetriesEnabled,
52+
boolean impactedTestsDetectionEnabled,
5053
@Nonnull EarlyFlakeDetectionSettings earlyFlakeDetectionSettings,
5154
@Nullable String itrCorrelationId,
5255
@Nonnull Map<TestIdentifier, TestMetadata> skippableTests,
@@ -58,6 +61,7 @@ public ExecutionSettings(
5861
this.codeCoverageEnabled = codeCoverageEnabled;
5962
this.testSkippingEnabled = testSkippingEnabled;
6063
this.flakyTestRetriesEnabled = flakyTestRetriesEnabled;
64+
this.impactedTestsDetectionEnabled = impactedTestsDetectionEnabled;
6165
this.earlyFlakeDetectionSettings = earlyFlakeDetectionSettings;
6266
this.itrCorrelationId = itrCorrelationId;
6367
this.skippableTests = skippableTests;
@@ -87,6 +91,10 @@ public boolean isFlakyTestRetriesEnabled() {
8791
return flakyTestRetriesEnabled;
8892
}
8993

94+
public boolean isImpactedTestsDetectionEnabled() {
95+
return impactedTestsDetectionEnabled;
96+
}
97+
9098
@Nonnull
9199
public EarlyFlakeDetectionSettings getEarlyFlakeDetectionSettings() {
92100
return earlyFlakeDetectionSettings;
@@ -169,6 +177,7 @@ public static class ExecutionSettingsSerializer {
169177
private static final int CODE_COVERAGE_ENABLED_FLAG = 2;
170178
private static final int TEST_SKIPPING_ENABLED_FLAG = 4;
171179
private static final int FLAKY_TEST_RETRIES_ENABLED_FLAG = 8;
180+
private static final int IMPACTED_TESTS_DETECTION_ENABLED_FLAG = 16;
172181

173182
public static ByteBuffer serialize(ExecutionSettings settings) {
174183
Serializer s = new Serializer();
@@ -178,7 +187,10 @@ public static ByteBuffer serialize(ExecutionSettings settings) {
178187
((settings.itrEnabled ? ITR_ENABLED_FLAG : 0)
179188
| (settings.codeCoverageEnabled ? CODE_COVERAGE_ENABLED_FLAG : 0)
180189
| (settings.testSkippingEnabled ? TEST_SKIPPING_ENABLED_FLAG : 0)
181-
| (settings.flakyTestRetriesEnabled ? FLAKY_TEST_RETRIES_ENABLED_FLAG : 0));
190+
| (settings.flakyTestRetriesEnabled ? FLAKY_TEST_RETRIES_ENABLED_FLAG : 0)
191+
| (settings.impactedTestsDetectionEnabled
192+
? IMPACTED_TESTS_DETECTION_ENABLED_FLAG
193+
: 0));
182194
s.write(flags);
183195

184196
EarlyFlakeDetectionSettingsSerializer.serialize(s, settings.earlyFlakeDetectionSettings);
@@ -204,6 +216,7 @@ public static ExecutionSettings deserialize(ByteBuffer buffer) {
204216
boolean codeCoverageEnabled = (flags & CODE_COVERAGE_ENABLED_FLAG) != 0;
205217
boolean testSkippingEnabled = (flags & TEST_SKIPPING_ENABLED_FLAG) != 0;
206218
boolean flakyTestRetriesEnabled = (flags & FLAKY_TEST_RETRIES_ENABLED_FLAG) != 0;
219+
boolean impactedTestsDetectionEnabled = (flags & IMPACTED_TESTS_DETECTION_ENABLED_FLAG) != 0;
207220

208221
EarlyFlakeDetectionSettings earlyFlakeDetectionSettings =
209222
EarlyFlakeDetectionSettingsSerializer.deserialize(buffer);
@@ -228,6 +241,7 @@ public static ExecutionSettings deserialize(ByteBuffer buffer) {
228241
codeCoverageEnabled,
229242
testSkippingEnabled,
230243
flakyTestRetriesEnabled,
244+
impactedTestsDetectionEnabled,
231245
earlyFlakeDetectionSettings,
232246
itrCorrelationId,
233247
skippableTests,

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/config/ExecutionSettingsFactoryImpl.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ private TracerEnvironment buildTracerEnvironment(
114114
boolean codeCoverageEnabled = isCodeCoverageEnabled(ciVisibilitySettings);
115115
boolean testSkippingEnabled = isTestSkippingEnabled(ciVisibilitySettings);
116116
boolean flakyTestRetriesEnabled = isFlakyTestRetriesEnabled(ciVisibilitySettings);
117+
boolean impactedTestsDetectionEnabled = isImpactedTestsDetectionEnabled(ciVisibilitySettings);
117118
boolean earlyFlakeDetectionEnabled = isEarlyFlakeDetectionEnabled(ciVisibilitySettings);
118119

119120
LOGGER.info(
@@ -122,6 +123,7 @@ private TracerEnvironment buildTracerEnvironment(
122123
+ "Per-test code coverage - {},\n"
123124
+ "Tests skipping - {},\n"
124125
+ "Early flakiness detection - {},\n"
126+
+ "Impacted tests detection - {},\n"
125127
+ "Auto test retries - {}",
126128
repositoryRoot,
127129
tracerEnvironment.getConfigurations().getRuntimeName(),
@@ -131,6 +133,7 @@ private TracerEnvironment buildTracerEnvironment(
131133
codeCoverageEnabled,
132134
testSkippingEnabled,
133135
earlyFlakeDetectionEnabled,
136+
impactedTestsDetectionEnabled,
134137
flakyTestRetriesEnabled);
135138

136139
String itrCorrelationId = null;
@@ -170,7 +173,7 @@ private TracerEnvironment buildTracerEnvironment(
170173
moduleNames.addAll(knownTestsByModule.keySet());
171174
}
172175

173-
Diff pullRequestDiff = getPullRequestDiff();
176+
Diff pullRequestDiff = getPullRequestDiff(impactedTestsDetectionEnabled);
174177

175178
Map<String, ExecutionSettings> settingsByModule = new HashMap<>();
176179
for (String moduleName : moduleNames) {
@@ -181,6 +184,7 @@ private TracerEnvironment buildTracerEnvironment(
181184
codeCoverageEnabled,
182185
testSkippingEnabled,
183186
flakyTestRetriesEnabled,
187+
impactedTestsDetectionEnabled,
184188
earlyFlakeDetectionEnabled
185189
? ciVisibilitySettings.getEarlyFlakeDetectionSettings()
186190
: EarlyFlakeDetectionSettings.DEFAULT,
@@ -235,6 +239,11 @@ private boolean isFlakyTestRetriesEnabled(CiVisibilitySettings ciVisibilitySetti
235239
&& config.isCiVisibilityFlakyRetryEnabled();
236240
}
237241

242+
private boolean isImpactedTestsDetectionEnabled(CiVisibilitySettings ciVisibilitySettings) {
243+
return ciVisibilitySettings.isImpactedTestsDetectionEnabled()
244+
&& config.isCiVisibilityImpactedTestsDetectionEnabled();
245+
}
246+
238247
private boolean isEarlyFlakeDetectionEnabled(CiVisibilitySettings ciVisibilitySettings) {
239248
return ciVisibilitySettings.getEarlyFlakeDetectionSettings().isEnabled()
240249
&& config.isCiVisibilityEarlyFlakeDetectionEnabled();
@@ -291,13 +300,13 @@ private Map<String, Collection<TestIdentifier>> getKnownTestsByModule(
291300
}
292301

293302
@NotNull
294-
private Diff getPullRequestDiff() {
295-
if (repositoryRoot == null) {
303+
private Diff getPullRequestDiff(boolean impactedTestsDetectionEnabled) {
304+
if (repositoryRoot == null || !impactedTestsDetectionEnabled) {
296305
return Diff.EMPTY;
297306
}
298-
// FIXME nikita: return empty diff if impacted tests detection is disabled (killswitch)
299307
// FIXME nikita: add telemetry
300308
// FIXME nikita: add file-based granularity fallback if Git executable is not available?
309+
// FIXME nikita: add integration/smoke tests
301310
try {
302311
GitClient gitClient = gitClientFactory.create(repositoryRoot);
303312
return gitClient.getGitDiff(

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,11 @@ private Map<String, String> getPropertiesPropagatedToChildProcess(
158158
CiVisibilityConfig.CIVISIBILITY_FLAKY_RETRY_ENABLED),
159159
Boolean.toString(executionSettings.isFlakyTestRetriesEnabled()));
160160

161+
propagatedSystemProperties.put(
162+
Strings.propertyNameToSystemPropertyName(
163+
CiVisibilityConfig.CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED),
164+
Boolean.toString(executionSettings.isImpactedTestsDetectionEnabled()));
165+
161166
propagatedSystemProperties.put(
162167
Strings.propertyNameToSystemPropertyName(
163168
CiVisibilityConfig.CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLED),

dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/config/ConfigurationApiImplTest.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class ConfigurationApiImplTest extends Specification {
7676
' "tests_skipping": true,' +
7777
' "require_git": true,' +
7878
' "flaky_test_retries_enabled": true,' +
79+
' "impacted_tests_enabled": true,' +
7980
' "early_flake_detection": {' +
8081
' "enabled": true,' +
8182
' "slow_test_retries": {' +
@@ -419,6 +420,7 @@ class ConfigurationApiImplTest extends Specification {
419420
settings.testsSkippingEnabled
420421
settings.gitUploadRequired
421422
settings.flakyTestRetriesEnabled
423+
settings.impactedTestsDetectionEnabled
422424
settings.earlyFlakeDetectionSettings.enabled
423425
settings.earlyFlakeDetectionSettings.faultySessionThreshold == 30
424426
settings.earlyFlakeDetectionSettings.getExecutions(TimeUnit.SECONDS.toMillis(3)) == 10

dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/config/ExecutionSettingsTest.groovy

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class ExecutionSettingsTest extends Specification {
2626
false,
2727
false,
2828
false,
29+
false,
2930
EarlyFlakeDetectionSettings.DEFAULT,
3031
null,
3132
[:],
@@ -39,6 +40,7 @@ class ExecutionSettingsTest extends Specification {
3940
true,
4041
false,
4142
true,
43+
true,
4244
new EarlyFlakeDetectionSettings(true, [], 10),
4345
"",
4446
[new TestIdentifier("bc", "def", "g"): new TestMetadata(true), new TestIdentifier("de", "f", null): new TestMetadata(false)],
@@ -53,6 +55,7 @@ class ExecutionSettingsTest extends Specification {
5355
false,
5456
true,
5557
false,
58+
true,
5659
new EarlyFlakeDetectionSettings(true, [new EarlyFlakeDetectionSettings.ExecutionsByDuration(10, 20)], 10),
5760
"itrCorrelationId",
5861
[:],
@@ -71,6 +74,7 @@ class ExecutionSettingsTest extends Specification {
7174
true,
7275
true,
7376
true,
77+
true,
7478
new EarlyFlakeDetectionSettings(true, [new EarlyFlakeDetectionSettings.ExecutionsByDuration(10, 20), new EarlyFlakeDetectionSettings.ExecutionsByDuration(30, 40)], 10),
7579
"itrCorrelationId",
7680
[new TestIdentifier("bc", "def", null): new TestMetadata(true), new TestIdentifier("de", "f", null): new TestMetadata(true)],

dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner {
121121
false,
122122
itrEnabled,
123123
flakyRetryEnabled,
124+
false, // FIXME nikita: add instrumentation tests for impacted tests detection
124125
earlyFlakinessDetectionSettings,
125126
itrEnabled ? "itrCorrelationId" : null,
126127
skippableTestsWithMetadata,

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ public final class CiVisibilityConfig {
5151
public static final String CIVISIBILITY_RESOURCE_FOLDER_NAMES =
5252
"civisibility.resource.folder.names";
5353
public static final String CIVISIBILITY_FLAKY_RETRY_ENABLED = "civisibility.flaky.retry.enabled";
54+
public static final String CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED =
55+
"civisibility.impacted.tests.detection.enabled";
5456
public static final String CIVISIBILITY_FLAKY_RETRY_ONLY_KNOWN_FLAKES =
5557
"civisibility.flaky.retry.only.known.flakes";
5658
public static final String CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLED =

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ public static String getHostName() {
356356
private final String ciVisibilityInjectedTracerVersion;
357357
private final List<String> ciVisibilityResourceFolderNames;
358358
private final boolean ciVisibilityFlakyRetryEnabled;
359+
private final boolean ciVisibilityImpactedTestsDetectionEnabled;
359360
private final boolean ciVisibilityFlakyRetryOnlyKnownFlakes;
360361
private final int ciVisibilityFlakyRetryCount;
361362
private final int ciVisibilityTotalFlakyRetryCount;
@@ -1487,6 +1488,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment())
14871488
CIVISIBILITY_RESOURCE_FOLDER_NAMES, DEFAULT_CIVISIBILITY_RESOURCE_FOLDER_NAMES);
14881489
ciVisibilityFlakyRetryEnabled =
14891490
configProvider.getBoolean(CIVISIBILITY_FLAKY_RETRY_ENABLED, true);
1491+
ciVisibilityImpactedTestsDetectionEnabled =
1492+
configProvider.getBoolean(CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED, true);
14901493
ciVisibilityFlakyRetryOnlyKnownFlakes =
14911494
configProvider.getBoolean(CIVISIBILITY_FLAKY_RETRY_ONLY_KNOWN_FLAKES, false);
14921495
ciVisibilityEarlyFlakeDetectionEnabled =
@@ -2894,6 +2897,10 @@ public boolean isCiVisibilityFlakyRetryEnabled() {
28942897
return ciVisibilityFlakyRetryEnabled;
28952898
}
28962899

2900+
public boolean isCiVisibilityImpactedTestsDetectionEnabled() {
2901+
return ciVisibilityImpactedTestsDetectionEnabled;
2902+
}
2903+
28972904
public boolean isCiVisibilityFlakyRetryOnlyKnownFlakes() {
28982905
return ciVisibilityFlakyRetryOnlyKnownFlakes;
28992906
}

0 commit comments

Comments
 (0)