From f47c83b63672547aba5ede8db5982a1763e80299 Mon Sep 17 00:00:00 2001 From: Jonatan Ivanov Date: Mon, 27 Mar 2023 16:46:19 -0700 Subject: [PATCH] Hack Timer UX --- .../core/instrument/AbstractTimerBuilder.java | 8 +++++ .../io/micrometer/core/instrument/Timer.java | 14 +++++--- .../DistributionStatisticConfig.java | 14 ++++++++ .../java/io/micrometer/core/samples/Demo.java | 33 +++++++++++++++++++ 4 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 samples/micrometer-samples-core/src/main/java/io/micrometer/core/samples/Demo.java diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/AbstractTimerBuilder.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/AbstractTimerBuilder.java index 84c57e3227..09c03ab9b2 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/AbstractTimerBuilder.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/AbstractTimerBuilder.java @@ -51,6 +51,14 @@ protected AbstractTimerBuilder(String name) { maximumExpectedValue(Duration.ofSeconds(30)); } + protected AbstractTimerBuilder(B builder) { + this.name = builder.name; + tags(builder.tags); + this.distributionConfigBuilder = new DistributionStatisticConfig.Builder(builder.distributionConfigBuilder); + description(builder.description); + pauseDetector(builder.pauseDetector); + } + /** * @param tags Must be an even number of arguments representing key/value pairs of * tags. diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/Timer.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/Timer.java index 8e6c90caa7..b5f45f85c0 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/Timer.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/Timer.java @@ -27,11 +27,7 @@ import java.util.Arrays; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; -import java.util.function.BooleanSupplier; -import java.util.function.DoubleSupplier; -import java.util.function.IntSupplier; -import java.util.function.LongSupplier; -import java.util.function.Supplier; +import java.util.function.*; /** * Timer intended to track of a large number of short running events. Example would be @@ -354,6 +350,14 @@ class Builder extends AbstractTimerBuilder { super(name); } + Builder(Builder builder) { + super(builder); + } + + public Function with(MeterRegistry registry) { + return tags -> new Builder(this).tags(tags).register(registry); + } + @Override public Builder tags(String... tags) { return super.tags(tags); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/distribution/DistributionStatisticConfig.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/distribution/DistributionStatisticConfig.java index c21ebf2832..cbe31c713a 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/distribution/DistributionStatisticConfig.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/distribution/DistributionStatisticConfig.java @@ -272,6 +272,20 @@ public static class Builder { private final DistributionStatisticConfig config = new DistributionStatisticConfig(); + public Builder() { + } + + public Builder(Builder builder) { + percentilesHistogram(builder.config.isPublishingHistogram()); + percentiles(builder.config.getPercentiles()); + percentilePrecision(builder.config.getPercentilePrecision()); + serviceLevelObjectives(builder.config.getServiceLevelObjectiveBoundaries()); + expiry(builder.config.getExpiry()); + bufferLength(builder.config.getBufferLength()); + minimumExpectedValue(builder.config.getMinimumExpectedValueAsDouble()); + maximumExpectedValue(builder.config.getMaximumExpectedValueAsDouble()); + } + public Builder percentilesHistogram(@Nullable Boolean enabled) { config.percentileHistogram = enabled; return this; diff --git a/samples/micrometer-samples-core/src/main/java/io/micrometer/core/samples/Demo.java b/samples/micrometer-samples-core/src/main/java/io/micrometer/core/samples/Demo.java new file mode 100644 index 0000000000..5e7f141b8e --- /dev/null +++ b/samples/micrometer-samples-core/src/main/java/io/micrometer/core/samples/Demo.java @@ -0,0 +1,33 @@ +package io.micrometer.core.samples; + +import io.micrometer.core.instrument.Tags; +import io.micrometer.core.instrument.Timer; +import io.micrometer.prometheus.PrometheusConfig; +import io.micrometer.prometheus.PrometheusMeterRegistry; + +import java.time.Duration; +import java.util.function.Function; + +public class Demo { + + private static final PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); + + private static final Function timerFactory = Timer.builder("cache.initialization.latency") + .description("Time initialize cache from database") + .tag("static", "abc") + .publishPercentiles(0.99, 0.999) + .publishPercentileHistogram() + .minimumExpectedValue(Duration.ofSeconds(10)) + .maximumExpectedValue(Duration.ofSeconds(600)) + .with(registry); + + public static void main(String[] args) { + doSomething("test"); + } + + private static void doSomething(String cacheName) { + timerFactory.apply(Tags.of("cacheName", cacheName)).record(Duration.ofMillis(100)); + System.out.println(registry.scrape()); + } + +}