Skip to content

Examples

Matthew Khouzam edited this page Mar 11, 2025 · 2 revisions

Simple Example

To instrument

import java.io.FileWriter;

public class SlappyWag {
    public static void main(String[] args) {
        System.out.println("The program will write hello 10x between two scope logs\n");
        try (FileWriter fw = new FileWriter("test.txt")) {
            for (int i = 0; i < 10; i++) {
                fw.write("Hello world "+ i);
            }
        }
    }
}

one needs to add to the try-with-resources block a scopewriter

import java.io.FileWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.tracecompass.traceeventlogger.LogUtils;

public class SlappyWag {
    
    private static Logger logger = Logger.getAnonymousLogger();
    
    public static void main(String[] args) {
        // Set the logger level based on your requirements
        // logger.setLevel(Level.FINE);

        System.out.println("The program will write hello 10x between two scope logs\n");
        try (LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINE, "writing to file"); FileWriter fw = new FileWriter("test.txt")) {
            for (int i = 0; i < 10; i++) {
                fw.write("Hello world "+ i);
            }
        }
    }
}

Will generate the following trace

{"ts":0,"ph":"B","tid":1,"name":"writing to file"}
{"ts":100000,"ph":"E","tid":1}

example 2:

try (LogUtils.ScopeLog linksLogger = new LogUtils.ScopeLog(logger, Level.CONFIG, "Perform Query")) { //$NON-NLS-1$
  ds.updateAllReferences();
  dataStore.addAll(ds.query(timestamp, value));
}

will generate the following trace

{"ts":12345,"ph":"B","tid":1,"name":"Perform Query"}
{"ts":12366,"ph":"E","tid":1}

See more examples in javadoc.

P.S.: You may need to terminate the logger thread at the end of your program since the library cannot terminate it automatically.

import java.util.logging.LogManager;
import java.util.logging.Logger;

public class SlappyWag {

  private static Logger logger = Logger.getAnonymousLogger();

  public static void main (String[] args) {
    // Your code
    // ...
    
    LogManager.getLogManager().reset();

    // End of your program
  }

}

Instrumenting a WAR file

War files work just like jars in this application, the XBootPath loader is needed though.

// HelloWorldWar.java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.tracecompass.traceeventlogger.LogUtils;

@WebServlet("/hello")
public class HelloWorldWar extends HttpServlet {
    private static Logger logger;
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            try(LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINER, "doGetHello");){
             
            response.setContentType("text/html");
            PrintWriter out = response.getWriter();
            out.println("<html><body>");
            out.println("<h1>Hello, World! From a WAR file!</h1>");
            out.println("</body></html>");
        }
    }

    public static void main(String[] args) {
         logger = Logger.getAnonymousLogger();
        List<String> myList = new ArrayList<>();
        myList.add("Apple");
        myList.add("Banana");
        myList.add("Cherry");
        myList.add("Date");
        myList.add("Fig");

        try (LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINER, "enhanced_for");){
            for (String item : myList) {
                System.out.println("Processing: " + item);
                if (item.equals("Banana")) {
                    myList.remove("Cherry"); // Removing an element *after* the current one.
                }
                if(item.equals("Date")){
                    myList.remove("Fig");
                }
            }
        } catch (java.util.ConcurrentModificationException e) {
            LogUtils.traceInstant(logger, Level.WARNING, "cme", e.getMessage());
            System.out.println("ConcurrentModificationException caught: " + e);
        }

    }
}

The war file needs to be launched with

-Xbootclasspath/a:%home%/.m2/repository/org/eclipse/tracecompass/trace-event-logger/x.y.z/trace-event-logger-x.y.z.jar

Then the war is instrumented.

The final trace here would be:

Instrumenting code with exceptions

Here is an example of instrumenting code with a concurrent modification exception.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.tracecompass.traceeventlogger.LogUtils;

public class cme {
    
    public static void main(String[] args) {
        Logger logger = Logger.getAnonymousLogger();
        List<String> myList = new ArrayList<>();
        myList.add("Apple");
        myList.add("Banana");
        myList.add("Cherry");

        // Example 1: ConcurrentModificationException using enhanced for-loop
        try (LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINER, "enhanced_for");){
            for (String item : myList) {
                if (item.equals("Banana")) {
                    myList.remove("Banana"); // Modifying the list during iteration
                }
            }
        } catch (java.util.ConcurrentModificationException e) {
            LogUtils.traceInstant(logger, Level.WARNING, "cme", e.getMessage());
            System.out.println("ConcurrentModificationException caught (enhanced for-loop): " + e);
        }

        // Reset the list
        myList.clear();
        myList.add("Apple");
        myList.add("Banana");
        myList.add("Cherry");

        // Example 2: ConcurrentModificationException using Iterator (incorrect usage)
        try (LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINE, "iterator")){
            Iterator<String> iterator = myList.iterator();
            while (iterator.hasNext()) {
                String item = iterator.next();
                if (item.equals("Banana")) {
                    myList.remove("Banana"); // Modifying the list directly, not via the iterator
                }
            }
        } catch (java.util.ConcurrentModificationException e) {
            LogUtils.traceInstant(logger, Level.WARNING, "cme", e.getMessage());
            System.out.println("ConcurrentModificationException caught (iterator, incorrect): " + e);
        }

        // Reset the list
        myList.clear();
        myList.add("Apple");
        myList.add("Banana");
        myList.add("Cherry");

        // Example 3: Correct usage of Iterator to avoid ConcurrentModificationException
        try (LogUtils.ScopeLog sl = new LogUtils.ScopeLog(logger, Level.FINE, "good")){
            Iterator<String> iterator = myList.iterator();
            while (iterator.hasNext()) {
                String item = iterator.next();
                if (item.equals("Banana")) {
                    iterator.remove(); // Correct way to remove using the iterator
                }
            }
            System.out.println("List after correct removal: " + myList);
        } catch (java.util.ConcurrentModificationException e) {
            LogUtils.traceInstant(logger, Level.WARNING, "cme", e.getMessage());
            System.out.println("ConcurrentModificationException caught (iterator, correct): " + e);
        }
    }
}

Generates

[{"ts": "1740543289400065", "ph": "B", "tid": 1, "pid": 1, "name": "enhanced_for"},
{"ts": "1740543289423019", "ph": "E", "tid": 1, "pid": 1},
{"ts": "1740543289428146.2", "ph": "B", "tid": 1, "pid": 1, "name": "iterator"},
{"ts": "1740543289438413.2", "ph": "E", "tid": 1, "pid": 1},
{"ts": "1740543289439121", "ph": "B", "tid": 1, "pid": 1, "name": "good"},
{"ts": "1740543289440130.2", "ph": "E", "tid": 1, "pid": 1}]

Instrumenting an Eclipse Application

For an eclipse application add

-Xbootclasspath/a:./plugins/org.eclipse.tracecompass.trace-event-logger_x.y.z.jar

To the launch command

For instrumentation examples, see the Trace Compass git repo.

Clone this wiki locally