/** * Returns the {@link StatMonitorHandler}. If one does not currently exist it will be created. * * @return the StatMonitorHandler for adding monitors * @throws IllegalStateException if no SampleCollector has been created and initialized yet */ static StatMonitorHandler getStatMonitorHandler() { // sync SampleCollector.class and then instance.sampleHandlers synchronized (SampleCollector.class) { if (instance == null) { throw new IllegalStateException("Statistics sampler is not available"); } synchronized (instance.sampleHandlers) { StatMonitorHandler handler = instance.statMonitorHandler; if (handler == null) { handler = new StatMonitorHandler(); instance.addSampleHandler(handler); instance.statMonitorHandler = handler; } return handler; } } }
public void addListener(final StatisticsListener listener) { if (listener == null) { throw new NullPointerException("StatisticsListener is null"); } synchronized (this.mutex) { if (!this.listeners.contains(listener)) { this.listeners.add(listener); getStatMonitorHandler().addMonitor(this); } } }
public void close() { // sync SampleCollector.class and then this.sampleHandlers synchronized (SampleCollector.class) { synchronized (this.sampleHandlers) { if (logger.isTraceEnabled(LogMarker.STATISTICS_VERBOSE)) { logger.trace(LogMarker.STATISTICS_VERBOSE, "SampleCollector#close"); } try { StatArchiveHandler handler = this.statArchiveHandler; if (handler != null) { handler.close(); } } catch (GemFireException ignore) { logger.warn(LogMarker.STATISTICS_MARKER, "Statistic archiver shutdown failed because: {}", ignore.getMessage()); } StatMonitorHandler handler = this.statMonitorHandler; if (handler != null) { handler.close(); } } if (instance == this) { instance = null; } } }
@Test public void testAddNewMonitor() throws Exception { StatMonitorHandler handler = new StatMonitorHandler(); assertTrue(handler.getMonitorsSnapshot().isEmpty()); TestStatisticsMonitor monitor = new TestStatisticsMonitor(); assertTrue(handler.addMonitor(monitor)); assertFalse(handler.getMonitorsSnapshot().isEmpty()); assertTrue(handler.getMonitorsSnapshot().contains(monitor)); handler.sampled(NanoTimer.getTime(), Collections.<ResourceInstance>emptyList()); waitForNotificationCount(monitor, 1, 2 * 1000, 10, false); assertEquals(1, monitor.getNotificationCount()); }
@Test public void testNotificationSampleFrequencyDefault() throws Exception { final int sampleFrequency = 1; StatMonitorHandler handler = new StatMonitorHandler(); TestStatisticsMonitor monitor = new TestStatisticsMonitor(); handler.addMonitor(monitor); final int sampleCount = 100; for (int i = 0; i < sampleCount; i++) { handler.sampled(NanoTimer.getTime(), Collections.<ResourceInstance>emptyList()); waitForNotificationCount(monitor, 1 + i, 2 * 1000, 10, false); } assertEquals(sampleCount / sampleFrequency, monitor.getNotificationCount()); }
@Test public void testStatMonitorNotifierWakesUpForWork() throws Exception { StatMonitorHandler handler = new StatMonitorHandler(); TestStatisticsMonitor monitor = new TestStatisticsMonitor(); handler.addMonitor(monitor); final StatMonitorNotifier notifier = handler.getStatMonitorNotifier(); assertTrue(notifier.isAlive()); waitUntilWaiting(notifier); // if notification occurs then notifier woke up... assertEquals(0, monitor.getNotificationCount()); handler.sampled(NanoTimer.getTime(), Collections.<ResourceInstance>emptyList()); waitForNotificationCount(monitor, 1, 2 * 1000, 10, false); assertEquals(1, monitor.getNotificationCount()); // and goes back to waiting... waitUntilWaiting(notifier); }
@Test public void testAddExistingMonitorReturnsFalse() throws Exception { StatMonitorHandler handler = new StatMonitorHandler(); assertTrue(handler.getMonitorsSnapshot().isEmpty()); StatisticsMonitor monitor = new TestStatisticsMonitor(); assertTrue(handler.addMonitor(monitor)); assertFalse(handler.getMonitorsSnapshot().isEmpty()); assertTrue(handler.getMonitorsSnapshot().contains(monitor)); assertFalse(handler.addMonitor(monitor)); }
@Test public void testRemoveMissingMonitorReturnsFalse() throws Exception { StatMonitorHandler handler = new StatMonitorHandler(); assertTrue(handler.getMonitorsSnapshot().isEmpty()); StatisticsMonitor monitor = new TestStatisticsMonitor(); assertFalse(handler.getMonitorsSnapshot().contains(monitor)); assertFalse(handler.removeMonitor(monitor)); assertTrue(handler.getMonitorsSnapshot().isEmpty()); }
@Test public void testStatMonitorNotifierAliveButWaiting() throws Exception { StatMonitorHandler handler = new StatMonitorHandler(); TestStatisticsMonitor monitor = new TestStatisticsMonitor(); handler.addMonitor(monitor); final StatMonitorNotifier notifier = handler.getStatMonitorNotifier(); assertTrue(notifier.isAlive()); waitUntilWaiting(notifier); for (int i = 0; i < 20; i++) { assertTrue(notifier.isWaiting()); Thread.sleep(10); } }
public void removeListener(final StatisticsListener listener) { if (listener == null) { throw new NullPointerException("StatisticsListener is null"); } synchronized (this.mutex) { if (this.listeners.contains(listener)) { this.listeners.remove(listener); if (this.listeners.isEmpty()) { try { getStatMonitorHandler().removeMonitor(this); } catch (IllegalStateException ignore) { // sample collector and handlers were closed (ok on removal) } } } } }
@Test public void testGetStatMonitorHandler() { StatMonitorHandler handler = SampleCollector.getStatMonitorHandler(); assertNotNull(handler); assertTrue(handler.getMonitorsSnapshot().isEmpty()); assertNull(handler.getStatMonitorNotifier()); }
/** * Stops the notifier thread if one exists. */ public void close() { synchronized (this) { stopNotifier_IfEnabledAndRunning(); } }
@Test public void testRemoveListener() { TestStatisticsMonitor monitor = new TestStatisticsMonitor(); assertTrue(monitor.getStatisticsListenersSnapshot().isEmpty()); StatisticsListener listener = new StatisticsListener() { @Override public void handleNotification(StatisticsNotification notification) {} }; assertNull(this.sampleCollector.getStatMonitorHandlerSnapshot()); monitor.addListener(listener); assertFalse(monitor.getStatisticsListenersSnapshot().isEmpty()); assertTrue(monitor.getStatisticsListenersSnapshot().contains(listener)); assertEquals(1, monitor.getStatisticsListenersSnapshot().size()); assertNotNull(this.sampleCollector.getStatMonitorHandlerSnapshot()); assertFalse( this.sampleCollector.getStatMonitorHandlerSnapshot().getMonitorsSnapshot().isEmpty()); monitor.removeListener(listener); assertTrue(monitor.getStatisticsListenersSnapshot().isEmpty()); assertFalse(monitor.getStatisticsListenersSnapshot().contains(listener)); assertNotNull(this.sampleCollector.getStatMonitorHandlerSnapshot()); assertTrue( this.sampleCollector.getStatMonitorHandlerSnapshot().getMonitorsSnapshot().isEmpty()); }
@Override public void sampled(long nanosTimeStamp, List<ResourceInstance> resourceInstances) { synchronized (this) { if (this.enableMonitorThread) { final StatMonitorNotifier thread = this.notifier; if (thread != null) { try { thread.monitor(new MonitorTask(System.currentTimeMillis(), resourceInstances)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } else { monitor(System.currentTimeMillis(), resourceInstances); } } }
/** Adds a monitor which will be notified of samples */ public boolean addMonitor(StatisticsMonitor monitor) { synchronized (this) { boolean added = false; if (!this.monitors.contains(monitor)) { added = this.monitors.add(monitor); } if (!this.monitors.isEmpty()) { startNotifier_IfEnabledAndNotRunning(); } return added; } }
@Test public void testRemoveExistingMonitor() throws Exception { StatMonitorHandler handler = new StatMonitorHandler(); assertTrue(handler.getMonitorsSnapshot().isEmpty()); TestStatisticsMonitor monitor = new TestStatisticsMonitor(); assertTrue(handler.addMonitor(monitor)); assertFalse(handler.getMonitorsSnapshot().isEmpty()); assertTrue(handler.getMonitorsSnapshot().contains(monitor)); assertTrue(handler.removeMonitor(monitor)); assertFalse(handler.getMonitorsSnapshot().contains(monitor)); assertTrue(handler.getMonitorsSnapshot().isEmpty()); handler.sampled(NanoTimer.getTime(), Collections.<ResourceInstance>emptyList()); assertEquals(0, monitor.getNotificationCount()); }
@Test public void testNotificationSampleTimeMillis() throws Exception { final long currentTime = System.currentTimeMillis(); StatMonitorHandler handler = new StatMonitorHandler(); TestStatisticsMonitor monitor = new TestStatisticsMonitor(); handler.addMonitor(monitor); long nanoTimeStamp = NanoTimer.getTime(); handler.sampled(nanoTimeStamp, Collections.<ResourceInstance>emptyList()); waitForNotificationCount(monitor, 1, 2 * 1000, 10, false); assertTrue(monitor.getTimeStamp() != nanoTimeStamp); assertTrue(monitor.getTimeStamp() >= currentTime); }
/** Removes a monitor that will no longer be used */ public boolean removeMonitor(StatisticsMonitor monitor) { synchronized (this) { boolean removed = false; if (this.monitors.contains(monitor)) { removed = this.monitors.remove(monitor); } if (this.monitors.isEmpty()) { stopNotifier_IfEnabledAndRunning(); } return removed; } }
@Test public void testAddListener() { TestStatisticsMonitor monitor = new TestStatisticsMonitor(); assertTrue(monitor.getStatisticsListenersSnapshot().isEmpty()); StatisticsListener listener = new StatisticsListener() { @Override public void handleNotification(StatisticsNotification notification) {} }; assertNull(this.sampleCollector.getStatMonitorHandlerSnapshot()); monitor.addListener(listener); assertFalse(monitor.getStatisticsListenersSnapshot().isEmpty()); assertTrue(monitor.getStatisticsListenersSnapshot().contains(listener)); assertEquals(1, monitor.getStatisticsListenersSnapshot().size()); assertNotNull(this.sampleCollector.getStatMonitorHandlerSnapshot()); assertFalse( this.sampleCollector.getStatMonitorHandlerSnapshot().getMonitorsSnapshot().isEmpty()); }
@Test public void testNotificationResourceInstances() throws Exception { final int resourceInstanceCount = 100; final List<ResourceInstance> resourceInstances = new ArrayList<ResourceInstance>(); for (int i = 0; i < resourceInstanceCount; i++) { resourceInstances.add(new ResourceInstance(i, null, null)); } StatMonitorHandler handler = new StatMonitorHandler(); TestStatisticsMonitor monitor = new TestStatisticsMonitor(); handler.addMonitor(monitor); handler.sampled(NanoTimer.getTime(), Collections.unmodifiableList(resourceInstances)); waitForNotificationCount(monitor, 1, 2 * 1000, 10, false); final List<ResourceInstance> notificationResourceInstances = monitor.getResourceInstances(); assertNotNull(notificationResourceInstances); assertEquals(resourceInstances, notificationResourceInstances); assertEquals(resourceInstanceCount, notificationResourceInstances.size()); int i = 0; for (ResourceInstance resourceInstance : notificationResourceInstances) { assertEquals(i, resourceInstance.getId()); i++; } }