diff --git a/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/Micrometer.java b/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/Micrometer.java index 6327f29fc7..215a510778 100644 --- a/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/Micrometer.java +++ b/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/Micrometer.java @@ -35,63 +35,16 @@ public final class Micrometer { private static final String SCHEDULERS_DECORATOR_KEY = "reactor.core.observability.micrometer.schedulerDecorator"; - private static MeterRegistry registry = Metrics.globalRegistry; /** * The default "name" to use as a prefix for meter if the instrumented sequence doesn't define a {@link reactor.core.publisher.Flux#name(String) name}. */ public static final String DEFAULT_METER_PREFIX = "reactor"; - /** - * Set the registry to use in reactor-core-micrometer for metrics related purposes. - * @return the previously configured registry. - * @deprecated in M4, will be removed in M5 / RC1. prefer your own singleton and explicitly - * passing the registry to {@link #metrics(MeterRegistry, Clock)} - */ - @Deprecated - public static MeterRegistry useRegistry(MeterRegistry newRegistry) { - MeterRegistry previous = registry; - registry = newRegistry; - return previous; - } - - /** - * Get the registry used in reactor-core-micrometer for metrics related purposes. - * - * @deprecated in M4, will be removed in M5 / RC1. prefer your own singleton and explicitly - * passing the registry to {@link #metrics(MeterRegistry, Clock)} - */ - @Deprecated - public static MeterRegistry getRegistry() { - return registry; - } - - /** - * A {@link SignalListener} factory that will ultimately produce Micrometer metrics - * to the configured default {@link #getRegistry() registry}. - * To be used with either the {@link reactor.core.publisher.Flux#tap(SignalListenerFactory)} or - * {@link reactor.core.publisher.Mono#tap(SignalListenerFactory)} operator. - *

- * When used in a {@link reactor.core.publisher.Flux#tap(SignalListenerFactory)} operator, meter names use - * the {@link reactor.core.publisher.Flux#name(String)} set upstream of the tap as id prefix if applicable - * or default to {@link #DEFAULT_METER_PREFIX}. Similarly, upstream tags are gathered and added - * to the default set of tags for meters. - *

- * Note that some monitoring systems like Prometheus require to have the exact same set of - * tags for each meter bearing the same name. - * - * @param the type of onNext in the target publisher - * @return a {@link SignalListenerFactory} to record metrics - * @deprecated in M4, will be removed in M5 / RC1. prefer explicitly passing a registry via {@link #metrics(MeterRegistry, Clock)} - */ - @Deprecated - public static SignalListenerFactory metrics() { - return new MicrometerMeterListenerFactory<>(); - } - /** * A {@link SignalListener} factory that will ultimately produce Micrometer metrics - * to the provided {@link MeterRegistry} using the provided {@link Clock} for timings. + * to the provided {@link MeterRegistry} (and using the registry's {@link MeterRegistry.Config#clock() configured} + * {@link Clock} in case additional timings are needed). * To be used with either the {@link reactor.core.publisher.Flux#tap(SignalListenerFactory)} or * {@link reactor.core.publisher.Mono#tap(SignalListenerFactory)} operator. *

@@ -104,20 +57,11 @@ public static MeterRegistry getRegistry() { * tags for each meter bearing the same name. * * @param the type of onNext in the target publisher + * @param meterRegistry the {@link MeterRegistry} in which to register and publish metrics * @return a {@link SignalListenerFactory} to record metrics */ - public static SignalListenerFactory metrics(MeterRegistry registry, Clock clock) { - return new MicrometerMeterListenerFactory() { - @Override - protected Clock useClock() { - return clock; - } - - @Override - protected MeterRegistry useRegistry() { - return registry; - } - }; + public static SignalListenerFactory metrics(MeterRegistry meterRegistry) { + return new MicrometerMeterListenerFactory(meterRegistry); } /** diff --git a/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListener.java b/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListener.java index 68ad175c2b..4fd0c0204f 100644 --- a/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListener.java +++ b/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListener.java @@ -126,7 +126,7 @@ public void doOnNext(T t) { } //record the delay since previous onNext/onSubscribe. This also records the count. long last = this.lastNextEventNanos; - this.lastNextEventNanos = configuration.clock.monotonicTime(); + this.lastNextEventNanos = configuration.registry.config().clock().monotonicTime(); this.onNextIntervalTimer.record(lastNextEventNanos - last, TimeUnit.NANOSECONDS); } @@ -138,8 +138,8 @@ public void doOnMalformedOnNext(T value) { @Override public void doOnSubscription() { recordOnSubscribe(configuration.sequenceName, configuration.commonTags, configuration.registry); - this.subscribeToTerminateSample = Timer.start(configuration.clock); - this.lastNextEventNanos = configuration.clock.monotonicTime(); + this.subscribeToTerminateSample = Timer.start(configuration.registry); + this.lastNextEventNanos = configuration.registry.config().clock().monotonicTime(); } @Override diff --git a/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListenerConfiguration.java b/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListenerConfiguration.java index bf7992508d..6699700306 100644 --- a/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListenerConfiguration.java +++ b/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListenerConfiguration.java @@ -41,20 +41,20 @@ final class MicrometerMeterListenerConfiguration { private static final Logger LOGGER = Loggers.getLogger(MicrometerMeterListenerConfiguration.class); - static MicrometerMeterListenerConfiguration fromFlux(Flux source, MeterRegistry meterRegistry, Clock clock) { + static MicrometerMeterListenerConfiguration fromFlux(Flux source, MeterRegistry meterRegistry) { Tags defaultTags = MicrometerMeterListener.DEFAULT_TAGS_FLUX; final String name = resolveName(source, LOGGER, Micrometer.DEFAULT_METER_PREFIX); final Tags tags = resolveTags(source, defaultTags); - return new MicrometerMeterListenerConfiguration(name, tags, meterRegistry, clock, false); + return new MicrometerMeterListenerConfiguration(name, tags, meterRegistry, false); } - static MicrometerMeterListenerConfiguration fromMono(Mono source, MeterRegistry meterRegistry, Clock clock) { + static MicrometerMeterListenerConfiguration fromMono(Mono source, MeterRegistry meterRegistry) { Tags defaultTags = MicrometerMeterListener.DEFAULT_TAGS_MONO; final String name = resolveName(source, LOGGER, Micrometer.DEFAULT_METER_PREFIX); final Tags tags = resolveTags(source, defaultTags); - return new MicrometerMeterListenerConfiguration(name, tags, meterRegistry, clock, true); + return new MicrometerMeterListenerConfiguration(name, tags, meterRegistry, true); } /** @@ -103,7 +103,6 @@ static Tags resolveTags(Publisher source, Tags tags) { return tags; } - final Clock clock; final Tags commonTags; final boolean isMono; final String sequenceName; @@ -112,9 +111,7 @@ static Tags resolveTags(Publisher source, Tags tags) { // separator is the dot, not camelCase... final MeterRegistry registry; - MicrometerMeterListenerConfiguration(String sequenceName, Tags tags, MeterRegistry registryCandidate, Clock clock, - boolean isMono) { - this.clock = clock; + MicrometerMeterListenerConfiguration(String sequenceName, Tags tags, MeterRegistry registryCandidate, boolean isMono) { this.commonTags = tags; this.isMono = isMono; this.sequenceName = sequenceName; diff --git a/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListenerFactory.java b/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListenerFactory.java index 028549a506..8148067b2e 100644 --- a/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListenerFactory.java +++ b/reactor-core-micrometer/src/main/java/reactor/core/observability/micrometer/MicrometerMeterListenerFactory.java @@ -17,6 +17,7 @@ package reactor.core.observability.micrometer; import io.micrometer.core.instrument.Clock; +import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.MeterRegistry; import org.reactivestreams.Publisher; @@ -33,22 +34,19 @@ */ class MicrometerMeterListenerFactory implements SignalListenerFactory { - protected Clock useClock() { - return Clock.SYSTEM; - } + final MeterRegistry registry; - @SuppressWarnings("deprecation") - protected MeterRegistry useRegistry() { - return Micrometer.getRegistry(); + MicrometerMeterListenerFactory(MeterRegistry registry) { + this.registry = registry; } @Override public MicrometerMeterListenerConfiguration initializePublisherState(Publisher source) { if (source instanceof Mono) { - return MicrometerMeterListenerConfiguration.fromMono((Mono) source, useRegistry(), useClock()); + return MicrometerMeterListenerConfiguration.fromMono((Mono) source, this.registry); } else if (source instanceof Flux) { - return MicrometerMeterListenerConfiguration.fromFlux((Flux) source, useRegistry(), useClock()); + return MicrometerMeterListenerConfiguration.fromFlux((Flux) source, this.registry); } else { throw new IllegalArgumentException("MicrometerMeterListenerFactory must only be used via the tap operator / with a Flux or Mono"); diff --git a/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerConfigurationTest.java b/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerConfigurationTest.java index 153e41e167..dc32c79c6a 100644 --- a/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerConfigurationTest.java +++ b/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerConfigurationTest.java @@ -58,9 +58,9 @@ void fromFlux(@Nullable String name, @Nullable String tag) { flux = flux.tag("tag", tag); } - MicrometerMeterListenerConfiguration configuration = MicrometerMeterListenerConfiguration.fromFlux(flux, expectedRegistry, expectedClock); + MicrometerMeterListenerConfiguration configuration = MicrometerMeterListenerConfiguration.fromFlux(flux, expectedRegistry); - assertThat(configuration.clock).as("clock").isSameAs(expectedClock); + assertThat(configuration.registry.config().clock()).as("clock").isSameAs(expectedClock); assertThat(configuration.registry).as("registry").isSameAs(expectedRegistry); assertThat(configuration.isMono).as("isMono").isFalse(); @@ -100,9 +100,9 @@ void fromMono(@Nullable String name, @Nullable String tag) { mono = mono.tag("tag", tag); } - MicrometerMeterListenerConfiguration configuration = MicrometerMeterListenerConfiguration.fromMono(mono, expectedRegistry, expectedClock); + MicrometerMeterListenerConfiguration configuration = MicrometerMeterListenerConfiguration.fromMono(mono, expectedRegistry); - assertThat(configuration.clock).as("clock").isSameAs(expectedClock); + assertThat(configuration.registry.config().clock()).as("clock").isSameAs(expectedClock); assertThat(configuration.registry).as("registry").isSameAs(expectedRegistry); assertThat(configuration.isMono).as("isMono").isTrue(); diff --git a/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerFactoryTest.java b/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerFactoryTest.java index e3a10926d5..52bf2b53ca 100644 --- a/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerFactoryTest.java +++ b/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerFactoryTest.java @@ -17,7 +17,7 @@ package reactor.core.observability.micrometer; import io.micrometer.core.instrument.Clock; -import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.simple.SimpleConfig; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import org.junit.jupiter.api.Test; import org.reactivestreams.Publisher; @@ -36,34 +36,11 @@ */ class MicrometerMeterListenerFactoryTest { - @Test - void useClockDefaultsToSystemClock() { - MicrometerMeterListenerFactory factory = new MicrometerMeterListenerFactory<>(); - - assertThat(factory.useClock()).isSameAs(Clock.SYSTEM); - } - - @Test - void useRegistryDefaultsToCommonRegistry() { - SimpleMeterRegistry commonRegistry = new SimpleMeterRegistry(); - MeterRegistry defaultCommon = Micrometer.useRegistry(commonRegistry); - try { - MicrometerMeterListenerFactory factory = new MicrometerMeterListenerFactory<>(); - - assertThat(factory.useRegistry()).isSameAs(Micrometer.getRegistry()) - .isSameAs(commonRegistry); - } - finally { - Micrometer.useRegistry(defaultCommon); - } - } - @Test void configurationFromMono() { MicrometerMeterListenerConfiguration configuration = CUSTOM_FACTORY.initializePublisherState(Mono.just(1)); assertThat(configuration.registry).as("registry").isSameAs(CUSTOM_REGISTRY); - assertThat(configuration.clock).as("clock").isSameAs(CUSTOM_CLOCK); assertThat(configuration.isMono).as("isMono").isTrue(); assertThat(configuration.commonTags).map(Object::toString).containsExactly("tag(type=Mono)"); } @@ -73,7 +50,6 @@ void configurationFromFlux() { MicrometerMeterListenerConfiguration configuration = CUSTOM_FACTORY.initializePublisherState(Flux.just(1, 2)); assertThat(configuration.registry).as("registry").isSameAs(CUSTOM_REGISTRY); - assertThat(configuration.clock).as("clock").isSameAs(CUSTOM_CLOCK); assertThat(configuration.isMono).as("isMono").isFalse(); assertThat(configuration.commonTags).map(Object::toString).containsExactly("tag(type=Flux)"); } @@ -106,17 +82,7 @@ public long monotonicTime() { return 0; } }; - protected static final SimpleMeterRegistry CUSTOM_REGISTRY = new SimpleMeterRegistry(); + protected static final SimpleMeterRegistry CUSTOM_REGISTRY = new SimpleMeterRegistry(SimpleConfig.DEFAULT, CUSTOM_CLOCK); protected static final MicrometerMeterListenerFactory - CUSTOM_FACTORY = new MicrometerMeterListenerFactory() { - @Override - protected Clock useClock() { - return CUSTOM_CLOCK; - } - - @Override - protected MeterRegistry useRegistry() { - return CUSTOM_REGISTRY; - } - }; + CUSTOM_FACTORY = new MicrometerMeterListenerFactory(CUSTOM_REGISTRY); } \ No newline at end of file diff --git a/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerTest.java b/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerTest.java index 3410668065..47ee415827 100644 --- a/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerTest.java +++ b/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerMeterListenerTest.java @@ -23,6 +23,7 @@ import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Tags; import io.micrometer.core.instrument.Timer; +import io.micrometer.core.instrument.simple.SimpleConfig; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -42,7 +43,6 @@ class MicrometerMeterListenerTest { @BeforeEach void initRegistry() { - registry = new SimpleMeterRegistry(); virtualClockTime = new AtomicLong(); virtualClock = new Clock() { @Override @@ -55,11 +55,11 @@ public long monotonicTime() { return virtualClockTime.get(); } }; + registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, virtualClock); configuration = new MicrometerMeterListenerConfiguration( "testName", Tags.of("testTag1", "testTagValue1","testTag2", "testTagValue2"), registry, - virtualClock, false); } @@ -69,7 +69,6 @@ void initialStateFluxWithDefaultName() { Micrometer.DEFAULT_METER_PREFIX, Tags.of("testTag1", "testTagValue1","testTag2", "testTagValue2"), registry, - virtualClock, false); MicrometerMeterListener listener = new MicrometerMeterListener<>(configuration); @@ -95,7 +94,6 @@ void initialStateFluxWithCustomName() { "testName", Tags.of("testTag1", "testTagValue1","testTag2", "testTagValue2"), registry, - virtualClock, false); MicrometerMeterListener listener = new MicrometerMeterListener<>(configuration); @@ -126,7 +124,6 @@ void initialStateMono() { Micrometer.DEFAULT_METER_PREFIX, Tags.of("testTag1", "testTagValue1","testTag2", "testTagValue2"), registry, - virtualClock, true); MicrometerMeterListener listener = new MicrometerMeterListener<>(configuration); @@ -284,7 +281,7 @@ void doOnNextRecordsInterval() { @Test void doOnNextRecordsInterval_defaultName() { configuration = new MicrometerMeterListenerConfiguration(Micrometer.DEFAULT_METER_PREFIX, Tags.empty(), - registry, virtualClock, false); + registry, false); MicrometerMeterListener listener = new MicrometerMeterListener<>(configuration); listener.doOnSubscription(); @@ -309,7 +306,7 @@ void doOnNextRecordsInterval_defaultName() { @Test void doOnNext_monoRecordsCompletionOnly() { configuration = new MicrometerMeterListenerConfiguration("testName", Tags.empty(), - registry, virtualClock, true); + registry, true); MicrometerMeterListener listener = new MicrometerMeterListener<>(configuration); listener.doOnSubscription(); @@ -369,7 +366,7 @@ void doOnRequestRecordsTotalDemand() { @Test void doOnRequestMonoIgnoresRequest() { - configuration = new MicrometerMeterListenerConfiguration("testName", Tags.empty(), registry, virtualClock, true); + configuration = new MicrometerMeterListenerConfiguration("testName", Tags.empty(), registry, true); MicrometerMeterListener listener = new MicrometerMeterListener<>(configuration); assertThatCode(() -> listener.doOnRequest(100L)).doesNotThrowAnyException(); assertThat(listener.requestedCounter).isNull(); @@ -377,7 +374,7 @@ void doOnRequestMonoIgnoresRequest() { @Test void doOnRequestDefaultNameIgnoresRequest() { - configuration = new MicrometerMeterListenerConfiguration(Micrometer.DEFAULT_METER_PREFIX, Tags.empty(), registry, virtualClock, false); + configuration = new MicrometerMeterListenerConfiguration(Micrometer.DEFAULT_METER_PREFIX, Tags.empty(), registry, false); MicrometerMeterListener listener = new MicrometerMeterListener<>(configuration); assertThatCode(() -> listener.doOnRequest(100L)).doesNotThrowAnyException(); assertThat(listener.requestedCounter).isNull(); diff --git a/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerTest.java b/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerTest.java index 9b68580b37..f0099ea1f2 100644 --- a/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerTest.java +++ b/reactor-core-micrometer/src/test/java/reactor/core/observability/micrometer/MicrometerTest.java @@ -16,13 +16,9 @@ package reactor.core.observability.micrometer; -import io.micrometer.core.instrument.Clock; -import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -32,66 +28,12 @@ */ class MicrometerTest { - private MeterRegistry defaultRegistry; - - @BeforeEach - void init() { - defaultRegistry = Micrometer.getRegistry(); - } - - @AfterEach - void restore() { - Micrometer.useRegistry(defaultRegistry); - } - - @Test - void defaultRegistryCanBeChanged() { - MeterRegistry registry = Micrometer.getRegistry(); - try { - assertThat(registry).as("default common registry").isEqualTo(Metrics.globalRegistry); - - MeterRegistry replacement = new SimpleMeterRegistry(); - MeterRegistry old = Micrometer.useRegistry(replacement); - - assertThat(old).as("useRegistry return value").isSameAs(registry); - assertThat(Micrometer.getRegistry()).as("getRegistry post useRegistry").isSameAs(replacement); - } - finally { - Micrometer.useRegistry(registry); - } - } - - @Test - void metricsUsesCommonRegistry() { - SimpleMeterRegistry customCommonRegistry = new SimpleMeterRegistry(); - Micrometer.useRegistry(customCommonRegistry); - MicrometerMeterListenerFactory factory = (MicrometerMeterListenerFactory) Micrometer.metrics(); - - assertThat(factory.useClock()).as("clock").isSameAs(Clock.SYSTEM); - assertThat(factory.useRegistry()).as("registry").isSameAs(customCommonRegistry); - } - @Test void metricsUsesSpecifiedClockAndRegistry() { - SimpleMeterRegistry customCommonRegistry = new SimpleMeterRegistry(); - Micrometer.useRegistry(customCommonRegistry); SimpleMeterRegistry customLocalRegistry = new SimpleMeterRegistry(); - Clock customLocalClock = new Clock() { - @Override - public long wallTime() { - return 0; - } - - @Override - public long monotonicTime() { - return 0; - } - }; - - MicrometerMeterListenerFactory factory = (MicrometerMeterListenerFactory) Micrometer.metrics(customLocalRegistry, customLocalClock); + MicrometerMeterListenerFactory factory = (MicrometerMeterListenerFactory) Micrometer.metrics(customLocalRegistry); - assertThat(factory.useClock()).as("clock").isSameAs(customLocalClock).isNotSameAs(Clock.SYSTEM); - assertThat(factory.useRegistry()).as("registry").isSameAs(customLocalRegistry).isNotSameAs(customCommonRegistry); + assertThat(factory.registry).as("registry").isSameAs(customLocalRegistry).isNotSameAs(Metrics.globalRegistry); } @Test