package org.xbib.elasticsearch.gatherer; import org.elasticsearch.ElasticSearchException; import org.elasticsearch.common.Strings; import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.node.service.NodeService; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import static org.elasticsearch.common.util.concurrent.EsExecutors.daemonThreadFactory; /** * The gatherer service manages the gatherer registry. * * Gatherers are announced to the node attributes so they can be seen by node discovery. */ public class GathererService extends AbstractLifecycleComponent<GathererService> { private final GathererRegistry registry; private final NodeService nodeService; private final OperatingSystemMXBean operatingSystemMXBean; @Inject public GathererService(Settings settings, GathererRegistry registry, NodeService nodeService) { super(settings); this.registry = registry; this.nodeService = nodeService; this.operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean(); } public GathererRegistry getRegistry() { return registry; } @Override protected void doStart() throws ElasticSearchException { // announce default gatherers announceGatherers(); // the load updater task ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(daemonThreadFactory(settings, "gatherer_load_watcher")); executorService.scheduleAtFixedRate(new Thread() { public void run() { double load = operatingSystemMXBean.getSystemLoadAverage(); nodeService.putAttribute(GathererConstants.GATHERER_LOAD, Double.toString(load)); } }, 1L, 1L, TimeUnit.MINUTES); // the queue length updater task executorService.scheduleAtFixedRate(new Thread() { public void run() { int length = 0; // TODO getPendingJobs(); nodeService.putAttribute(GathererConstants.GATHERER_LENGTH, Integer.toString(length)); } }, 1L, 5L, TimeUnit.SECONDS); logger.info("started"); } @Override protected void doStop() throws ElasticSearchException { nodeService.removeAttribute(GathererConstants.GATHERER_MODULES); nodeService.removeAttribute(GathererConstants.GATHERER_LOAD); nodeService.removeAttribute(GathererConstants.GATHERER_LENGTH); } @Override protected void doClose() throws ElasticSearchException { } /** * Get all gatherers in the registry and announce them to the node service. */ public void announceGatherers() { nodeService.putAttribute(GathererConstants.GATHERER_MODULES, Strings.collectionToCommaDelimitedString(registry.getGatherers().keySet())); } }