public void run(final boolean forever) throws Exception {
STATS.clear();
try (JMXConnector jmxc = JMXConnectorFactory.connect(new JMXServiceURL(jmxUrl), jmxEnv)) {
final MBeanServerConnection beanConn = jmxc.getMBeanServerConnection();
do {
final long now = System.currentTimeMillis();
final Optional<NodeInfo> nodeInfo = NodeInfo.getNodeInfo(beanConn);
if (!nodeInfo.isPresent()) return;
MBeanAttributeInfo attr = new MBeanAttributeInfo("", "", "", false, false, false);
beanConn.queryMBeans(null, null).stream()
.map(objectInstance -> new MBeanInfo(getMetricPath(objectInstance.getObjectName(), attr), objectInstance.getObjectName(), attr))
.filter(mbean -> blacklist.stream().noneMatch(pattern -> pattern.matcher(mbean.metricName).matches()))
.flatMap(mBeanInfo -> toMBeanInfos(beanConn, mBeanInfo))
.filter(m -> shouldScrap(m, now))
.forEach(mBean -> updateMetric(beanConn, mBean, nodeInfo.get()));
lastScrapes.forEach((k, lastScrape) -> {
if (now - lastScrape >= k) lastScrapes.put(k, now);
});
final long duration = System.currentTimeMillis() - now;
logger.info("Scrap took {}ms for the whole run", duration);
if (forever) Thread.sleep(Math.max(scrapFrequencies.firstKey() - duration, 10 * 1000));
} while (forever);
}
}