/** * {@inheritDoc} */ public final List<Metric> poll(MetricFilter filter, boolean reset) { Map<String, Future<List<Metric>>> futures = new HashMap<>(); for (Map.Entry<String, MetricPoller> e : pollers.entrySet()) { PollCallable task = new PollCallable(e.getValue(), filter, reset); futures.put(e.getKey(), executor.submit(task)); } List<Metric> allMetrics = new ArrayList<>(); for (Map.Entry<String, Future<List<Metric>>> e : futures.entrySet()) { allMetrics.addAll(getMetrics(e.getKey(), e.getValue())); } return allMetrics; } }
private List<Metric> getMetrics(String name, Future<List<Metric>> future) { List<Metric> metrics = EMPTY; try { metrics = future.get(timeout, TimeUnit.MILLISECONDS); } catch (ExecutionException e) { increment(e, name); LOGGER.warn("uncaught exception from poll method for " + name, e); } catch (TimeoutException e) { // The cancel is needed to prevent the slow task from using up all threads future.cancel(true); increment(e, name); LOGGER.warn("timeout executing poll method for " + name, e); } catch (InterruptedException e) { increment(e, name); LOGGER.warn("interrupted while doing get for " + name, e); } return metrics; }
/** * {@inheritDoc} */ public final List<Metric> poll(MetricFilter filter) { return poll(filter, false); }
@Test public void testBasic() throws Exception { Map<String, MetricPoller> pollers = new HashMap<>(); pollers.put("p1", newPoller(0)); ExecutorService exec = Executors.newFixedThreadPool(1); MetricPoller poller = new CompositeMetricPoller(pollers, exec, 10000); assertEquals(poller.poll(MATCH_ALL), mkList()); }
@Test public void testException() throws Exception { MockMetricPoller mock = new MockMetricPoller(); mock.setDie(true); Map<String, MetricPoller> pollers = new HashMap<>(); pollers.put("p1", mock); pollers.put("p2", newPoller(0)); ExecutorService exec = Executors.newFixedThreadPool(1); MetricPoller poller = new CompositeMetricPoller(pollers, exec, 10000); assertEquals(poller.poll(MATCH_ALL), mkList()); } }
/** * {@inheritDoc} */ public final List<Metric> poll(MetricFilter filter) { return poll(filter, false); }
/** * {@inheritDoc} */ public final List<Metric> poll(MetricFilter filter, boolean reset) { Map<String, Future<List<Metric>>> futures = new HashMap<>(); for (Map.Entry<String, MetricPoller> e : pollers.entrySet()) { PollCallable task = new PollCallable(e.getValue(), filter, reset); futures.put(e.getKey(), executor.submit(task)); } List<Metric> allMetrics = new ArrayList<>(); for (Map.Entry<String, Future<List<Metric>>> e : futures.entrySet()) { allMetrics.addAll(getMetrics(e.getKey(), e.getValue())); } return allMetrics; } }
private List<Metric> getMetrics(String name, Future<List<Metric>> future) { List<Metric> metrics = EMPTY; try { metrics = future.get(timeout, TimeUnit.MILLISECONDS); } catch (ExecutionException e) { increment(e, name); LOGGER.warn("uncaught exception from poll method for " + name, e); } catch (TimeoutException e) { // The cancel is needed to prevent the slow task from using up all threads future.cancel(true); increment(e, name); LOGGER.warn("timeout executing poll method for " + name, e); } catch (InterruptedException e) { increment(e, name); LOGGER.warn("interrupted while doing get for " + name, e); } return metrics; }
@Test public void testMultiple() throws Exception { Map<String, MetricPoller> pollers = new HashMap<>(); pollers.put("p1", newPoller(0)); pollers.put("p2", newPoller(0)); ExecutorService exec = Executors.newFixedThreadPool(1); MetricPoller poller = new CompositeMetricPoller(pollers, exec, 10000); assertEquals(poller.poll(MATCH_ALL), UnmodifiableList.copyOf(Iterables.concat(mkList(), mkList()))); }
@Test public void testTimeout() throws Exception { // Note: java8 changes the hashing/traversal order so you can see slightly different // behavior if there is a bug. In particular before we were cancelling the future on // timeout, then if the p2 key times out it will fail on java7 and pass on java8. // If the p1 key times out the opposite. Map<String, MetricPoller> pollers = new HashMap<>(); pollers.put("p1", newPoller(120000)); pollers.put("p2", newPoller(0)); // To make it fail regardless of jdk version if there is an issue pollers.put("p3", newPoller(120000)); pollers.put("p4", newPoller(120000)); pollers.put("p5", newPoller(120000)); ExecutorService exec = Executors.newFixedThreadPool(1); MetricPoller poller = new CompositeMetricPoller(pollers, exec, 500); assertEquals(poller.poll(MATCH_ALL), mkList()); }