public void setEvictionQueueSizeMonitor(final EvictionQueue evictionQueue) { Callable<Integer> registrySizeCallable = new Callable<Integer>() { @Override public Integer call() throws Exception { return evictionQueue.size(); } }; BasicGauge<Integer> gauge = new BasicGauge<>(monitorConfig("evictionQueueSize"), registrySizeCallable); register(gauge); } }
public EvictionQueueMetrics() { super("evictionQueue"); evictionQueueAddCounter = newCounter("addedEvictions"); evictionQueueRemoveCounter = newCounter("removedEvictions"); }
eurekaServerRegistryMetrics.bindMetrics(); EvictionQueueMetrics evictionQueueMetrics = new EvictionQueueMetrics(); evictionQueueMetrics.bindMetrics();
@Override public void add(InstanceInfo instanceInfo, Source source) { evictionQueueMetrics.incrementEvictionQueueAddCounter(); queue.addLast(new EvictionItem(instanceInfo, source, worker.now() + evictionTimeoutMs)); }
public EvictionQueueImpl(WriteServerConfig config, WriteServerMetricFactory metricFactory, Scheduler scheduler) { this.evictionTimeoutMs = config.getEvictionTimeoutMs(); this.evictionQueueMetrics = metricFactory.getEvictionQueueMetrics(); this.worker = scheduler.createWorker(); evictionQueueMetrics.setEvictionQueueSizeMonitor(this); }
@Override public void call() { long now = worker.now(); while (evictionQuota.get() > 0 && !queue.isEmpty() && queue.peek().getExpiryTime() <= now) { EvictionItem item = queue.poll(); evictionQuota.decrementAndGet(); evictionQueueMetrics.decrementEvictionQueueCounter(); logger.info("Evicting registry entry {}/{}", item.getSource(), item.getInstanceInfo().getId()); evictionSubscriber.get().onNext(item); } long scheduleDelay = evictionTimeoutMs; if (!queue.isEmpty()) { scheduleDelay = queue.peek().getExpiryTime() - now; if (scheduleDelay <= 0) { // We have no quota to consume expired items from the queue. // To avoid rescheduling conditionally from multiple places, which would require // locking, we actively reschedule the task, with reasonable frequency. scheduleDelay = Math.max(100, evictionTimeoutMs / 10); } } worker.schedule(pushAction, scheduleDelay, TimeUnit.MILLISECONDS); } };