11package com .datadog .debugger .symbol ;
22
3- import static com .datadog .debugger .symbol .JarScanner .trimPrefixes ;
4-
53import com .datadog .debugger .util .MoshiHelper ;
64import com .squareup .moshi .JsonAdapter ;
75import datadog .remoteconfig .PollingRateHinter ;
108import datadog .trace .api .Config ;
119import datadog .trace .bootstrap .debugger .DebuggerContext .ClassNameFilter ;
1210import datadog .trace .util .AgentTaskScheduler ;
13- import datadog .trace .util .Strings ;
1411import java .io .ByteArrayInputStream ;
1512import java .io .ByteArrayOutputStream ;
16- import java .io .File ;
1713import java .io .IOException ;
18- import java .io .InputStream ;
1914import java .lang .instrument .Instrumentation ;
2015import java .net .URISyntaxException ;
2116import java .nio .file .Files ;
22- import java .nio .file .LinkOption ;
2317import java .nio .file .Path ;
2418import java .time .Instant ;
2519import java .time .LocalDateTime ;
2620import java .time .ZoneId ;
2721import java .util .Arrays ;
28- import java .util .HashSet ;
29- import java .util .Set ;
3022import java .util .concurrent .atomic .AtomicBoolean ;
31- import java .util .jar .JarEntry ;
32- import java .util .jar .JarFile ;
33- import java .util .regex .Pattern ;
3423import okio .Okio ;
3524import org .slf4j .Logger ;
3625import org .slf4j .LoggerFactory ;
3726
3827public class SymDBEnablement implements ProductListener {
3928 private static final Logger LOGGER = LoggerFactory .getLogger (SymDBEnablement .class );
40- private static final Pattern COMMA_PATTERN = Pattern .compile ("," );
4129 private static final JsonAdapter <SymDbRemoteConfigRecord > SYM_DB_JSON_ADAPTER =
4230 MoshiHelper .createMoshiConfig ().adapter (SymDbRemoteConfigRecord .class );
4331 private static final String SYM_DB_RC_KEY = "symDb" ;
@@ -120,7 +108,7 @@ public void startSymbolExtraction() {
120108 symbolExtractionTransformer =
121109 new SymbolExtractionTransformer (symbolAggregator , classNameFilter );
122110 instrumentation .addTransformer (symbolExtractionTransformer );
123- SymDBReport symDBReport = new SymDBReport ();
111+ SymDBReport symDBReport = new BasicSymDBReport ();
124112 extractSymbolForLoadedClasses (symDBReport );
125113 symDBReport .report ();
126114 lastUploadTimestamp = System .currentTimeMillis ();
@@ -145,7 +133,6 @@ private void extractSymbolForLoadedClasses(SymDBReport symDBReport) {
145133 LOGGER .debug ("Failed to get all loaded classes" , ex );
146134 return ;
147135 }
148- Set <String > alreadyScannedJars = new HashSet <>();
149136 byte [] buffer = new byte [READ_BUFFER_SIZE ];
150137 ByteArrayOutputStream baos = new ByteArrayOutputStream (CLASSFILE_BUFFER_SIZE );
151138 for (Class <?> clazz : classesToExtract ) {
@@ -162,86 +149,7 @@ private void extractSymbolForLoadedClasses(SymDBReport symDBReport) {
162149 symDBReport .addMissingJar (jarPath .toString ());
163150 continue ;
164151 }
165- File jarPathFile = jarPath .toFile ();
166- if (jarPathFile .isDirectory ()) {
167- scanDirectory (jarPath , alreadyScannedJars , baos , buffer , symDBReport );
168- alreadyScannedJars .add (jarPath .toString ());
169- continue ;
170- }
171- if (alreadyScannedJars .contains (jarPath .toString ())) {
172- continue ;
173- }
174- try {
175- try (JarFile jarFile = new JarFile (jarPathFile )) {
176- jarFile .stream ()
177- .filter (jarEntry -> jarEntry .getName ().endsWith (".class" ))
178- .filter (
179- jarEntry ->
180- !classNameFilter .isExcluded (
181- Strings .getClassName (trimPrefixes (jarEntry .getName ()))))
182- .forEach (jarEntry -> parseJarEntry (jarEntry , jarFile , jarPath , baos , buffer ));
183- }
184- alreadyScannedJars .add (jarPath .toString ());
185- } catch (IOException e ) {
186- symDBReport .addIOException (jarPath .toString (), e );
187- throw new RuntimeException (e );
188- }
189- }
190- }
191-
192- private void scanDirectory (
193- Path jarPath ,
194- Set <String > alreadyScannedJars ,
195- ByteArrayOutputStream baos ,
196- byte [] buffer ,
197- SymDBReport symDBReport ) {
198- try {
199- Files .walk (jarPath )
200- // explicitly no follow links walking the directory to avoid cycles
201- .filter (path -> Files .isRegularFile (path , LinkOption .NOFOLLOW_LINKS ))
202- .filter (path -> path .toString ().endsWith (".class" ))
203- .filter (
204- path ->
205- !classNameFilter .isExcluded (
206- Strings .getClassName (trimPrefixes (jarPath .relativize (path ).toString ()))))
207- .forEach (path -> parseFileEntry (path , jarPath , baos , buffer ));
208- alreadyScannedJars .add (jarPath .toString ());
209- } catch (IOException e ) {
210- symDBReport .addIOException (jarPath .toString (), e );
211- throw new RuntimeException (e );
212- }
213- }
214-
215- private void parseFileEntry (Path path , Path jarPath , ByteArrayOutputStream baos , byte [] buffer ) {
216- LOGGER .debug ("parsing file class: {}" , path .toString ());
217- try {
218- try (InputStream inputStream = Files .newInputStream (path )) {
219- int readBytes ;
220- baos .reset ();
221- while ((readBytes = inputStream .read (buffer )) != -1 ) {
222- baos .write (buffer , 0 , readBytes );
223- }
224- symbolAggregator .parseClass (
225- path .getFileName ().toString (), baos .toByteArray (), jarPath .toString ());
226- }
227- } catch (IOException ex ) {
228- LOGGER .debug ("Exception during parsing file class: {}" , path , ex );
229- }
230- }
231-
232- private void parseJarEntry (
233- JarEntry jarEntry , JarFile jarFile , Path jarPath , ByteArrayOutputStream baos , byte [] buffer ) {
234- LOGGER .debug ("parsing jarEntry class: {}" , jarEntry .getName ());
235- try {
236- InputStream inputStream = jarFile .getInputStream (jarEntry );
237- int readBytes ;
238- baos .reset ();
239- while ((readBytes = inputStream .read (buffer )) != -1 ) {
240- baos .write (buffer , 0 , readBytes );
241- }
242- symbolAggregator .parseClass (jarEntry .getName (), baos .toByteArray (), jarPath .toString ());
243- } catch (IOException ex ) {
244- LOGGER .debug ("Exception during parsing jarEntry class: {}" , jarEntry .getName (), ex );
152+ symbolAggregator .scanJar (symDBReport , jarPath , baos , buffer );
245153 }
246154 }
247155}
0 commit comments