Skip to content

Commit 5a01757

Browse files
feat: introduce NoopFeaturesDiscovery
1 parent 1c44f5a commit 5a01757

7 files changed

Lines changed: 89 additions & 77 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package datadog.communication.ddagent;
2+
3+
import static datadog.trace.api.ProtocolVersion.V0_4;
4+
5+
import datadog.metrics.api.Monitoring;
6+
7+
/**
8+
* No-op {@link DDAgentFeaturesDiscovery} used when the tracer must not probe the agent — for
9+
* example, in CI Visibility hermetic Bazel runs where traces are written to local files. Skips
10+
* discovery and reports nothing as supported, so callers get safe default values without any
11+
* network I/O.
12+
*/
13+
public class NoopFeaturesDiscovery extends DDAgentFeaturesDiscovery {
14+
public static final NoopFeaturesDiscovery INSTANCE = new NoopFeaturesDiscovery();
15+
16+
private NoopFeaturesDiscovery() {
17+
super(null, Monitoring.DISABLED, null, V0_4, false);
18+
}
19+
20+
@Override
21+
public void discover() {}
22+
23+
@Override
24+
public void discoverIfOutdated() {}
25+
}

communication/src/main/java/datadog/communication/ddagent/SharedCommunicationObjects.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import datadog.remoteconfig.ConfigurationPoller;
1111
import datadog.remoteconfig.DefaultConfigurationPoller;
1212
import datadog.trace.api.Config;
13+
import datadog.trace.api.civisibility.config.BazelMode;
1314
import datadog.trace.util.AgentTaskScheduler;
1415
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
1516
import java.security.Security;
@@ -167,23 +168,28 @@ public DDAgentFeaturesDiscovery featuresDiscovery(Config config) {
167168
if (ret == null) {
168169
synchronized (this) {
169170
if ((ret = featuresDiscovery) == null) {
170-
createRemaining(config);
171-
ret =
172-
new DDAgentFeaturesDiscovery(
173-
agentHttpClient,
174-
monitoring,
175-
agentUrl,
176-
config.getProtocolVersion(),
177-
config.isTracerMetricsEnabled());
178-
179-
if (paused) {
180-
// defer remote discovery until remote I/O is allowed
171+
if (config.isCiVisibilityEnabled() && BazelMode.get().isPayloadFilesEnabled()) {
172+
// Hermetic Bazel runs write payloads to local files; don't probe the agent.
173+
ret = NoopFeaturesDiscovery.INSTANCE;
181174
} else {
182-
if (AGENT_THREAD_GROUP.equals(Thread.currentThread().getThreadGroup())) {
183-
ret.discover(); // safe to run on same thread
175+
createRemaining(config);
176+
ret =
177+
new DDAgentFeaturesDiscovery(
178+
agentHttpClient,
179+
monitoring,
180+
agentUrl,
181+
config.getProtocolVersion(),
182+
config.isTracerMetricsEnabled());
183+
184+
if (paused) {
185+
// defer remote discovery until remote I/O is allowed
184186
} else {
185-
// avoid performing blocking I/O operation on application thread
186-
AgentTaskScheduler.get().execute(ret::discoverIfOutdated);
187+
if (AGENT_THREAD_GROUP.equals(Thread.currentThread().getThreadGroup())) {
188+
ret.discover(); // safe to run on same thread
189+
} else {
190+
// avoid performing blocking I/O operation on application thread
191+
AgentTaskScheduler.get().execute(ret::discoverIfOutdated);
192+
}
187193
}
188194
}
189195
featuresDiscovery = ret;

dd-trace-core/src/main/java/datadog/trace/common/writer/WriterFactory.java

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -84,39 +84,32 @@ public static Writer createWriter(
8484
}
8585

8686
int flushIntervalMilliseconds = Math.round(config.getTraceFlushIntervalSeconds() * 1000);
87+
DDAgentFeaturesDiscovery featuresDiscovery = commObjects.featuresDiscovery(config);
8788

88-
// CI Visibility payload-files mode writes traces to local files; detect it before touching
89-
// feature discovery to avoid probing the agent in hermetic Bazel runs.
89+
// CI Visibility payload-files mode writes traces to local files instead of the agent.
9090
if (config.isCiVisibilityEnabled() && BazelMode.get().isPayloadFilesEnabled()) {
9191
BazelMode bazelMode = BazelMode.get();
9292
String testsDir = bazelMode.getTestPayloadsDir();
9393
String coverageDir =
9494
config.isCiVisibilityCodeCoverageEnabled() ? bazelMode.getCoveragePayloadsDir() : null;
95-
if (testsDir != null) {
96-
log.info(
97-
"[bazel mode] Payloads-in-files enabled, writing to {}", bazelMode.getPayloadsDir());
98-
99-
PayloadDispatcher dispatcher = createCiVisBazelPayloadDispatcher(testsDir, coverageDir);
100-
101-
TraceProcessingWorker worker =
102-
new TraceProcessingWorker(
103-
1024,
104-
healthMetrics,
105-
dispatcher,
106-
DroppingPolicy.DISABLED,
107-
prioritization,
108-
flushIntervalMilliseconds,
109-
TimeUnit.MILLISECONDS,
110-
singleSpanSampler);
111-
112-
return new DDIntakeWriter(worker, dispatcher, healthMetrics, 5, TimeUnit.SECONDS, false);
113-
}
114-
log.warn(
115-
"[bazel mode] Payloads-in-files mode enabled but payload directory not resolved, falling back to default writer");
95+
log.info("[bazel mode] Payloads-in-files enabled, writing to {}", bazelMode.getPayloadsDir());
96+
97+
PayloadDispatcher dispatcher = createCiVisBazelPayloadDispatcher(testsDir, coverageDir);
98+
99+
TraceProcessingWorker worker =
100+
new TraceProcessingWorker(
101+
1024,
102+
healthMetrics,
103+
dispatcher,
104+
DroppingPolicy.DISABLED,
105+
prioritization,
106+
flushIntervalMilliseconds,
107+
TimeUnit.MILLISECONDS,
108+
singleSpanSampler);
109+
110+
return new DDIntakeWriter(worker, dispatcher, healthMetrics, 5, TimeUnit.SECONDS, false);
116111
}
117112

118-
DDAgentFeaturesDiscovery featuresDiscovery = commObjects.featuresDiscovery(config);
119-
120113
// The AgentWriter doesn't support the CI Visibility protocol. If CI Visibility is
121114
// enabled, check if we can use the IntakeWriter instead.
122115
if (DD_AGENT_WRITER_TYPE.equals(configuredType) && (config.isCiVisibilityEnabled())) {

dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -769,22 +769,15 @@ private CoreTracer(
769769
this.writer = writer;
770770
}
771771

772-
// CI Visibility payload-files mode writes traces to local files; skip feature discovery to
773-
// avoid probing the agent in hermetic Bazel runs.
774-
boolean payloadFilesEnabled =
775-
config.isCiVisibilityEnabled() && BazelMode.get().isPayloadFilesEnabled();
776-
777-
DDAgentFeaturesDiscovery featuresDiscovery;
778-
if (payloadFilesEnabled) {
779-
featuresDiscovery = null;
780-
} else {
781-
featuresDiscovery = sharedCommunicationObjects.featuresDiscovery(config);
782-
if (config.isCiVisibilityEnabled()) {
783-
// ensure updated discovery and sync if the another discovery currently being done
784-
featuresDiscovery.discoverIfOutdated();
785-
}
772+
DDAgentFeaturesDiscovery featuresDiscovery =
773+
sharedCommunicationObjects.featuresDiscovery(config);
774+
if (config.isCiVisibilityEnabled()) {
775+
// ensure updated discovery and sync if the another discovery currently being done
776+
featuresDiscovery.discoverIfOutdated();
786777
}
787778

779+
boolean payloadFilesEnabled =
780+
config.isCiVisibilityEnabled() && BazelMode.get().isPayloadFilesEnabled();
788781
if (config.isCiVisibilityEnabled()
789782
&& (config.isCiVisibilityAgentlessEnabled()
790783
|| payloadFilesEnabled
@@ -815,8 +808,7 @@ private CoreTracer(
815808
() -> AgentTaskScheduler.get().execute(() -> startMetricsAggregation(config, sco)));
816809

817810
if (dataStreamsMonitoring == null) {
818-
// DefaultDataStreamsMonitoring's constructor calls featuresDiscovery(config), which would
819-
// probe the agent — skip it in payload-files mode.
811+
// Avoid DSM in bazel hermetic mode
820812
this.dataStreamsMonitoring =
821813
payloadFilesEnabled
822814
? DisabledDataStreamsMonitoring.INSTANCE

internal-api/src/main/java/datadog/trace/api/civisibility/config/BazelMode.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package datadog.trace.api.civisibility.config;
22

3+
import static java.nio.charset.StandardCharsets.UTF_8;
4+
35
import datadog.trace.api.Config;
46
import datadog.trace.config.inversion.ConfigHelper;
57
import datadog.trace.util.Strings;
@@ -73,21 +75,20 @@ public static BazelMode get() {
7375
manifestDir = null;
7476
}
7577

76-
payloadFilesEnabled = config.isTestOptimizationPayloadsInFiles();
7778
// TEST_UNDECLARED_OUTPUTS_DIR is a Bazel-provided env var, not a DD configuration
7879
String undeclaredOutputsDir = ConfigHelper.env("TEST_UNDECLARED_OUTPUTS_DIR");
79-
if (payloadFilesEnabled) {
80-
if (Strings.isNotBlank(undeclaredOutputsDir)) {
81-
payloadsDir = undeclaredOutputsDir + File.separator + "payloads";
82-
LOGGER.info(
83-
"[bazel mode] Payload-in-files mode enabled with payload directory {}", payloadsDir);
84-
} else {
85-
payloadsDir = null;
86-
LOGGER.warn(
87-
"[bazel mode] Payload-in-files mode enabled, but no payload directory was provided");
88-
}
80+
if (config.isTestOptimizationPayloadsInFiles() && Strings.isNotBlank(undeclaredOutputsDir)) {
81+
payloadsDir = undeclaredOutputsDir + File.separator + "payloads";
82+
payloadFilesEnabled = true;
83+
LOGGER.info(
84+
"[bazel mode] Payload-in-files mode enabled with payload directory {}", payloadsDir);
8985
} else {
9086
payloadsDir = null;
87+
payloadFilesEnabled = false;
88+
if (config.isTestOptimizationPayloadsInFiles()) {
89+
LOGGER.warn(
90+
"[bazel mode] Payload-in-files mode requested but no payload directory was provided; disabling");
91+
}
9192
}
9293

9394
LOGGER.debug("[bazel mode] Resolved mode {}", this);
@@ -173,7 +174,7 @@ private String resolveToptFile(String relativePath) {
173174

174175
private static boolean isManifestCompatible(String manifestPath) {
175176
try (BufferedReader reader =
176-
new BufferedReader(new InputStreamReader(new FileInputStream(manifestPath), "UTF-8"))) {
177+
new BufferedReader(new InputStreamReader(new FileInputStream(manifestPath), UTF_8))) {
177178
String firstLine = reader.readLine();
178179
if (firstLine == null) {
179180
LOGGER.warn("[bazel mode] Manifest file is empty: {}", manifestPath);
@@ -265,7 +266,7 @@ private static String lookupInRunfilesManifest(String manifestFile, String rloca
265266
LOGGER.debug(
266267
"[bazel mode] Reading runfiles manifest {} for rlocation {}", manifestFile, rlocation);
267268
try (BufferedReader reader =
268-
new BufferedReader(new InputStreamReader(new FileInputStream(manifestFile), "UTF-8"))) {
269+
new BufferedReader(new InputStreamReader(new FileInputStream(manifestFile), UTF_8))) {
269270
String line;
270271
while ((line = reader.readLine()) != null) {
271272
int spaceIdx = line.indexOf(' ');

internal-api/src/test/java/datadog/trace/api/civisibility/config/BazelModeTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,10 @@ void payloadDirsDerivedFromUndeclaredOutputsDir(@TempDir Path tmp) {
144144
}
145145

146146
@Test
147-
void payloadDirsNullWhenUndeclaredOutputsDirMissing() {
147+
void payloadFilesDisabledWhenUndeclaredOutputsDirMissing() {
148148
BazelMode mode = new BazelMode(configWith(null, true));
149149

150-
assertTrue(mode.isPayloadFilesEnabled());
150+
assertFalse(mode.isPayloadFilesEnabled());
151151
assertNull(mode.getPayloadsDir());
152152
assertNull(mode.getTestPayloadsDir());
153153
assertNull(mode.getCoveragePayloadsDir());

telemetry/src/main/java/datadog/telemetry/TelemetrySystem.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,14 +98,9 @@ public static void startTelemetry(
9898
boolean debug = config.isTelemetryDebugRequestsEnabled();
9999
boolean telemetryMetricsEnabled = config.isTelemetryMetricsEnabled();
100100

101-
// CI Visibility bazel support writes telemetry to files instead of the network
101+
// CI Visibility bazel mode writes telemetry to files instead of the network
102102
if (config.isCiVisibilityEnabled() && BazelMode.get().isPayloadFilesEnabled()) {
103103
String telemetryDir = BazelMode.get().getTelemetryPayloadsDir();
104-
if (telemetryDir == null) {
105-
log.warn(
106-
"[bazel mode] Payload-in-files mode enabled but telemetry directory not resolved, disabling telemetry");
107-
return;
108-
}
109104
log.info("[bazel mode] Writing telemetry payloads to {}", telemetryDir);
110105
DependencyService dependencyService = createDependencyService(instrumentation);
111106
TelemetryService telemetryService =

0 commit comments

Comments
 (0)