6
6
import com .datadog .debugger .util .ClassFileHelper ;
7
7
import com .datadog .debugger .util .ClassNameFiltering ;
8
8
import datadog .trace .api .Config ;
9
+ import datadog .trace .relocate .api .RatelimitedLogger ;
9
10
import datadog .trace .util .AgentTaskScheduler ;
10
11
import datadog .trace .util .Strings ;
11
12
import java .lang .instrument .ClassFileTransformer ;
14
15
import java .util .Queue ;
15
16
import java .util .concurrent .ConcurrentLinkedQueue ;
16
17
import java .util .concurrent .TimeUnit ;
18
+ import java .util .concurrent .atomic .AtomicInteger ;
17
19
import org .slf4j .Logger ;
18
20
import org .slf4j .LoggerFactory ;
19
21
24
26
*/
25
27
public class SourceFileTrackingTransformer implements ClassFileTransformer {
26
28
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 ;
27
31
32
+ private final RatelimitedLogger ratelimitedLogger =
33
+ new RatelimitedLogger (LOGGER , MINUTES_BETWEEN_ERROR_LOG , TimeUnit .MINUTES );
28
34
private final ClassesToRetransformFinder finder ;
29
35
private final Queue <SourceFileItem > queue = new ConcurrentLinkedQueue <>();
30
36
private final AgentTaskScheduler scheduler = AgentTaskScheduler .INSTANCE ;
37
+ private final AtomicInteger queueSize = new AtomicInteger (0 );
31
38
private AgentTaskScheduler .Scheduled <Runnable > scheduled ;
32
39
// this field MUST only be used in flush() calling thread
33
40
private ClassNameFiltering classNameFilter ;
@@ -55,14 +62,23 @@ void flush() {
55
62
if (queue .isEmpty ()) {
56
63
return ;
57
64
}
58
- int size = queue . size () ;
65
+ int itemCount = 0 ;
59
66
long start = System .nanoTime ();
60
67
SourceFileItem item ;
61
68
while ((item = queue .poll ()) != null ) {
69
+ queueSize .decrementAndGet ();
62
70
registerSourceFile (item .className , item .classfileBuffer );
71
+ itemCount ++;
63
72
}
64
73
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 ();
66
82
}
67
83
68
84
@ Override
@@ -76,7 +92,12 @@ public byte[] transform(
76
92
if (className == null ) {
77
93
return null ;
78
94
}
95
+ if (queueSize .get () >= MAX_QUEUE_SIZE ) {
96
+ ratelimitedLogger .warn ("SourceFile Tracking queue full, dropping class: {}" , className );
97
+ return null ;
98
+ }
79
99
queue .add (new SourceFileItem (className , classfileBuffer ));
100
+ queueSize .incrementAndGet ();
80
101
return null ;
81
102
}
82
103
0 commit comments