Skip to content

Commit 126645d

Browse files
Add error tag for library configuration request (#10856)
feat: implement _dd.ci.library_configuration_error tag fix: update default settings chore: trigger CI Merge branch 'master' into daniel.mohedano/configuration-failures-tag Co-authored-by: daniel.mohedano <daniel.mohedano@datadoghq.com>
1 parent d4ecd3d commit 126645d

File tree

17 files changed

+132
-26
lines changed

17 files changed

+132
-26
lines changed

dd-java-agent/agent-ci-visibility/civisibility-instrumentation-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,8 @@ abstract class CiVisibilityInstrumentationTest extends InstrumentationSpecificat
248248
settings.quarantinedTests,
249249
settings.disabledTests,
250250
settings.attemptToFixTests,
251-
settings.diff)
251+
settings.diff,
252+
false)
252253
}
253254
}
254255

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

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,24 @@ public class CiVisibilitySettings {
2121
false,
2222
EarlyFlakeDetectionSettings.DEFAULT,
2323
TestManagementSettings.DEFAULT,
24-
null);
24+
null,
25+
false);
26+
27+
public static final CiVisibilitySettings REQUEST_ERROR =
28+
new CiVisibilitySettings(
29+
false,
30+
false,
31+
false,
32+
false,
33+
false,
34+
false,
35+
false,
36+
false,
37+
false,
38+
EarlyFlakeDetectionSettings.DEFAULT,
39+
TestManagementSettings.DEFAULT,
40+
null,
41+
true);
2542

