/** * If Micrometer is available, set-up a decorator that will instrument any * {@link ExecutorService} that backs a {@link Scheduler}. * No-op if Micrometer isn't available. * * This instrumentation sends data to the Micrometer Global Registry. * * @implNote Note that this is added as a decorator via Schedulers when enabling metrics for schedulers, which doesn't change the Factory. */ public static void enableMetrics() { if (Metrics.isInstrumentationAvailable()) { addExecutorServiceDecorator(SchedulerMetricDecorator.METRICS_DECORATOR_KEY, new SchedulerMetricDecorator()); } }
@Test public void schedulerDecoratorAddsSameIfDifferentKeys() { AtomicInteger tracker = new AtomicInteger(); BiFunction<Scheduler, ScheduledExecutorService, ScheduledExecutorService> decorator = (scheduler, serv) -> { tracker.addAndGet(1); return serv; }; //decorators are cleared after test Schedulers.addExecutorServiceDecorator("k1", decorator); Schedulers.addExecutorServiceDecorator("k2", decorator); Schedulers.addExecutorServiceDecorator("k3", decorator); //trigger the decorators Schedulers.newSingle("foo").dispose(); assertThat(tracker).as("decorator invoked three times").hasValue(3); }
@Test public void schedulerDecoratorIsAdditive() throws InterruptedException { AtomicInteger tracker = new AtomicInteger(); BiFunction<Scheduler, ScheduledExecutorService, ScheduledExecutorService> decorator1 = (scheduler, serv) -> { tracker.addAndGet(1); return serv; }; BiFunction<Scheduler, ScheduledExecutorService, ScheduledExecutorService> decorator2 = (scheduler, serv) -> { tracker.addAndGet(10); return serv; }; BiFunction<Scheduler, ScheduledExecutorService, ScheduledExecutorService> decorator3 = (scheduler, serv) -> { tracker.addAndGet(100); return serv; }; //decorators are cleared after test Schedulers.addExecutorServiceDecorator("k1", decorator1); Schedulers.addExecutorServiceDecorator("k2", decorator2); Schedulers.addExecutorServiceDecorator("k3", decorator3); //trigger the decorators Schedulers.newSingle("foo").dispose(); assertThat(tracker).as("3 decorators invoked").hasValue(111); }
@Test public void schedulerDecoratorAddsOnceIfSameKey() { AtomicInteger tracker = new AtomicInteger(); BiFunction<Scheduler, ScheduledExecutorService, ScheduledExecutorService> decorator1 = (scheduler, serv) -> { tracker.addAndGet(1); return serv; }; BiFunction<Scheduler, ScheduledExecutorService, ScheduledExecutorService> decorator2 = (scheduler, serv) -> { tracker.addAndGet(10); return serv; }; //decorators are cleared after test Schedulers.addExecutorServiceDecorator("k1", decorator1); Schedulers.addExecutorServiceDecorator("k1", decorator2); //trigger the decorators Schedulers.newSingle("foo").dispose(); assertThat(tracker).as("decorator invoked once").hasValue(1); }
@Test public void schedulerDecoratorDisposedWhenRemoved() { AtomicBoolean disposeTracker = new AtomicBoolean(); class DisposableDecorator implements BiFunction<Scheduler, ScheduledExecutorService, ScheduledExecutorService>, Disposable { @Override public ScheduledExecutorService apply(Scheduler scheduler, ScheduledExecutorService service) { return service; } @Override public void dispose() { disposeTracker.set(true); } } DisposableDecorator decorator = new DisposableDecorator(); Schedulers.addExecutorServiceDecorator("k1", decorator); assertThat(Schedulers.removeExecutorServiceDecorator("k1")) .as("decorator removed") .isSameAs(decorator); assertThat(disposeTracker) .as("decorator disposed") .isTrue(); }
/** * If Micrometer is available, set-up a decorator that will instrument any * {@link ExecutorService} that backs a {@link Scheduler}. * No-op if Micrometer isn't available. * * This instrumentation sends data to the Micrometer Global Registry. * * @implNote Note that this is added as a decorator via Schedulers when enabling metrics for schedulers, which doesn't change the Factory. */ public static void enableMetrics() { if (Metrics.isInstrumentationAvailable()) { addExecutorServiceDecorator(SchedulerMetricDecorator.METRICS_DECORATOR_KEY, new SchedulerMetricDecorator()); } }