Skip to content

Commit da614ed

Browse files
[mq] [skip ddci] working branch - merge 96158d3 on top of master at 61071ab
{"baseBranch":"master","baseCommit":"61071ab6829a6bd24465bb174b20bb99776e1106","createdAt":"2026-09-03T15:27:17.680129Z","headSha":"96158d3d598205f05b50740ca801f1e1c0aa40e5","id":"afe8d020-07ce-4ab4-90df-0b26fc62863f","priority":"200","pullRequestNumber":"12319","queuedAt":"2026-09-03T15:27:17.678940Z","retryAttempt":"1","status":"STATUS_QUEUED"}
2 parents 1245cd8 + 96158d3 commit da614ed

21 files changed

Lines changed: 428 additions & 96 deletions

File tree

‎dd-java-agent/agent-debugger/debugger-bootstrap/src/main/java/datadog/trace/bootstrap/debugger/DebuggerContext.java‎

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,35 +21,6 @@ public class DebuggerContext {
2121
private static final Logger LOGGER = LoggerFactory.getLogger(DebuggerContext.class);
2222
private static final ThreadLocal<Boolean> IN_PROBE = ThreadLocal.withInitial(() -> Boolean.FALSE);
2323

24-
public enum SkipCause {
25-
RATE {
26-
@Override
27-
public String tag() {
28-
return "cause:rate";
29-
}
30-
},
31-
CONDITION {
32-
@Override
33-
public String tag() {
34-
return "cause:condition";
35-
}
36-
},
37-
DEBUG_SESSION_DISABLED {
38-
@Override
39-
public String tag() {
40-
return "cause:debug session disabled";
41-
}
42-
},
43-
BUDGET {
44-
@Override
45-
public String tag() {
46-
return "cause:budget_exceeded";
47-
}
48-
};
49-
50-
public abstract String tag();
51-
}
52-
5324
public interface ProbeResolver {
5425
ProbeImplementation resolve(int probeIndex);
5526
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.datadog.debugger.el;
2+
3+
public class EvaluationTimeOutException extends EvaluationException {
4+
public EvaluationTimeOutException(String message, String expr) {
5+
super(message, expr);
6+
}
7+
}

‎dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/ComparisonExpression.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import com.datadog.debugger.el.EvalContext;
66
import com.datadog.debugger.el.EvaluationException;
7+
import com.datadog.debugger.el.EvaluationTimeOutException;
78
import com.datadog.debugger.el.PrettyPrintVisitor;
89
import com.datadog.debugger.el.Value;
910
import com.datadog.debugger.el.Visitor;
@@ -38,6 +39,8 @@ public Boolean evaluate(EvalContext evalContext) {
3839
boolean result = operator.apply(leftValue, rightValue);
3940
checkTimeout(evalContext.getTimeoutChecker(), this);
4041
return result;
42+
} catch (EvaluationTimeOutException e) {
43+
throw new EvaluationTimeOutException(e.getMessage(), PrettyPrintVisitor.print(this));
4144
} catch (EvaluationException e) {
4245
throw new EvaluationException(e.getMessage(), PrettyPrintVisitor.print(this));
4346
}

‎dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/ExpressionHelper.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.datadog.debugger.el.expressions;
22

33
import com.datadog.debugger.el.EvaluationException;
4+
import com.datadog.debugger.el.EvaluationTimeOutException;
45
import com.datadog.debugger.el.Expression;
56
import com.datadog.debugger.el.PrettyPrintVisitor;
67
import com.datadog.debugger.el.RedactedException;
@@ -20,7 +21,7 @@ public static void throwRedactedException(Expression<?> expr) {
2021

2122
public static void checkTimeout(TimeoutChecker checker, Expression<?> expr) {
2223
if (checker.isTimedOut()) {
23-
throw new EvaluationException(
24+
throw new EvaluationTimeOutException(
2425
"timeout (" + checker.getTimeOut().toMillis() + "ms)", PrettyPrintVisitor.print(expr));
2526
}
2627
}

‎dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/expressions/IsDefinedExpression.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import com.datadog.debugger.el.EvalContext;
66
import com.datadog.debugger.el.EvaluationException;
7+
import com.datadog.debugger.el.EvaluationTimeOutException;
78
import com.datadog.debugger.el.Value;
89
import com.datadog.debugger.el.Visitor;
910

@@ -23,6 +24,8 @@ public Boolean evaluate(EvalContext evalContext) {
2324
try {
2425
Value<?> value = valueExpression.evaluate(evalContext);
2526
return value.isUndefined() ? Boolean.FALSE : Boolean.TRUE;
27+
} catch (EvaluationTimeOutException ex) {
28+
throw ex;
2629
} catch (EvaluationException ex) {
2730
return Boolean.FALSE;
2831
} finally {

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.datadog.debugger.symbol.WireFilter;
2222
import com.datadog.debugger.uploader.BatchUploader;
2323
import com.datadog.debugger.util.ClassNameFiltering;
24-
import com.datadog.debugger.util.DebuggerMetrics;
2524
import datadog.communication.ddagent.DDAgentFeaturesDiscovery;
2625
import datadog.communication.ddagent.SharedCommunicationObjects;
2726
import datadog.remoteconfig.ConfigurationPoller;
@@ -30,6 +29,7 @@
3029
import datadog.trace.api.config.DebuggerConfig;
3130
import datadog.trace.api.config.TraceInstrumentationConfig;
3231
import datadog.trace.api.debugger.DebuggerConfigBridge;
32+
import datadog.trace.api.debugger.DebuggerMetricCollector;
3333
import datadog.trace.api.flare.TracerFlare;
3434
import datadog.trace.api.git.GitInfo;
3535
import datadog.trace.api.git.GitInfoProvider;
@@ -368,12 +368,7 @@ private static DebuggerSink createDebuggerSink(
368368
SnapshotSink snapshotSink = new SnapshotSink(config, tags, lowRateUploader, highRateUploader);
369369
SymbolSink symbolSink = new SymbolSink(config);
370370
return new DebuggerSink(
371-
config,
372-
tags,
373-
DebuggerMetrics.getInstance(config),
374-
probeStatusSink,
375-
snapshotSink,
376-
symbolSink);
371+
config, tags, DebuggerMetricCollector.get(), probeStatusSink, snapshotSink, symbolSink);
377372
}
378373

379374
public static String getDefaultTagsMergedWithGlobalTags(Config config) {

‎dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@
2424
import com.datadog.debugger.sink.SymbolSink;
2525
import com.datadog.debugger.uploader.BatchUploader;
2626
import com.datadog.debugger.util.ClassFileLines;
27-
import com.datadog.debugger.util.DebuggerMetrics;
2827
import com.datadog.debugger.util.SpringHelper;
2928
import datadog.environment.JavaVirtualMachine;
3029
import datadog.environment.SystemProperties;
3130
import datadog.trace.agent.tooling.AgentStrategies;
3231
import datadog.trace.api.Config;
32+
import datadog.trace.api.debugger.DebuggerMetricCollector;
3333
import datadog.trace.bootstrap.debugger.MethodLocation;
3434
import datadog.trace.bootstrap.debugger.ProbeId;
3535
import datadog.trace.bootstrap.debugger.ProbeImplementation;
@@ -197,7 +197,7 @@ public DebuggerTransformer(
197197
new DebuggerSink(
198198
config,
199199
"",
200-
DebuggerMetrics.getInstance(config),
200+
DebuggerMetricCollector.get(),
201201
new ProbeStatusSink(config, config.getFinalDebuggerSnapshotUrl(), false),
202202
new SnapshotSink(
203203
config,

‎dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/LogProbe.java‎

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.datadog.debugger.probe;
22

33
import static com.datadog.debugger.probe.LogProbe.Capture.toLimits;
4+
import static datadog.trace.api.debugger.DebuggerMetricCollector.SkippedReason.RATE_LIMIT;
45
import static java.lang.String.format;
56

67
import com.datadog.debugger.agent.DebuggerAgent;
78
import com.datadog.debugger.agent.Generated;
89
import com.datadog.debugger.agent.StringTemplateBuilder;
910
import com.datadog.debugger.el.EvaluationException;
11+
import com.datadog.debugger.el.EvaluationTimeOutException;
1012
import com.datadog.debugger.el.ProbeCondition;
1113
import com.datadog.debugger.el.Value;
1214
import com.datadog.debugger.el.ValueScript;
@@ -25,10 +27,10 @@
2527
import datadog.trace.api.Config;
2628
import datadog.trace.api.CorrelationIdentifier;
2729
import datadog.trace.api.DDTraceId;
30+
import datadog.trace.api.debugger.DebuggerMetricCollector;
2831
import datadog.trace.api.sampling.Sampler;
2932
import datadog.trace.bootstrap.debugger.CapturedContext;
3033
import datadog.trace.bootstrap.debugger.CapturedContextProbe;
31-
import datadog.trace.bootstrap.debugger.DebuggerContext;
3234
import datadog.trace.bootstrap.debugger.EvaluationError;
3335
import datadog.trace.bootstrap.debugger.Limits;
3436
import datadog.trace.bootstrap.debugger.MethodLocation;
@@ -509,7 +511,11 @@ public InstrumentationResult.Status instrument(
509511
public boolean isReadyToCapture() {
510512
if (!hasCondition()) {
511513
// we are sampling here to avoid creating CapturedContext when the sampling result is negative
512-
return ProbeRateLimiter.tryProbe(sampler, isFullSnapshot());
514+
boolean sampled = ProbeRateLimiter.tryProbe(sampler, isFullSnapshot());
515+
if (!sampled) {
516+
DebuggerAgent.getSink().skipSnapshot(id, RATE_LIMIT);
517+
}
518+
return sampled;
513519
}
514520
return true;
515521
}
@@ -583,13 +589,8 @@ private void sample(LogStatus logStatus, MethodLocation methodLocation) {
583589
!logStatus.getDebugSessionStatus().isDisabled()
584590
&& ProbeRateLimiter.tryProbe(localSampler, isFullSnapshot());
585591
logStatus.setSampled(sampled);
586-
if (!sampled) {
587-
DebuggerAgent.getSink()
588-
.skipSnapshot(
589-
id,
590-
logStatus.getDebugSessionStatus().isDisabled()
591-
? DebuggerContext.SkipCause.DEBUG_SESSION_DISABLED
592-
: DebuggerContext.SkipCause.RATE);
592+
if (!sampled && !logStatus.getDebugSessionStatus().isDisabled()) {
593+
DebuggerAgent.getSink().skipSnapshot(id, RATE_LIMIT);
593594
}
594595
}
595596

@@ -603,6 +604,12 @@ private boolean evaluateCondition(CapturedContext capture, LogStatus status) {
603604
if (!probeCondition.execute(capture, timeoutChecker)) {
604605
return false;
605606
}
607+
} catch (EvaluationTimeOutException ex) {
608+
DebuggerAgent.getSink()
609+
.skipSnapshot(id, DebuggerMetricCollector.SkippedReason.EVALUATION_TIME_OUT);
610+
status.addError(new EvaluationError(ex.getExpr(), ex.getMessage()));
611+
status.setConditionErrors(true);
612+
return false;
606613
} catch (EvaluationException ex) {
607614
status.addError(new EvaluationError(ex.getExpr(), ex.getMessage()));
608615
status.setConditionErrors(true);
@@ -631,11 +638,7 @@ public void commit(
631638
if (snapshotProcessor != null) {
632639
snapshotProcessor.accept(snapshot);
633640
}
634-
} else {
635-
sink.skipSnapshot(id, DebuggerContext.SkipCause.BUDGET);
636641
}
637-
} else {
638-
sink.skipSnapshot(id, DebuggerContext.SkipCause.CONDITION);
639642
}
640643
}
641644

@@ -857,7 +860,6 @@ public void commit(CapturedContext lineContext, int line) {
857860
return;
858861
}
859862
}
860-
sink.skipSnapshot(id, DebuggerContext.SkipCause.CONDITION);
861863
}
862864

863865
@Override

‎dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/DebuggerSink.java‎

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package com.datadog.debugger.sink;
22

3+
import static datadog.trace.api.debugger.DebuggerMetricCollector.DroppedReason.QUEUE_FULL;
4+
35
import com.datadog.debugger.instrumentation.DiagnosticMessage;
46
import com.datadog.debugger.probe.ExceptionProbe;
57
import com.datadog.debugger.uploader.BatchUploader;
6-
import com.datadog.debugger.util.DebuggerMetrics;
78
import datadog.trace.api.Config;
9+
import datadog.trace.api.debugger.DebuggerMetricCollector;
810
import datadog.trace.api.internal.VisibleForTesting;
9-
import datadog.trace.bootstrap.debugger.DebuggerContext.SkipCause;
1011
import datadog.trace.bootstrap.debugger.ProbeId;
1112
import datadog.trace.util.AgentTaskScheduler;
1213
import java.util.List;
1314
import java.util.concurrent.TimeUnit;
14-
import java.util.concurrent.atomic.AtomicLong;
1515
import org.slf4j.Logger;
1616
import org.slf4j.LoggerFactory;
1717

@@ -25,18 +25,12 @@ public class DebuggerSink {
2525
private static final long LOW_RATE_INITIAL_FLUSH_INTERVAL = 1000;
2626
static final long LOW_RATE_STEP_SIZE = 200;
2727
private static final String PREFIX = "debugger.sink.";
28-
private static final String DROPPED_REQ_METRIC = PREFIX + "dropped.requests";
29-
private static final String UPLOAD_REMAINING_CAP_METRIC =
30-
PREFIX + "upload.queue.remaining.capacity";
31-
private static final String CURRENT_FLUSH_INTERVAL_METRIC = PREFIX + "current.flush.interval";
32-
private static final String SKIP_METRIC = PREFIX + "skip";
3328

3429
private final ProbeStatusSink probeStatusSink;
3530
private final SnapshotSink snapshotSink;
3631
private final SymbolSink symbolSink;
37-
private final DebuggerMetrics debuggerMetrics;
32+
private final DebuggerMetricCollector metricCollector;
3833
private final String tags;
39-
private final AtomicLong highRateDropped = new AtomicLong();
4034
private final int uploadFlushInterval;
4135
private final AgentTaskScheduler lowRateScheduler = AgentTaskScheduler.get();
4236
private volatile AgentTaskScheduler.Scheduled<DebuggerSink> lowRateScheduled;
@@ -47,7 +41,7 @@ public DebuggerSink(Config config, ProbeStatusSink probeStatusSink) {
4741
this(
4842
config,
4943
null,
50-
DebuggerMetrics.getInstance(config),
44+
DebuggerMetricCollector.get(),
5145
probeStatusSink,
5246
new SnapshotSink(
5347
config,
@@ -65,12 +59,12 @@ public DebuggerSink(Config config, ProbeStatusSink probeStatusSink) {
6559
public DebuggerSink(
6660
Config config,
6761
String tags,
68-
DebuggerMetrics debuggerMetrics,
62+
DebuggerMetricCollector metricCollector,
6963
ProbeStatusSink probeStatusSink,
7064
SnapshotSink snapshotSink,
7165
SymbolSink symbolSink) {
7266
this.tags = tags;
73-
this.debuggerMetrics = debuggerMetrics;
67+
this.metricCollector = metricCollector;
7468
this.probeStatusSink = probeStatusSink;
7569
this.snapshotSink = snapshotSink;
7670
this.symbolSink = symbolSink;
@@ -123,7 +117,7 @@ public SymbolSink getSymbolSink() {
123117
public void addSnapshot(Snapshot snapshot) {
124118
boolean added = snapshotSink.addLowRate(snapshot);
125119
if (!added) {
126-
debuggerMetrics.count(DROPPED_REQ_METRIC, 1);
120+
metricCollector.recordEventDropped(QUEUE_FULL);
127121
} else {
128122
if (!(snapshot.getProbe() instanceof ExceptionProbe)) {
129123
// do not report emitting for exception probes
@@ -135,10 +129,7 @@ public void addSnapshot(Snapshot snapshot) {
135129
public void addHighRateSnapshot(Snapshot snapshot) {
136130
boolean added = snapshotSink.addHighRate(snapshot);
137131
if (!added) {
138-
long dropped = highRateDropped.incrementAndGet();
139-
if (dropped % 100 == 0) {
140-
debuggerMetrics.count(DROPPED_REQ_METRIC, 100);
141-
}
132+
metricCollector.recordEventDropped(QUEUE_FULL);
142133
} else {
143134
probeStatusSink.addEmitting(snapshot.getProbe().getProbeId());
144135
}
@@ -168,8 +159,6 @@ void lowRateFlush(DebuggerSink ignored) {
168159
}
169160

170161
private void reconsiderLowRateFlushInterval(DebuggerSink debuggerSink) {
171-
debuggerMetrics.histogram(UPLOAD_REMAINING_CAP_METRIC, snapshotSink.remainingCapacity());
172-
debuggerMetrics.histogram(CURRENT_FLUSH_INTERVAL_METRIC, currentLowRateFlushInterval);
173162
doReconsiderLowRateFlushInterval();
174163
}
175164

@@ -242,8 +231,8 @@ private void reportError(ProbeId probeId, DiagnosticMessage msg) {
242231
}
243232

244233
/** Notifies the snapshot was skipped for one of the SkipCause reason */
245-
public void skipSnapshot(String probeId, SkipCause cause) {
246-
debuggerMetrics.incrementCounter(SKIP_METRIC, cause.tag(), "probe_id:" + probeId);
234+
public void skipSnapshot(String probeId, DebuggerMetricCollector.SkippedReason reason) {
235+
metricCollector.recordEventSkipped(reason);
247236
}
248237

249238
long getCurrentLowRateFlushInterval() {

‎dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/sink/SnapshotSink.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class SnapshotSink {
2929
public static final int LOW_RATE_CAPACITY = 1024;
3030
static final int HIGH_RATE_MIN_FLUSH_INTERVAL_MS = 1;
3131
static final int HIGH_RATE_MAX_FLUSH_INTERVAL_MS = 100;
32-
private static final int HIGH_RATE_CAPACITY = 1024;
32+
public static final int HIGH_RATE_CAPACITY = 1024;
3333
private static final int HIGH_RATE_10_PERCENT_CAPACITY = HIGH_RATE_CAPACITY / 10;
3434
private static final int HIGH_RATE_25_PERCENT_CAPACITY = HIGH_RATE_CAPACITY / 4;
3535
private static final int HIGH_RATE_75_PERCENT_CAPACITY = HIGH_RATE_CAPACITY * 3 / 4;

0 commit comments

Comments
 (0)