2643
private final boolean itrEnabled;
2744
private final boolean codeCoverage;
@@ -35,6 +52,7 @@ public class CiVisibilitySettings {
3552
private final EarlyFlakeDetectionSettings earlyFlakeDetectionSettings;
3653
private final TestManagementSettings testManagementSettings;
3754
@Nullable private final String defaultBranch;
55+
private final boolean requestError;
3856

3957
CiVisibilitySettings(
4058
boolean itrEnabled,
@@ -48,7 +66,8 @@ public class CiVisibilitySettings {
4866
boolean failedTestReplayEnabled,
4967
EarlyFlakeDetectionSettings earlyFlakeDetectionSettings,
5068
TestManagementSettings testManagementSettings,
51-
@Nullable String defaultBranch) {
69+
@Nullable String defaultBranch,
70+
boolean requestError) {
5271
this.itrEnabled = itrEnabled;
5372
this.codeCoverage = codeCoverage;
5473
this.testsSkipping = testsSkipping;
@@ -61,6 +80,7 @@ public class CiVisibilitySettings {
6180
this.earlyFlakeDetectionSettings = earlyFlakeDetectionSettings;
6281
this.testManagementSettings = testManagementSettings;
6382
this.defaultBranch = defaultBranch;
83+
this.requestError = requestError;
6484
}
6585

6686
public boolean isItrEnabled() {
@@ -112,6 +132,10 @@ public String getDefaultBranch() {
112132
return defaultBranch;
113133
}
114134

135+
public boolean isRequestError() {
136+
return requestError;
137+
}
138+
115139
@Override
116140
public boolean equals(Object o) {
117141
if (this == o) {
@@ -132,7 +156,8 @@ public boolean equals(Object o) {
132156
&& failedTestReplayEnabled == that.failedTestReplayEnabled
133157
&& Objects.equals(earlyFlakeDetectionSettings, that.earlyFlakeDetectionSettings)
134158
&& Objects.equals(testManagementSettings, that.testManagementSettings)
135-
&& Objects.equals(defaultBranch, that.defaultBranch);
159+
&& Objects.equals(defaultBranch, that.defaultBranch)
160+
&& requestError == that.requestError;
136161
}
137162

138163
@Override
@@ -149,7 +174,8 @@ public int hashCode() {
149174
failedTestReplayEnabled,
150175
earlyFlakeDetectionSettings,
151176
testManagementSettings,
152-
defaultBranch);
177+
defaultBranch,
178+
requestError);
153179
}
154180

155181
public interface Factory {
@@ -180,7 +206,8 @@ public CiVisibilitySettings fromJson(Map<String, Object> json) {
180206
(Map<String, Object>) json.get("early_flake_detection")),
181207
TestManagementSettings.JsonAdapter.INSTANCE.fromJson(
182208
(Map<String, Object>) json.get("test_management")),
183-
getString(json, "default_branch", null));
209+
getString(json, "default_branch", null),
210+
false); // Correctly deserialized settings response is never considered as "errored"
184211
}
185212

186213
private static boolean getBoolean(

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

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,30 @@ public class ExecutionSettings {
3838
Collections.emptyList(),
3939
Collections.emptyList(),
4040
Collections.emptyList(),
41-
LineDiff.EMPTY);
41+
LineDiff.EMPTY,
42+
false);
43+
44+
public static final ExecutionSettings REQUEST_ERROR =
45+
new ExecutionSettings(
46+
false,
47+
false,
48+
false,
49+
false,
50+
false,
51+
false,
52+
false,
53+
EarlyFlakeDetectionSettings.DEFAULT,
54+
TestManagementSettings.DEFAULT,
55+
null,
56+
Collections.emptyMap(),
57+
Collections.emptyMap(),
58+
null,
59+
null,
60+
Collections.emptyList(),
61+
Collections.emptyList(),
62+
Collections.emptyList(),
63+
LineDiff.EMPTY,
64+
true);
4265

4366
private final boolean itrEnabled;
4467
private final boolean codeCoverageEnabled;
@@ -55,6 +78,7 @@ public class ExecutionSettings {
5578
@Nonnull private final Map<TestFQN, Integer> testSettings;
5679
@Nonnull private final Map<TestSetting, Integer> settingsCount;
5780
@Nonnull private final Diff pullRequestDiff;
81+
private final boolean configurationError;
5882

5983
public ExecutionSettings(
6084
boolean itrEnabled,
@@ -74,7 +98,8 @@ public ExecutionSettings(
7498
@Nonnull Collection<TestFQN> quarantinedTests,
7599
@Nonnull Collection<TestFQN> disabledTests,
76100
@Nonnull Collection<TestFQN> attemptToFixTests,
77-
@Nonnull Diff pullRequestDiff) {
101+
@Nonnull Diff pullRequestDiff,
102+
boolean configurationError) {
78103
this.itrEnabled = itrEnabled;
79104
this.codeCoverageEnabled = codeCoverageEnabled;
80105
this.testSkippingEnabled = testSkippingEnabled;
@@ -88,6 +113,7 @@ public ExecutionSettings(
88113
this.skippableTests = skippableTests;
89114
this.skippableTestsCoverage = skippableTestsCoverage;
90115
this.pullRequestDiff = pullRequestDiff;
116+
this.configurationError = configurationError;
91117

92118
testSettings = new HashMap<>();
93119
if (flakyTests != null) {
@@ -127,7 +153,8 @@ private ExecutionSettings(
127153
@Nonnull Map<String, BitSet> skippableTestsCoverage,
128154
@Nonnull Map<TestFQN, Integer> testSettings,
129155
@Nonnull EnumMap<TestSetting, Integer> settingsCount,
130-
@Nonnull Diff pullRequestDiff) {
156+
@Nonnull Diff pullRequestDiff,
157+
boolean configurationError) {
131158
this.itrEnabled = itrEnabled;
132159
this.codeCoverageEnabled = codeCoverageEnabled;
133160
this.testSkippingEnabled = testSkippingEnabled;
@@ -143,6 +170,7 @@ private ExecutionSettings(
143170
this.testSettings = testSettings;
144171
this.settingsCount = settingsCount;
145172
this.pullRequestDiff = pullRequestDiff;
173+
this.configurationError = configurationError;
146174
}
147175

148176
/**
@@ -249,6 +277,10 @@ public Diff getPullRequestDiff() {
249277
return pullRequestDiff;
250278
}
251279

280+
public boolean isConfigurationError() {
281+
return configurationError;
282+
}
283+
252284
@Override
253285
public boolean equals(Object o) {
254286
if (this == o) {
@@ -272,7 +304,8 @@ public boolean equals(Object o) {
272304
&& Objects.equals(skippableTestsCoverage, that.skippableTestsCoverage)
273305
&& Objects.equals(testSettings, that.testSettings)
274306
&& Objects.equals(settingsCount, that.settingsCount)
275-
&& Objects.equals(pullRequestDiff, that.pullRequestDiff);
307+
&& Objects.equals(pullRequestDiff, that.pullRequestDiff)
308+
&& configurationError == that.configurationError;
276309
}
277310

278311
@Override
@@ -292,7 +325,8 @@ public int hashCode() {
292325
skippableTestsCoverage,
293326
testSettings,
294327
settingsCount,
295-
pullRequestDiff);
328+
pullRequestDiff,
329+
configurationError);
296330
}
297331

298332
public static class Serializer {
@@ -304,6 +338,7 @@ public static class Serializer {
304338
private static final int IMPACTED_TESTS_DETECTION_ENABLED_FLAG = 16;
305339
private static final int CODE_COVERAGE_REPORT_UPLOAD_ENABLED_FLAG = 32;
306340
private static final int FAILED_TEST_REPLAY_ENABLED_FLAG = 64;
341+
private static final int CONFIGURATION_ERROR_FLAG = 128;
307342

308343
public static ByteBuffer serialize(ExecutionSettings settings) {
309344
datadog.trace.civisibility.ipc.serialization.Serializer s =
@@ -321,7 +356,8 @@ public static ByteBuffer serialize(ExecutionSettings settings) {
321356
| (settings.codeCoverageReportUploadEnabled
322357
? CODE_COVERAGE_REPORT_UPLOAD_ENABLED_FLAG
323358
: 0)
324-
| (settings.failedTestReplayEnabled ? FAILED_TEST_REPLAY_ENABLED_FLAG : 0));
359+
| (settings.failedTestReplayEnabled ? FAILED_TEST_REPLAY_ENABLED_FLAG : 0)
360+
| (settings.configurationError ? CONFIGURATION_ERROR_FLAG : 0));
325361
s.write(flags);
326362

327363
EarlyFlakeDetectionSettings.Serializer.serialize(s, settings.earlyFlakeDetectionSettings);
@@ -363,6 +399,7 @@ public static ExecutionSettings deserialize(ByteBuffer buffer) {
363399
boolean codeCoverageReportUploadEnabled =
364400
(flags & CODE_COVERAGE_REPORT_UPLOAD_ENABLED_FLAG) != 0;
365401
boolean failedTestReplayEnabled = (flags & FAILED_TEST_REPLAY_ENABLED_FLAG) != 0;
402+
boolean configurationError = (flags & CONFIGURATION_ERROR_FLAG) != 0;
366403

367404
EarlyFlakeDetectionSettings earlyFlakeDetectionSettings =
368405
EarlyFlakeDetectionSettings.Serializer.deserialize(buffer);
@@ -414,7 +451,8 @@ public static ExecutionSettings deserialize(ByteBuffer buffer) {
414451
skippableTestsCoverage,
415452
testSettings,
416453
settingsCount,
417-
diff);
454+
diff,
455+
configurationError);
418456
}
419457
}
420458
}

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,11 @@ private Map<String, ExecutionSettings> create(TracerEnvironment tracerEnvironmen
131131
} catch (InterruptedException e) {
132132
Thread.currentThread().interrupt();
133133
LOGGER.error("Interrupted while creating execution settings");
134-
return Collections.singletonMap(DEFAULT_SETTINGS, ExecutionSettings.EMPTY);
134+
return Collections.singletonMap(DEFAULT_SETTINGS, ExecutionSettings.REQUEST_ERROR);
135135

136136
} catch (ExecutionException e) {
137137
LOGGER.error("Error while creating execution settings", e);
138-
return Collections.singletonMap(DEFAULT_SETTINGS, ExecutionSettings.EMPTY);
138+
return Collections.singletonMap(DEFAULT_SETTINGS, ExecutionSettings.REQUEST_ERROR);
139139

140140
} finally {
141141
settingsExecutor.shutdownNow();
@@ -146,6 +146,10 @@ private Map<String, ExecutionSettings> create(TracerEnvironment tracerEnvironmen
146146
private Map<String, ExecutionSettings> doCreate(
147147
TracerEnvironment tracerEnvironment, CiVisibilitySettings settings, ExecutorService executor)
148148
throws InterruptedException, ExecutionException {
149+
if (settings.isRequestError()) {
150+
return Collections.singletonMap(DEFAULT_SETTINGS, ExecutionSettings.REQUEST_ERROR);
151+
}
152+
149153
boolean itrEnabled =
150154
isFeatureEnabled(
151155
settings, CiVisibilitySettings::isItrEnabled, Config::isCiVisibilityItrEnabled);
@@ -287,7 +291,8 @@ private Map<String, ExecutionSettings> doCreate(
287291
quarantinedTestsByModule.getOrDefault(moduleName, Collections.emptyList()),
288292
disabledTestsByModule.getOrDefault(moduleName, Collections.emptyList()),
289293
attemptToFixTestsByModule.getOrDefault(moduleName, Collections.emptyList()),
290-
pullRequestDiff));
294+
pullRequestDiff,
295+
false));
291296
}
292297
return settingsByModule;
293298
}
@@ -307,8 +312,8 @@ private CiVisibilitySettings getCiVisibilitySettings(TracerEnvironment tracerEnv
307312
}
308313

309314
} catch (Exception e) {
310-
LOGGER.warn("Error while obtaining CI Visibility settings", e);
311-
return CiVisibilitySettings.DEFAULT;
315+
LOGGER.error("Error while obtaining CI Visibility settings", e);
316+
return CiVisibilitySettings.REQUEST_ERROR;
312317
}
313318
}
314319

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static datadog.trace.civisibility.Constants.CI_VISIBILITY_INSTRUMENTATION_NAME;
66

77
import datadog.trace.api.Config;
8+
import datadog.trace.api.DDTags;
89
import datadog.trace.api.DDTraceId;
910
import datadog.trace.api.civisibility.CIConstants;
1011
import datadog.trace.api.civisibility.DDTest;
@@ -90,6 +91,7 @@ public TestImpl(
9091
Codeowners codeowners,
9192
CoverageStore.Factory coverageStoreFactory,
9293
ExecutionResults executionResults,
94+
boolean configurationError,
9395
@Nonnull Collection<LibraryCapability> capabilities,
9496
Consumer<AgentSpan> onSpanFinish) {
9597
this.instrumentation = instrumentation;
@@ -157,6 +159,10 @@ public TestImpl(
157159

158160
testDecorator.afterStart(span);
159161

162+
if (configurationError) {
163+
span.setTag(DDTags.CI_LIBRARY_CONFIGURATION_ERROR, true);
164+
}
165+
160166
metricCollector.add(CiVisibilityCountMetric.EVENT_CREATED, 1, instrumentation, EventType.TEST);
161167

162168
if (instrumentationType == InstrumentationType.MANUAL_API) {

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import static datadog.trace.civisibility.Constants.CI_VISIBILITY_INSTRUMENTATION_NAME;
66

77
import datadog.trace.api.Config;
8+
import datadog.trace.api.DDTags;
89
import datadog.trace.api.civisibility.DDTestSuite;
910
import datadog.trace.api.civisibility.config.LibraryCapability;
1011
import datadog.trace.api.civisibility.coverage.CoverageStore;
@@ -53,6 +54,7 @@ public class TestSuiteImpl implements DDTestSuite {
5354
private final CoverageStore.Factory coverageStoreFactory;
5455
private final ExecutionResults executionResults;
5556
private final boolean parallelized;
57+
private final boolean configurationError;
5658
private final Collection<LibraryCapability> capabilities;
5759
private final Consumer<AgentSpan> onSpanFinish;
5860
private final SpanTagsPropagator tagsPropagator;
@@ -75,6 +77,7 @@ public TestSuiteImpl(
7577
LinesResolver linesResolver,
7678
CoverageStore.Factory coverageStoreFactory,
7779
ExecutionResults executionResults,
80+
boolean configurationError,
7881
@Nonnull Collection<LibraryCapability> capabilities,
7982
Consumer<AgentSpan> onSpanFinish) {
8083
this.moduleSpanContext = moduleSpanContext;
@@ -92,6 +95,7 @@ public TestSuiteImpl(
9295
this.linesResolver = linesResolver;
9396
this.coverageStoreFactory = coverageStoreFactory;
9497
this.executionResults = executionResults;
98+
this.configurationError = configurationError;
9599
this.capabilities = capabilities;
96100
this.onSpanFinish = onSpanFinish;
97101

@@ -131,6 +135,10 @@ public TestSuiteImpl(
131135

132136
testDecorator.afterStart(span);
133137

138+
if (configurationError) {
139+
span.setTag(DDTags.CI_LIBRARY_CONFIGURATION_ERROR, true);
140+
}
141+
134142
if (!parallelized) {
135143
activateSpanWithoutScope(span);
136144
}
@@ -264,6 +272,7 @@ public TestImpl testStart(
264272
codeowners,
265273
coverageStoreFactory,
266274
executionResults,
275+
configurationError,
267276
capabilities,
268277
tagsPropagator::propagateStatus);
269278
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ public <T extends CoverageProcessor> BuildSystemModuleImpl(
110110
sessionSettings));
111111

112112
setTag(Tags.TEST_COMMAND, startCommand);
113+
114+
if (executionSettings.isConfigurationError()) {
115+
setTag(DDTags.CI_LIBRARY_CONFIGURATION_ERROR, true);
116+
}
113117
}
114118

115119
@ParametersAreNonnullByDefault

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,8 @@ private void onModuleFinish(AgentSpan moduleSpan) {
194194
TagMergeSpec.of(Tags.TEST_ITR_TESTS_SKIPPING_COUNT, Long::sum),
195195
TagMergeSpec.of(DDTags.CI_ITR_TESTS_SKIPPED, Boolean::logicalOr),
196196
TagMergeSpec.of(Tags.TEST_TEST_MANAGEMENT_ENABLED, Boolean::logicalOr),
197-
TagMergeSpec.of(DDTags.TEST_HAS_FAILED_TEST_REPLAY, Boolean::logicalOr));
197+
TagMergeSpec.of(DDTags.TEST_HAS_FAILED_TEST_REPLAY, Boolean::logicalOr),
198+
TagMergeSpec.of(DDTags.CI_LIBRARY_CONFIGURATION_ERROR, Boolean::logicalOr));
198199
}
199200

200201
@Override

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ public TestSuiteImpl testSuiteStart(
212212
linesResolver,
213213
coverageStoreFactory,
214214
executionResults,
215+
executionStrategy.getExecutionSettings().isConfigurationError(),
215216
capabilities,
216217
this::propagateTestFrameworkData);
217218
}

0 commit comments

Comments
 (0)