Skip to content

Commit eaef526

Browse files
committed
DRAFT agentless
1 parent b86f4f7 commit eaef526

File tree

8 files changed

+58
-25
lines changed

8 files changed

+58
-25
lines changed

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,10 +1197,6 @@ && isExplicitlyDisabled(TraceInstrumentationConfig.CODE_ORIGIN_FOR_SPANS_ENABLED
11971197
&& isExplicitlyDisabled(DebuggerConfig.DISTRIBUTED_DEBUGGER_ENABLED)) {
11981198
return;
11991199
}
1200-
if (!remoteConfigEnabled) {
1201-
log.warn("Cannot enable Dynamic Instrumentation because Remote Configuration is not enabled");
1202-
return;
1203-
}
12041200
startDebuggerAgent(inst, scoClass, sco);
12051201
}
12061202

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerAgent.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import java.lang.ref.WeakReference;
4141
import java.nio.file.Path;
4242
import java.nio.file.Paths;
43-
import java.time.Duration;
4443
import java.util.Arrays;
4544
import java.util.Collections;
4645
import java.util.List;
@@ -210,13 +209,7 @@ public static void startExceptionReplay() {
210209
Config config = Config.get();
211210
commonInit(config);
212211
initClassNameFilter();
213-
exceptionDebugger =
214-
new DefaultExceptionDebugger(
215-
configurationUpdater,
216-
classNameFilter,
217-
Duration.ofSeconds(config.getDebuggerExceptionCaptureInterval()),
218-
config.getDebuggerMaxExceptionPerSecond(),
219-
config.getDebuggerExceptionMaxCapturedFrames());
212+
exceptionDebugger = new DefaultExceptionDebugger(configurationUpdater, classNameFilter, config);
220213
DebuggerContext.initExceptionDebugger(exceptionDebugger);
221214
LOGGER.info("Started Exception Replay");
222215
}

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/exception/DefaultExceptionDebugger.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.datadog.debugger.sink.Snapshot;
1010
import com.datadog.debugger.util.CircuitBreaker;
1111
import com.datadog.debugger.util.ExceptionHelper;
12+
import datadog.trace.api.Config;
1213
import datadog.trace.bootstrap.debugger.DebuggerContext;
1314
import datadog.trace.bootstrap.debugger.DebuggerContext.ClassNameFilter;
1415
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
@@ -39,32 +40,35 @@ public class DefaultExceptionDebugger implements DebuggerContext.ExceptionDebugg
3940
private final ClassNameFilter classNameFiltering;
4041
private final CircuitBreaker circuitBreaker;
4142
private final int maxCapturedFrames;
43+
private final boolean applyConfigAsync;
4244

4345
public DefaultExceptionDebugger(
4446
ConfigurationUpdater configurationUpdater,
4547
ClassNameFilter classNameFiltering,
46-
Duration captureInterval,
47-
int maxExceptionPerSecond,
48-
int maxCapturedFrames) {
48+
Config config) {
4949
this(
50-
new ExceptionProbeManager(classNameFiltering, captureInterval),
50+
new ExceptionProbeManager(
51+
classNameFiltering, Duration.ofSeconds(config.getDebuggerExceptionCaptureInterval())),
5152
configurationUpdater,
5253
classNameFiltering,
53-
maxExceptionPerSecond,
54-
maxCapturedFrames);
54+
config.getDebuggerMaxExceptionPerSecond(),
55+
config.getDebuggerExceptionMaxCapturedFrames(),
56+
config.isDebuggerExceptionAsyncConfig());
5557
}
5658

5759
DefaultExceptionDebugger(
5860
ExceptionProbeManager exceptionProbeManager,
5961
ConfigurationUpdater configurationUpdater,
6062
ClassNameFilter classNameFiltering,
6163
int maxExceptionPerSecond,
62-
int maxCapturedFrames) {
64+
int maxCapturedFrames,
65+
boolean applyConfigAsync) {
6366
this.exceptionProbeManager = exceptionProbeManager;
6467
this.configurationUpdater = configurationUpdater;
6568
this.classNameFiltering = classNameFiltering;
6669
this.circuitBreaker = new CircuitBreaker(maxExceptionPerSecond, Duration.ofSeconds(1));
6770
this.maxCapturedFrames = maxCapturedFrames;
71+
this.applyConfigAsync = applyConfigAsync;
6872
}
6973

