66import com .datadog .debugger .util .ClassFileHelper ;
77import com .datadog .debugger .util .ClassNameFiltering ;
88import datadog .trace .api .Config ;
9+ import datadog .trace .relocate .api .RatelimitedLogger ;
910import datadog .trace .util .AgentTaskScheduler ;
1011import datadog .trace .util .Strings ;
1112import java .lang .instrument .ClassFileTransformer ;
1415import java .util .Queue ;
1516import java .util .concurrent .ConcurrentLinkedQueue ;
1617import java .util .concurrent .TimeUnit ;
18+ import java .util .concurrent .atomic .AtomicInteger ;
1719import org .slf4j .Logger ;
1820import org .slf4j .LoggerFactory ;
1921
2426 */
2527public class SourceFileTrackingTransformer implements ClassFileTransformer {
2628 private static final Logger LOGGER = LoggerFactory .getLogger (SourceFileTrackingTransformer .class );
29+ private static final int MINUTES_BETWEEN_ERROR_LOG = 5 ;
30+ static final int MAX_QUEUE_SIZE = 4096 ;
2731
32+ private final RatelimitedLogger ratelimitedLogger =
33+ new RatelimitedLogger (LOGGER , MINUTES_BETWEEN_ERROR_LOG , TimeUnit .MINUTES );
2834 private final ClassesToRetransformFinder finder ;
2935 private final Queue <SourceFileItem > queue = new ConcurrentLinkedQueue <>();
3036 private final AgentTaskScheduler scheduler = AgentTaskScheduler .INSTANCE ;
37+ private final AtomicInteger queueSize = new AtomicInteger (0 );
3138 private AgentTaskScheduler .Scheduled <Runnable > scheduled ;
3239 // this field MUST only be used in flush() calling thread
3340 private ClassNameFiltering classNameFilter ;
@@ -55,14 +62,23 @@ void flush() {
5562 if (queue .isEmpty ()) {
5663 return ;
5764 }
58- int size = queue . size () ;
65+ int itemCount = 0 ;
5966 long start = System .nanoTime ();
6067 SourceFileItem item ;
6168 while ((item = queue .poll ()) != null ) {
69+ queueSize .decrementAndGet ();
6270 registerSourceFile (item .className , item .classfileBuffer );
71+ itemCount ++;
6372 }
6473 LOGGER .debug (
65- "flushing {} source file items in {}ms" , size , (System .nanoTime () - start ) / 1_000_000 );
74+ "flushing {} source file items in {}ms, totalentries: {}" ,
75+ itemCount ,
76+ (System .nanoTime () - start ) / 1_000_000 ,
77+ finder .getClassNamesBySourceFile ().size ());
78+ }
79+
80+ int getQueueSize () {
81+ return queueSize .get ();
6682 }
6783
6884 @ Override
@@ -76,7 +92,12 @@ public byte[] transform(
7692 if (className == null ) {
7793 return null ;
7894 }
95+ if (queueSize .get () >= MAX_QUEUE_SIZE ) {
96+ ratelimitedLogger .warn ("SourceFile Tracking queue full, dropping class: {}" , className );
97+ return null ;
98+ }
7999 queue .add (new SourceFileItem (className , classfileBuffer ));
100+ queueSize .incrementAndGet ();
80101 return null ;
81102 }
82103
0 commit comments