package io.pcp.parfait.timing; import java.util.Collections; import java.util.Random; import io.pcp.parfait.MonitorableRegistry; // Sample code to try out the in-progress measurement stuff. To be replaced with a proper test case. public class SampleRun { private static final Random RANDOM = new Random(); public static final Object LOCK = new Object(); public static void main(String[] args) throws InterruptedException { ThreadMetricSuite suite = ThreadMetricSuite.blank(); suite.addMetric(StandardThreadMetrics.CLOCK_TIME); suite.addMetric(StandardThreadMetrics.BLOCKED_TIME); suite.addMetric(StandardThreadMetrics.WAITED_TIME); suite.addMetric(StandardThreadMetrics.USER_CPU_TIME); EventTimer timer = new EventTimer("blah", new MonitorableRegistry(), suite, true, true, Collections.<StepMeasurementSink>singletonList(new LoggerSink())); ThreadContext context = new ThreadContext(); EmailSender sender = new EmailSender(context); CheckoutBuyer buyer = new CheckoutBuyer(context); timer.registerTimeable(sender, "sendEmail"); timer.registerTimeable(buyer, "buySomething"); Thread t1 = new Thread(sender); Thread t2 = new Thread(buyer); t1.start(); t2.start(); InProgressExporter exporter = new InProgressExporter(timer, context); for (int i = 1; i <= 5; i++) { Thread.sleep(5000); InProgressSnapshot snapshot = exporter.getSnapshot(); System.out.println(snapshot.asFormattedString()); } t1.join(); t2.join(); } public static abstract class FakeTask implements Timeable, Runnable { private EventTimer timer; private String action; protected ThreadContext context; private final Random random = new Random(); public FakeTask(String action, ThreadContext context) { this.action = action; this.context = context; } @Override public void setEventTimer(EventTimer timer) { this.timer = timer; } @Override public void run() { EventMetricCollector collector = timer.getCollector(); for (int i = 1; i < 30; i++) { try { context.put("Name", randomName()); context.put("Company", randomCompany()); collector.startTiming(this, action); doJob(i); collector.pauseForForward(); collector.startTiming(this, "frog"); collector.stopTiming(); collector.resumeAfterForward(); collector.stopTiming(); context.remove("Name"); context.remove("Company"); } catch (Exception e) { throw new RuntimeException(e); } } } private String randomCompany() { final String[] COMPANIES = new String[]{"ABC Corp", "Boople Inc", "Cabbages Pty Ltd", "Druggles MV"}; return COMPANIES[random.nextInt(COMPANIES.length)]; } private String randomName() { final String[] NAMES = new String[]{"Alex", "Betty", "Carlos", "Dietrich", "Edna"}; return NAMES[random.nextInt(NAMES.length)]; } protected abstract void doJob(int i) throws Exception; } public static class CheckoutBuyer extends FakeTask { public CheckoutBuyer(ThreadContext context) { super("buyItem", context); } @Override protected void doJob(int i) throws InterruptedException { if (i > 10 && i < 20) { synchronized (LOCK) { Thread.sleep(RANDOM.nextInt(500) + 500); } } else { Thread.sleep(RANDOM.nextInt(500) + 500); } } } public static class EmailSender extends FakeTask { public EmailSender(ThreadContext context) { super("sendMail", context); } @Override protected void doJob(int i) throws Exception { synchronized (LOCK) { Thread.sleep(RANDOM.nextInt(400) + 400); if (i >= 25) { for (int j = 0; j < 10000000; j++) { System.out.print(""); } } } } } }