2222import datadog .trace .bootstrap .debugger .EvaluationError ;
2323import datadog .trace .bootstrap .debugger .MethodLocation ;
2424import datadog .trace .bootstrap .debugger .ProbeId ;
25+ import datadog .trace .bootstrap .debugger .ProbeRateLimiter ;
2526import datadog .trace .bootstrap .instrumentation .api .AgentScope ;
2627import datadog .trace .bootstrap .instrumentation .api .AgentSpan ;
2728import datadog .trace .bootstrap .instrumentation .api .AgentTracer ;
3031import datadog .trace .bootstrap .instrumentation .api .Tags ;
3132import datadog .trace .core .CoreTracer ;
3233import java .util .stream .Stream ;
34+ import org .jetbrains .annotations .NotNull ;
3335import org .junit .jupiter .api .Assertions ;
3436import org .junit .jupiter .api .Test ;
3537import org .junit .jupiter .params .ParameterizedTest ;
@@ -41,6 +43,7 @@ public class LogProbeTest {
4143 private static final String LANGUAGE = "java" ;
4244 private static final ProbeId PROBE_ID = new ProbeId ("beae1807-f3b0-4ea8-a74f-826790c5e6f8" , 0 );
4345 private static final String DEBUG_SESSION_ID = "TestSession" ;
46+ private static final int BUDGET_RUNS = 1100 ;
4447
4548 @ Test
4649 public void testCapture () {
@@ -81,65 +84,68 @@ public void noDebugSession() {
8184
8285 @ Test
8386 public void budgets () {
84- BudgetSink sink = new BudgetSink (getConfig (), mock (ProbeStatusSink .class ));
85- DebuggerAgentHelper .injectSink (sink );
87+ try {
88+ ProbeRateLimiter .setGlobalSnapshotRate (-1 );
89+ TracerAPI tracer =
90+ CoreTracer .builder ()
91+ .idGenerationStrategy (IdGenerationStrategy .fromName ("random" ))
92+ .build ();
93+ AgentTracer .registerIfAbsent (tracer );
94+ String sessionId = "12345" ;
8695
87- TracerAPI tracer =
88- CoreTracer .builder ().idGenerationStrategy (IdGenerationStrategy .fromName ("random" )).build ();
89- AgentTracer .registerIfAbsent (tracer );
90- int runs = 100 ;
91- for (int i = 0 ; i < runs ; i ++) {
92- runTrace (tracer , true );
93- }
94- assertEquals (runs * LogProbe .CAPTURING_PROBE_BUDGET , sink .captures );
96+ Result result = getResult (tracer , sessionId , true , null );
97+ assertEquals (BUDGET_RUNS * LogProbe .CAPTURING_PROBE_BUDGET , result .sink .captures );
9598
96- sink = new BudgetSink (getConfig (), mock (ProbeStatusSink .class ));
97- DebuggerAgentHelper .injectSink (sink );
98- runs = 1010 ;
99- for (int i = 0 ; i < runs ; i ++) {
100- runTrace (tracer , false );
101- }
102- assertEquals (runs * LogProbe .NON_CAPTURING_PROBE_BUDGET , sink .highRate );
103- }
99+ result = getResult (tracer , sessionId , false , null );
100+ assertEquals (BUDGET_RUNS * LogProbe .NON_CAPTURING_PROBE_BUDGET , result .sink .highRate );
104101
105- @ Test
106- public void budgetsOnLineProbes () {
107- BudgetSink sink = new BudgetSink (getConfig (), mock (ProbeStatusSink .class ));
108- DebuggerAgentHelper .injectSink (sink );
102+ // run without a session
103+ result = getResult (tracer , null , true , 100 );
104+ assertEquals (result .count , result .sink .captures );
109105
110- TracerAPI tracer =
111- CoreTracer .builder ().idGenerationStrategy (IdGenerationStrategy .fromName ("random" )).build ();
112- AgentTracer .registerIfAbsent (tracer );
113- int runs = 100 ;
114- for (int i = 0 ; i < runs ; i ++) {
115- runTrace (tracer , true , 100 );
106+ result = getResult (tracer , null , false , 100 );
107+ assertEquals (result .count , result .sink .highRate );
108+ } finally {
109+ ProbeRateLimiter .resetGlobalRate ();
116110 }
117- assertEquals ( runs * LogProbe . CAPTURING_PROBE_BUDGET , sink . captures );
111+ }
118112
119- sink = new BudgetSink (getConfig (), mock (ProbeStatusSink .class ));
113+ @ NotNull
114+ private Result getResult (
115+ TracerAPI tracer , String sessionId , boolean captureSnapshot , Integer line ) {
116+ BudgetSink sink = new BudgetSink (getConfig (), mock (ProbeStatusSink .class ));
120117 DebuggerAgentHelper .injectSink (sink );
121- runs = 1010 ;
122- for (int i = 0 ; i < runs ; i ++) {
123- runTrace (tracer , false , 100 );
118+ int count = 0 ;
119+ for (int i = 0 ; i < BUDGET_RUNS ; i ++) {
120+ count += runTrace (tracer , captureSnapshot , line , sessionId );
124121 }
125- assertEquals ( runs * LogProbe . NON_CAPTURING_PROBE_BUDGET , sink . highRate );
122+ return new Result ( sink , count );
126123 }
127124
128- private void runTrace (TracerAPI tracer , boolean captureSnapshot ) {
129- runTrace (tracer , captureSnapshot , null );
125+ private static class Result {
126+ final int count ;
127+ final BudgetSink sink ;
128+
129+ private Result (BudgetSink sink , int count ) {
130+ this .sink = sink ;
131+ this .count = count ;
132+ }
130133 }
131134
132- private void runTrace (TracerAPI tracer , boolean captureSnapshot , Integer line ) {
135+ private int runTrace (TracerAPI tracer , boolean captureSnapshot , Integer line , String sessionId ) {
133136 AgentSpan span = tracer .startSpan ("budget testing" , "test span" );
134- span .setTag (Tags .PROPAGATED_DEBUG , "12345:1" );
137+ if (sessionId != null ) {
138+ span .setTag (Tags .PROPAGATED_DEBUG , sessionId + ":1" );
139+ }
135140 try (AgentScope scope = tracer .activateSpan (span , ScopeSource .MANUAL )) {
141+ Builder builder =
142+ createLog ("Budget testing" ).probeId (ProbeId .newId ()).captureSnapshot (captureSnapshot );
143+ if (sessionId != null ) {
144+ builder .tags ("session_id:" + sessionId );
145+ }
146+ LogProbe logProbe = builder .build ();
147+ ProbeRateLimiter .setRate (logProbe .id , -1 , captureSnapshot );
136148
137- LogProbe logProbe =
138- createLog ("I'm in a debug session" )
139- .probeId (ProbeId .newId ())
140- .tags ("session_id:12345" )
141- .captureSnapshot (captureSnapshot )
142- .build ();
143149 CapturedContext entryContext = capturedContext (span , logProbe );
144150 CapturedContext exitContext = capturedContext (span , logProbe );
145151 logProbe .evaluate (entryContext , new LogStatus (logProbe ), MethodLocation .ENTRY );
@@ -158,7 +164,11 @@ private void runTrace(TracerAPI tracer, boolean captureSnapshot, Integer line) {
158164 logProbe .commit (entryContext , line );
159165 }
160166 }
161- assertEquals (runs , span .getLocalRootSpan ().getTag (format ("_dd.ld.probe_id.%s" , logProbe .id )));
167+ if (sessionId != null ) {
168+ assertEquals (
169+ runs , span .getLocalRootSpan ().getTag (format ("_dd.ld.probe_id.%s" , logProbe .id )));
170+ }
171+ return runs ;
162172 }
163173 }
164174
@@ -343,6 +353,7 @@ private Builder createLog(String template) {
343353 private static class BudgetSink extends DebuggerSink {
344354
345355 public int captures ;
356+
346357 public int highRate ;
347358
348359 public BudgetSink (Config config , ProbeStatusSink probeStatusSink ) {
0 commit comments