public static void main(String[] args) { Monitor timer = MonitorFactory.start("totaltime"); for (int i = 1; i <= 10; i++) { System.out.println(MonitorFactory.add("NIC.bytes.sent", "bytes", i * 1000)); System.out.println(MonitorFactory.add("negativetest", "neg", -1000.0 * i)); } System.out.println(""); Monitor m = null; m = MonitorFactory.start("purchasesTimeTestNoRange"); for (int i = 1; i <= 1000000; i++) MonitorFactory.add("purchasesNoRange", "dollars", 1000.0); System.out.println("purchasesTimeTestNoRange=" + m.stop().getTotal()); m = MonitorFactory.start("testTimerTimeTest"); for (int i = 1; i <= 1000000; i++) MonitorFactory.start("testTimer").stop(); System.out.println("testTimerTimeTest=" + m.stop().getTotal()); for (int i = -5; i <= 20; i++) { MonitorFactory.add("purchases", "dollars", i * 50); } System.out.println(""); System.out.println(MonitorFactory.add("NIC.bytes.received", "bytes", 250.0)); System.out.println(MonitorFactory.add("NIC.bytes.received", "bytes", 250.0)); timer.stop(); for (int i = -5; i < 25; i++) MonitorFactory.add("timetest", "ms.", i * 5); System.out.println(MonitorFactory.getMonitor("purchases", "dollars").getHits()); System.out.println(MonitorFactory.getTimeMonitor("testTimer").getHits()); // case sensitive so won't print System.out.println(MonitorFactory.getTimeMonitor("testtimer").getHits()); System.out.println("Total time=" + timer.getTotal()); MonitorFactory.reset(); MonitorFactory.setRangeDefault("dollars", getTestHolder()); m = MonitorFactory.start("purchasesTimeTestRange"); for (int i = 1; i <= 1000000; i++) MonitorFactory.add("purchasesRange", "dollars", 1000.0); System.out.println("purchasesTimeTestRange=" + m.stop().getTotal()); Object[][] data = null; MonitorFactory.setRangeDefault("bytes", getTestHolder()); MonitorFactory.setRangeDefault("cents", getTestHolder()); MonitorFactory.setRangeDefault("minutes", getTestHolder()); MonitorFactory.setRangeDefault("MB", getTestHolder()); MonitorFactory.setRangeDefault("KB", getTestHolder()); MonitorFactory.setRangeDefault("points", getTestHolder()); String[] header = MonitorFactory.getComposite("ms.").getHeader(); data = MonitorFactory.getComposite("ms.").getData(); header = MonitorFactory.getComposite("ms.").getBasicHeader(); data = MonitorFactory.getComposite("ms.").getBasicData(); header = MonitorFactory.getComposite("ms.").getDisplayHeader(); data = MonitorFactory.getComposite("ms.").getDisplayData(); MonitorFactory.getComposite("ms.").disable(); header = MonitorFactory.getComposite("ms.").getHeader(); data = MonitorFactory.getComposite("ms.").getData(); System.out.println("header length=" + header.length + ", data length=" + data.length); System.out.println("JAMon Version=" + MonitorFactory.getVersion()); }
/** * @param pages * @param workers * @param duration * @throws Exception */ public void runContentionTest(final int pages, final int workers, final Duration duration) throws Exception { final PageAccessSynchronizer sync = new PageAccessSynchronizer(Duration.seconds(1)); final AtomicInteger[] counts = new AtomicInteger[pages]; for (int i = 0; i < counts.length; i++) { counts[i] = new AtomicInteger(); } final AtomicInteger hits = new AtomicInteger(); final String[] error = new String[1]; class Worker extends Thread { @Override public void run() { Random random = new Random(); Time start = Time.now(); while (start.elapsedSince().lessThan(duration) && error[0] == null) { logger.info( "{} elapsed: {}, duration: {}", new Object[] {Thread.currentThread().getName(), start.elapsedSince(), duration}); int page1 = random.nextInt(counts.length); int page2 = random.nextInt(counts.length); int count = 0; while (page2 == page1 && count < 100) { page2 = random.nextInt(counts.length); count++; } if (page2 == page1) { throw new RuntimeException("orly?"); } try { sync.lockPage(page1); sync.lockPage(page2); // have locks, increment the count counts[page1].incrementAndGet(); counts[page2].incrementAndGet(); hits.incrementAndGet(); // hold the lock for some time try { Thread.sleep(50); } catch (InterruptedException e) { error[0] = "Worker :" + Thread.currentThread().getName() + " interrupted"; } // decrement the counts counts[page1].decrementAndGet(); counts[page2].decrementAndGet(); // release lock } catch (CouldNotLockPageException e) { // ignore } finally { sync.unlockAllPages(); } } } } class Monitor extends Thread { volatile boolean stop = false; @Override public void run() { while (!stop && error[0] == null) { for (int i = 0; i < counts.length; i++) { int count = counts[i].get(); if (count < 0 || count > 1) { error[0] = "Detected count of: " + count + " for page: " + i; return; } } try { Thread.sleep(1); } catch (InterruptedException e) { error[0] = "Monitor thread interrupted"; } } } } Monitor monitor = new Monitor(); monitor.setName("monitor"); monitor.start(); Worker[] bots = new Worker[workers]; for (int i = 0; i < bots.length; i++) { bots[i] = new Worker(); bots[i].setName("worker " + i); bots[i].start(); } for (Worker bot : bots) { bot.join(); } monitor.stop = true; monitor.join(); assertNull(error[0], error[0]); assertTrue(hits.get() >= counts.length); }