7074
@Override
@@ -108,7 +112,11 @@ public void handleException(Throwable t, AgentSpan span) {
108112
exceptionProbeManager.createProbesForException(
109113
throwable.getStackTrace(), chainedExceptionIdx);
110114
if (creationResult.probesCreated > 0) {
111-
AgentTaskScheduler.INSTANCE.execute(() -> applyExceptionConfiguration(fingerprint));
115+
if (applyConfigAsync) {
116+
AgentTaskScheduler.INSTANCE.execute(() -> applyExceptionConfiguration(fingerprint));
117+
} else {
118+
applyExceptionConfiguration(fingerprint);
119+
}
112120
break;
113121
} else {
114122
if (LOGGER.isDebugEnabled()) {

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/DefaultExceptionDebuggerTest.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ public void setUp() {
6565
classNameFiltering =
6666
new ClassNameFiltering(
6767
new HashSet<>(singletonList("com.datadog.debugger.exception.ThirdPartyCode")));
68+
Config config = createConfig();
6869
exceptionDebugger =
69-
new DefaultExceptionDebugger(
70-
configurationUpdater, classNameFiltering, Duration.ofHours(1), 100, 3);
71-
listener = new TestSnapshotListener(createConfig(), mock(ProbeStatusSink.class));
70+
new DefaultExceptionDebugger(configurationUpdater, classNameFiltering, config);
71+
listener = new TestSnapshotListener(config, mock(ProbeStatusSink.class));
7272
DebuggerAgentHelper.injectSink(listener);
7373
}
7474

@@ -275,11 +275,24 @@ public void nestedExceptionFullThirdParty() {
275275
public void filteringOutErrors() {
276276
ExceptionProbeManager manager = mock(ExceptionProbeManager.class);
277277
exceptionDebugger =
278-
new DefaultExceptionDebugger(manager, configurationUpdater, classNameFiltering, 100, 3);
278+
new DefaultExceptionDebugger(
279+
manager, configurationUpdater, classNameFiltering, 100, 3, true);
279280
exceptionDebugger.handleException(new AssertionError("test"), mock(AgentSpan.class));
280281
verify(manager, times(0)).isAlreadyInstrumented(any());
281282
}
282283

284+
@Test
285+
public void syncConfig() {
286+
RuntimeException exception = new RuntimeException("test");
287+
String fingerprint = Fingerprinter.fingerprint(exception, classNameFiltering);
288+
AgentSpan span = mock(AgentSpan.class);
289+
exceptionDebugger.handleException(exception, span);
290+
// instrumentation should be applied synchronously
291+
assertTrue(exceptionDebugger.getExceptionProbeManager().isAlreadyInstrumented(fingerprint));
292+
exceptionDebugger.handleException(exception, span);
293+
verify(configurationUpdater).accept(eq(ConfigurationAcceptor.Source.EXCEPTION), any());
294+
}
295+
283296
private Object recordTags(InvocationOnMock invocationOnMock) {
284297
Object[] args = invocationOnMock.getArguments();
285298
String key = (String) args[0];
@@ -414,6 +427,9 @@ public static Config createConfig() {
414427
.thenReturn("http://localhost:8126/debugger/v1/input");
415428
when(config.getFinalDebuggerSymDBUrl()).thenReturn("http://localhost:8126/symdb/v1/input");
416429
when(config.getDynamicInstrumentationUploadBatchSize()).thenReturn(100);
430+
when(config.getDebuggerExceptionCaptureInterval()).thenReturn(3600);
431+
when(config.getDebuggerMaxExceptionPerSecond()).thenReturn(100);
432+
when(config.getDebuggerExceptionMaxCapturedFrames()).thenReturn(3);
417433
return config;
418434
}
419435
}

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeInstrumentationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ private TestSnapshotListener setupExceptionDebugging(
383383
DebuggerContext.initValueSerializer(new JsonSnapshotSerializer());
384384
DefaultExceptionDebugger exceptionDebugger =
385385
new DefaultExceptionDebugger(
386-
exceptionProbeManager, configurationUpdater, classNameFiltering, 100, 3);
386+
exceptionProbeManager, configurationUpdater, classNameFiltering, 100, 3, true);
387387
DebuggerContext.initExceptionDebugger(exceptionDebugger);
388388
configurationUpdater.accept(REMOTE_CONFIG, definitions);
389389
return listener;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ public final class ConfigDefaults {
206206
static final boolean DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERMEDIATE_SPANS_ENABLED = true;
207207
static final int DEFAULT_DEBUGGER_EXCEPTION_MAX_CAPTURED_FRAMES = 3;
208208
static final int DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS = 60 * 60;
209+
static final boolean DEFAULT_DEBUGGER_EXCEPTION_ASYNC_CONFIG = true;
209210
static final boolean DEFAULT_DISTRIBUTED_DEBUGGER_ENABLED = false;
210211
static final boolean DEFAULT_DEBUGGER_SOURCE_FILE_TRACKING_ENABLED = true;
211212

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ public final class DebuggerConfig {
5858
"exception.replay.capture.max.frames";
5959
public static final String DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS =
6060
"exception.replay.capture.interval.seconds";
61+
public static final String DEBUGGER_EXCEPTION_ASYNC_CONFIG =
62+
"internal.exception.replay.async.config";
6163
public static final String DEBUGGER_EXCEPTION_CAPTURE_INTERMEDIATE_SPANS_ENABLED =
6264
"exception.replay.capture.intermediate.spans.enabled";
6365
public static final String DISTRIBUTED_DEBUGGER_ENABLED = "distributed.debugger.enabled";

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE_TYPE_SUFFIX;
5555
import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_DBM_PROPAGATION_MODE_MODE;
5656
import static datadog.trace.api.ConfigDefaults.DEFAULT_DB_DBM_TRACE_PREPARED_STATEMENTS;
57+
import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_ASYNC_CONFIG;
5758
import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERMEDIATE_SPANS_ENABLED;
5859
import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS;
5960
import static datadog.trace.api.ConfigDefaults.DEFAULT_DEBUGGER_EXCEPTION_ENABLED;
@@ -277,6 +278,7 @@
277278
import static datadog.trace.api.config.CrashTrackingConfig.CRASH_TRACKING_TAGS;
278279
import static datadog.trace.api.config.CwsConfig.CWS_ENABLED;
279280
import static datadog.trace.api.config.CwsConfig.CWS_TLS_REFRESH;
281+
import static datadog.trace.api.config.DebuggerConfig.DEBUGGER_EXCEPTION_ASYNC_CONFIG;
280282
import static datadog.trace.api.config.DebuggerConfig.DEBUGGER_EXCEPTION_CAPTURE_INTERMEDIATE_SPANS_ENABLED;
281283
import static datadog.trace.api.config.DebuggerConfig.DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS;
282284
import static datadog.trace.api.config.DebuggerConfig.DEBUGGER_EXCEPTION_CAPTURE_MAX_FRAMES;
@@ -301,6 +303,7 @@
301303
import static datadog.trace.api.config.DebuggerConfig.DYNAMIC_INSTRUMENTATION_REDACTED_IDENTIFIERS;
302304
import static datadog.trace.api.config.DebuggerConfig.DYNAMIC_INSTRUMENTATION_REDACTED_TYPES;
303305
import static datadog.trace.api.config.DebuggerConfig.DYNAMIC_INSTRUMENTATION_REDACTION_EXCLUDED_IDENTIFIERS;
306+
import static datadog.trace.api.config.DebuggerConfig.DYNAMIC_INSTRUMENTATION_SNAPSHOT_URL;
304307
import static datadog.trace.api.config.DebuggerConfig.DYNAMIC_INSTRUMENTATION_UPLOAD_BATCH_SIZE;
305308
import static datadog.trace.api.config.DebuggerConfig.DYNAMIC_INSTRUMENTATION_UPLOAD_FLUSH_INTERVAL;
306309
import static datadog.trace.api.config.DebuggerConfig.DYNAMIC_INSTRUMENTATION_UPLOAD_INTERVAL_SECONDS;
@@ -1039,6 +1042,7 @@ public static String getHostName() {
10391042
private final boolean DBMTracePreparedStatements;
10401043

10411044
private final boolean dynamicInstrumentationEnabled;
1045+
private final String dynamicInstrumentationSnapshotUrl;
10421046
private final int dynamicInstrumentationUploadTimeout;
10431047
private final int dynamicInstrumentationUploadFlushInterval;
10441048
private final boolean dynamicInstrumentationClassFileDumpEnabled;
@@ -1067,6 +1071,7 @@ public static String getHostName() {
10671071
private final boolean debuggerExceptionCaptureIntermediateSpansEnabled;
10681072
private final int debuggerExceptionMaxCapturedFrames;
10691073
private final int debuggerExceptionCaptureInterval;
1074+
private final boolean debuggerExceptionAsyncConfig;
10701075
private final boolean debuggerCodeOriginEnabled;
10711076
private final int debuggerCodeOriginMaxUserFrames;
10721077
private final boolean distributedDebuggerEnabled;
@@ -2318,6 +2323,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment())
23182323
dynamicInstrumentationEnabled =
23192324
configProvider.getBoolean(
23202325
DYNAMIC_INSTRUMENTATION_ENABLED, DEFAULT_DYNAMIC_INSTRUMENTATION_ENABLED);
2326+
dynamicInstrumentationSnapshotUrl =
2327+
configProvider.getString(DYNAMIC_INSTRUMENTATION_SNAPSHOT_URL);
23212328
distributedDebuggerEnabled =
23222329
configProvider.getBoolean(
23232330
DISTRIBUTED_DEBUGGER_ENABLED, DEFAULT_DISTRIBUTED_DEBUGGER_ENABLED);
@@ -2427,6 +2434,9 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment())
24272434
configProvider.getInteger(
24282435
DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS,
24292436
DEFAULT_DEBUGGER_EXCEPTION_CAPTURE_INTERVAL_SECONDS);
2437+
debuggerExceptionAsyncConfig =
2438+
configProvider.getBoolean(
2439+
DEBUGGER_EXCEPTION_ASYNC_CONFIG, DEFAULT_DEBUGGER_EXCEPTION_ASYNC_CONFIG);
24302440
debuggerSourceFileTrackingEnabled =
24312441
configProvider.getBoolean(
24322442
DEBUGGER_SOURCE_FILE_TRACKING_ENABLED, DEFAULT_DEBUGGER_SOURCE_FILE_TRACKING_ENABLED);
@@ -4054,6 +4064,10 @@ public int getDebuggerExceptionCaptureInterval() {
40544064
return debuggerExceptionCaptureInterval;
40554065
}
40564066

4067+
public boolean isDebuggerExceptionAsyncConfig() {
4068+
return debuggerExceptionAsyncConfig;
4069+
}
4070+
40574071
public boolean isDebuggerCodeOriginEnabled() {
40584072
return debuggerCodeOriginEnabled;
40594073
}
@@ -4092,6 +4106,9 @@ private String getFinalDebuggerBaseUrl() {
40924106
}
40934107

40944108
public String getFinalDebuggerSnapshotUrl() {
4109+
if (dynamicInstrumentationSnapshotUrl != null && !dynamicInstrumentationSnapshotUrl.isEmpty()) {
4110+
return dynamicInstrumentationSnapshotUrl;
4111+
}
40954112
return getFinalDebuggerBaseUrl() + "/debugger/v1/input";
40964113
}
40974114

0 commit comments

Comments
 (0)