diff --git a/.gitignore b/.gitignore index 3def9c811e..19ce62df16 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ out/ .settings/ .sts4-cache/ bin/ +.factorypath \ No newline at end of file diff --git a/micrometer-core/build.gradle b/micrometer-core/build.gradle index b94e356d3a..ad1f43f361 100644 --- a/micrometer-core/build.gradle +++ b/micrometer-core/build.gradle @@ -40,7 +40,7 @@ dependencies { // reactor compile 'io.projectreactor:reactor-core:3.1.2.RELEASE', optional - compile 'com.squareup.okhttp3:okhttp:3.9.0',optional + compile 'com.squareup.okhttp3:okhttp:3.9.0', optional testCompile 'io.projectreactor:reactor-test:3.1.2.RELEASE' testCompile 'io.projectreactor.ipc:reactor-netty:0.7.1.RELEASE' @@ -53,7 +53,7 @@ dependencies { // Eclipse still needs this (as of 4.7.1a) testRuntime 'org.junit.platform:junit-platform-launcher:1.0.0' - testCompile "org.mockito:mockito-core:2.10.0" + testCompile "org.mockito:mockito-core:2.10.0" testCompile 'org.hsqldb:hsqldb:2.3.5' diff --git a/micrometer-core/src/jmh/java/io/micrometer/core/benchmark/SimpleMeasureBenchmark.java b/micrometer-core/src/jmh/java/io/micrometer/core/benchmark/SimpleMeasureBenchmark.java index 120097477c..36f516f1f4 100644 --- a/micrometer-core/src/jmh/java/io/micrometer/core/benchmark/SimpleMeasureBenchmark.java +++ b/micrometer-core/src/jmh/java/io/micrometer/core/benchmark/SimpleMeasureBenchmark.java @@ -47,12 +47,12 @@ public class SimpleMeasureBenchmark { public static void main(String[] args) throws RunnerException { Options opt = new OptionsBuilder() - .include(SimpleMeasureBenchmark.class.getSimpleName()) - .warmupIterations(20) - .measurementIterations(30) - .mode(Mode.Throughput) - .forks(1) - .build(); + .include(SimpleMeasureBenchmark.class.getSimpleName()) + .warmupIterations(20) + .measurementIterations(30) + .mode(Mode.Throughput) + .forks(1) + .build(); new Runner(opt).run(); } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/AbstractTimer.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/AbstractTimer.java index d0c924dc45..faa796b029 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/AbstractTimer.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/AbstractTimer.java @@ -27,8 +27,8 @@ public abstract class AbstractTimer extends AbstractMeter implements Timer { protected final Clock clock; - private final HistogramConfig histogramConfig; protected final TimeWindowLatencyHistogram histogram; + private final HistogramConfig histogramConfig; private final TimeUnit baseTimeUnit; protected AbstractTimer(Id id, Clock clock, HistogramConfig histogramConfig, PauseDetector pauseDetector, TimeUnit baseTimeUnit) { diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/Clock.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/Clock.java index 5122523991..d51deca00e 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/Clock.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/Clock.java @@ -18,6 +18,18 @@ import io.micrometer.core.instrument.step.StepLong; public interface Clock { + Clock SYSTEM = new Clock() { + @Override + public long wallTime() { + return System.currentTimeMillis(); + } + + @Override + public long monotonicTime() { + return System.nanoTime(); + } + }; + /** * Current wall time in milliseconds since the epoch. Typically equivalent to * System.currentTimeMillis. Should not be used to determine durations. Used @@ -28,7 +40,6 @@ public interface Clock { */ long wallTime(); - /** * Current time from a monotonic clock source. The value is only meaningful when compared with * another snapshot to determine the elapsed time for an operation. The difference between two @@ -38,16 +49,4 @@ public interface Clock { * @return Monotonic time in nanoseconds */ long monotonicTime(); - - Clock SYSTEM = new Clock() { - @Override - public long wallTime() { - return System.currentTimeMillis(); - } - - @Override - public long monotonicTime() { - return System.nanoTime(); - } - }; } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/CountAtValue.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/CountAtValue.java index 7150504b11..f8cc1ba287 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/CountAtValue.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/CountAtValue.java @@ -15,24 +15,23 @@ */ package io.micrometer.core.instrument; -import java.util.concurrent.TimeUnit; - import io.micrometer.core.instrument.util.TimeUtils; -public final class CountAtValue { +import java.util.concurrent.TimeUnit; - public static CountAtValue of(long value, double count) { - return new CountAtValue(value, count); - } +public final class CountAtValue { private final long value; private final double count; - private CountAtValue(long value, double count) { this.value = value; this.count = count; } + public static CountAtValue of(long value, double count) { + return new CountAtValue(value, count); + } + public long value() { return value; } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/Counter.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/Counter.java index 59e1e4b183..6a09cda7ce 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/Counter.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/Counter.java @@ -25,6 +25,10 @@ * Used to measure the rate of change based on calls to increment. */ public interface Counter extends Meter { + static Builder builder(String name) { + return new Builder(name); + } + /** * Update the counter by one. */ @@ -54,15 +58,13 @@ default Type type() { return Type.Counter; } - static Builder builder(String name) { - return new Builder(name); - } - class Builder { private final String name; private final List tags = new ArrayList<>(); - @Nullable private String description; - @Nullable private String baseUnit; + @Nullable + private String description; + @Nullable + private String baseUnit; private Builder(String name) { this.name = name; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/DistributionSummary.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/DistributionSummary.java index 0ff853a000..71ba71da43 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/DistributionSummary.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/DistributionSummary.java @@ -29,6 +29,10 @@ */ public interface DistributionSummary extends Meter { + static Builder builder(String name) { + return new Builder(name); + } + /** * Updates the statistics kept by the summary with the specified amount. * @@ -65,15 +69,21 @@ default double mean() { HistogramSnapshot takeSnapshot(boolean supportsAggregablePercentiles); - static Builder builder(String name) { - return new Builder(name); + @Override + default Iterable measure() { + return Arrays.asList( + new Measurement(() -> (double) count(), Statistic.Count), + new Measurement(this::totalAmount, Statistic.Total) + ); } class Builder { private final String name; private final List tags = new ArrayList<>(); - @Nullable private String description; - @Nullable private String baseUnit; + @Nullable + private String description; + @Nullable + private String baseUnit; private HistogramConfig.Builder histogramConfigBuilder = HistogramConfig.builder(); private Builder(String name) { @@ -176,12 +186,4 @@ public DistributionSummary register(MeterRegistry registry) { } } - @Override - default Iterable measure() { - return Arrays.asList( - new Measurement(() -> (double) count(), Statistic.Count), - new Measurement(this::totalAmount, Statistic.Total) - ); - } - } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/FunctionCounter.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/FunctionCounter.java index eb0dc80a81..53f5762844 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/FunctionCounter.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/FunctionCounter.java @@ -28,6 +28,10 @@ * @author Jon Schneider */ public interface FunctionCounter extends Meter { + static Builder builder(String name, T obj, ToDoubleFunction f) { + return new Builder<>(name, obj, f); + } + /** * The cumulative count since this counter was created. */ @@ -43,17 +47,15 @@ default Meter.Type type() { return Meter.Type.Counter; } - static Builder builder(String name, T obj, ToDoubleFunction f) { - return new Builder<>(name, obj, f); - } - class Builder { private final String name; private final T obj; private final ToDoubleFunction f; private final List tags = new ArrayList<>(); - @Nullable private String description; - @Nullable private String baseUnit; + @Nullable + private String description; + @Nullable + private String baseUnit; private Builder(String name, T obj, ToDoubleFunction f) { this.name = name; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/FunctionTimer.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/FunctionTimer.java index 9e019f6357..4759eb0630 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/FunctionTimer.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/FunctionTimer.java @@ -25,6 +25,12 @@ import java.util.function.ToLongFunction; public interface FunctionTimer extends Meter { + static Builder builder(String name, T obj, ToLongFunction countFunction, + ToDoubleFunction totalTimeFunction, + TimeUnit totalTimeFunctionUnits) { + return new Builder<>(name, obj, countFunction, totalTimeFunction, totalTimeFunctionUnits); + } + /** * The total number of occurrences of the timed event. */ @@ -49,12 +55,6 @@ default Iterable measure() { ); } - static Builder builder(String name, T obj, ToLongFunction countFunction, - ToDoubleFunction totalTimeFunction, - TimeUnit totalTimeFunctionUnits) { - return new Builder<>(name, obj, countFunction, totalTimeFunction, totalTimeFunctionUnits); - } - class Builder { private final String name; private final T obj; @@ -62,8 +62,10 @@ class Builder { private final ToDoubleFunction totalTimeFunction; private final TimeUnit totalTimeFunctionUnits; private final List tags = new ArrayList<>(); - @Nullable private String description; - @Nullable private String baseUnit; + @Nullable + private String description; + @Nullable + private String baseUnit; private Builder(String name, T obj, ToLongFunction countFunction, diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/Gauge.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/Gauge.java index 0e2a3996e5..186101c04f 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/Gauge.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/Gauge.java @@ -23,6 +23,10 @@ import java.util.function.ToDoubleFunction; public interface Gauge extends Meter { + static Builder builder(String name, @Nullable T obj, ToDoubleFunction f) { + return new Builder<>(name, obj, f); + } + /** * Returns the current value. The act of observing the value by calling this method triggers sampling * of the underlying number or user-defined function that defines the value for the gauge. @@ -39,17 +43,16 @@ default Type type() { return Type.Gauge; } - static Builder builder(String name, @Nullable T obj, ToDoubleFunction f) { - return new Builder<>(name, obj, f); - } - class Builder { private final String name; - @Nullable private final T obj; + @Nullable + private final T obj; private final ToDoubleFunction f; private final List tags = new ArrayList<>(); - @Nullable private String description; - @Nullable private String baseUnit; + @Nullable + private String description; + @Nullable + private String baseUnit; private Builder(String name, @Nullable T obj, ToDoubleFunction f) { this.name = name; @@ -64,7 +67,7 @@ private Builder(String name, @Nullable T obj, ToDoubleFunction f) { public Builder tags(String... tags) { return tags(Tags.zip(tags)); } - + public Builder tags(Iterable tags) { tags.forEach(this.tags::add); return this; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/HistogramSnapshot.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/HistogramSnapshot.java index 392df47d09..3b9c625069 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/HistogramSnapshot.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/HistogramSnapshot.java @@ -26,23 +26,11 @@ public final class HistogramSnapshot { private static final ValueAtPercentile[] EMPTY_VALUES = new ValueAtPercentile[0]; private static final CountAtValue[] EMPTY_COUNTS = new CountAtValue[0]; private static final HistogramSnapshot EMPTY = new HistogramSnapshot(0, 0, 0, null, null); - - public static HistogramSnapshot of(long count, double total, double max, - @Nullable ValueAtPercentile[] percentileValues, - @Nullable CountAtValue[] histogramCounts) { - return new HistogramSnapshot(count, total, max, percentileValues, histogramCounts); - } - - public static HistogramSnapshot empty() { - return EMPTY; - } - private final long count; private final double total; private final double max; private final ValueAtPercentile[] percentileValues; private final CountAtValue[] histogramCounts; - private HistogramSnapshot(long count, double total, double max, @Nullable ValueAtPercentile[] percentileValues, @Nullable CountAtValue[] histogramCounts) { @@ -53,6 +41,16 @@ private HistogramSnapshot(long count, double total, double max, this.histogramCounts = histogramCounts != null ? histogramCounts : EMPTY_COUNTS; } + public static HistogramSnapshot of(long count, double total, double max, + @Nullable ValueAtPercentile[] percentileValues, + @Nullable CountAtValue[] histogramCounts) { + return new HistogramSnapshot(count, total, max, percentileValues, histogramCounts); + } + + public static HistogramSnapshot empty() { + return EMPTY; + } + public long count() { return count; } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/ImmutableTag.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/ImmutableTag.java index e22b2cd65a..1ea2172128 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/ImmutableTag.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/ImmutableTag.java @@ -48,7 +48,7 @@ public boolean equals(@Nullable Object o) { if (o == null || getClass() != o.getClass()) return false; Tag that = (Tag) o; return Objects.equals(key, that.getKey()) && - Objects.equals(value, that.getValue()); + Objects.equals(value, that.getValue()); } @Override @@ -59,8 +59,8 @@ public int hashCode() { @Override public String toString() { return "ImmutableTag{" + - "key='" + key + '\'' + - ", value='" + value + '\'' + - '}'; + "key='" + key + '\'' + + ", value='" + value + '\'' + + '}'; } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/LongTaskTimer.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/LongTaskTimer.java index 5c2ce3352a..536a45ea02 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/LongTaskTimer.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/LongTaskTimer.java @@ -27,27 +27,27 @@ import java.util.function.Supplier; public interface LongTaskTimer extends Meter { - class Sample { - private final LongTaskTimer timer; - private final long task; + static Builder builder(String name) { + return new Builder(name); + } - public Sample(LongTaskTimer timer, long task) { - this.timer = timer; - this.task = task; + /** + * Create a timer builder from a {@link Timed} annotation. + * + * @param timed The annotation instance to base a new timer on. + */ + static Builder builder(Timed timed) { + if (!timed.longTask()) { + throw new IllegalArgumentException("Cannot build a long task timer from a @Timed annotation that is not marked as a long task"); } - /** - * Records the duration of the operation - * - * @return The duration that was stop in nanoseconds - */ - public long stop() { - return timer.stop(task); + if (timed.value().isEmpty()) { + throw new IllegalArgumentException("Long tasks instrumented with @Timed require the value attribute to be non-empty"); } - public double duration(TimeUnit unit) { - return timer.duration(task, unit); - } + return new Builder(timed.value()) + .tags(timed.extraTags()) + .description(timed.description().isEmpty() ? null : timed.description()); } /** @@ -156,33 +156,34 @@ default Type type() { return Type.LongTaskTimer; } - static Builder builder(String name) { - return new Builder(name); - } + class Sample { + private final LongTaskTimer timer; + private final long task; - /** - * Create a timer builder from a {@link Timed} annotation. - * - * @param timed The annotation instance to base a new timer on. - */ - static Builder builder(Timed timed) { - if (!timed.longTask()) { - throw new IllegalArgumentException("Cannot build a long task timer from a @Timed annotation that is not marked as a long task"); + public Sample(LongTaskTimer timer, long task) { + this.timer = timer; + this.task = task; } - if (timed.value().isEmpty()) { - throw new IllegalArgumentException("Long tasks instrumented with @Timed require the value attribute to be non-empty"); + /** + * Records the duration of the operation + * + * @return The duration that was stop in nanoseconds + */ + public long stop() { + return timer.stop(task); } - return new Builder(timed.value()) - .tags(timed.extraTags()) - .description(timed.description().isEmpty() ? null : timed.description()); + public double duration(TimeUnit unit) { + return timer.duration(task, unit); + } } class Builder { private final String name; private final List tags = new ArrayList<>(); - @Nullable private String description; + @Nullable + private String description; private Builder(String name) { this.name = name; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/Meter.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/Meter.java index ab7bba9bff..37407ff7fe 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/Meter.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/Meter.java @@ -28,6 +28,10 @@ * A counter, gauge, timer, or distribution summary that results collects one or more metrics. */ public interface Meter { + static Builder builder(String name, Type type, Iterable measurements) { + return new Builder(name, type, measurements); + } + /** * A unique combination of name and tags */ @@ -62,8 +66,10 @@ enum Type { class Id { private final String name; private final List tags; - @Nullable private String baseUnit; - @Nullable private final String description; + @Nullable + private final String description; + @Nullable + private String baseUnit; private Type type; public Id(String name, Iterable tags, @Nullable String baseUnit, @Nullable String description, Type type) { @@ -103,7 +109,7 @@ public Iterable getTags() { @Nullable public String getTag(String name) { for (Tag tag : tags) { - if(tag.getKey().equals(name)) + if (tag.getKey().equals(name)) return tag.getValue(); } return null; @@ -158,10 +164,6 @@ public Type getType() { } } - static Builder builder(String name, Type type, Iterable measurements) { - return new Builder(name, type, measurements); - } - /** * Builder for custom meter types */ @@ -170,8 +172,10 @@ class Builder { private final Type type; private final Iterable measurements; private final List tags = new ArrayList<>(); - @Nullable private String description; - @Nullable private String baseUnit; + @Nullable + private String description; + @Nullable + private String baseUnit; private Builder(String name, Type type, Iterable measurements) { this.name = name; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/MeterRegistry.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/MeterRegistry.java index 711122f8fd..2742044714 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/MeterRegistry.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/MeterRegistry.java @@ -49,20 +49,16 @@ */ public abstract class MeterRegistry { protected final Clock clock; - - protected MeterRegistry(Clock clock) { - this.clock = clock; - } - private final Object meterMapLock = new Object(); - private volatile Map meterMap = Collections.emptyMap(); private final List filters = new CopyOnWriteArrayList<>(); private final List> meterAddedListeners = new CopyOnWriteArrayList<>(); + private final Config config = new Config(); + private final More more = new More(); + private volatile Map meterMap = Collections.emptyMap(); private PauseDetector pauseDetector = new ClockDriftPauseDetector( Duration.ofMillis(100), Duration.ofMillis(100) ); - /** * We'll use snake case as a general-purpose default for registries because it is the most * likely to result in a portable name. Camel casing is also perfectly acceptable. '-' and '.' @@ -72,6 +68,10 @@ protected MeterRegistry(Clock clock) { */ private NamingConvention namingConvention = NamingConvention.snakeCase; + protected MeterRegistry(Clock clock) { + this.clock = clock; + } + protected abstract Gauge newGauge(Meter.Id id, @Nullable T obj, ToDoubleFunction f); protected abstract Counter newCounter(Meter.Id id); @@ -182,75 +182,6 @@ public void forEachMeter(Consumer consumer) { meterMap.values().forEach(consumer); } - /** - * Access to configuration options for this registry. - */ - public class Config { - /** - * Append a list of common tags to apply to all metrics reported to the monitoring system. - */ - public Config commonTags(Iterable tags) { - meterFilter(MeterFilter.commonTags(tags)); - return this; - } - - /** - * Append a list of common tags to apply to all metrics reported to the monitoring system. - * Must be an even number of arguments representing key/value pairs of tags. - */ - public Config commonTags(String... tags) { - return commonTags(zip(tags)); - } - - @Incubating(since = "1.0.0-rc.3") - public Config meterFilter(MeterFilter filter) { - filters.add(filter); - return this; - } - - @Incubating(since = "1.0.0-rc.6") - public Config onMeterAdded(Consumer meter) { - meterAddedListeners.add(meter); - return this; - } - - /** - * Use the provided naming convention, overriding the default for your monitoring system. - */ - public Config namingConvention(NamingConvention convention) { - namingConvention = convention; - return this; - } - - /** - * @return The naming convention currently in use on this registry. - */ - public NamingConvention namingConvention() { - return namingConvention; - } - - /** - * @return The clock used to measure durations of timers and long task timers (and sometimes - * influences publishing behavior). - */ - public Clock clock() { - return clock; - } - - @Incubating(since = "1.0.0-rc.6") - public Config pauseDetector(PauseDetector detector) { - pauseDetector = detector; - return this; - } - - @Incubating(since = "1.0.0-rc.6") - public PauseDetector pauseDetector() { - return pauseDetector; - } - } - - private final Config config = new Config(); - public Config config() { return config; } @@ -314,87 +245,6 @@ public Timer timer(String name, String... tags) { return timer(name, zip(tags)); } - public class More { - /** - * Measures the time taken for long tasks. - */ - public LongTaskTimer longTaskTimer(String name, String... tags) { - return longTaskTimer(name, zip(tags)); - } - - /** - * Measures the time taken for long tasks. - */ - public LongTaskTimer longTaskTimer(String name, Iterable tags) { - return LongTaskTimer.builder(name).tags(tags).register(MeterRegistry.this); - } - - /** - * Only used by {@link LongTaskTimer#builder(String)} - */ - LongTaskTimer longTaskTimer(Meter.Id id) { - return registerMeterIfNecessary(LongTaskTimer.class, id, id2 -> { - Meter.Id withUnit = id2.withBaseUnit(getBaseTimeUnitStr()); - return newLongTaskTimer(withUnit); - }, NoopLongTaskTimer::new); - } - - /** - * Tracks a monotonically increasing value, automatically incrementing the counter whenever - * the value is observed. - */ - public FunctionCounter counter(String name, Iterable tags, T obj, ToDoubleFunction f) { - return FunctionCounter.builder(name, obj, f).tags(tags).register(MeterRegistry.this); - } - - /** - * Tracks a number, maintaining a weak reference on it. - */ - public FunctionCounter counter(String name, Iterable tags, T number) { - return FunctionCounter.builder(name, number, Number::doubleValue).tags(tags).register(MeterRegistry.this); - } - - FunctionCounter counter(Meter.Id id, T obj, ToDoubleFunction f) { - return registerMeterIfNecessary(FunctionCounter.class, id, id2 -> newFunctionCounter(id2, obj, f), - NoopFunctionCounter::new); - } - - /** - * A timer that tracks monotonically increasing functions for count and totalTime. - */ - public FunctionTimer timer(String name, Iterable tags, T obj, - ToLongFunction countFunction, - ToDoubleFunction totalTimeFunction, - TimeUnit totalTimeFunctionUnits) { - return FunctionTimer.builder(name, obj, countFunction, totalTimeFunction, totalTimeFunctionUnits) - .tags(tags).register(MeterRegistry.this); - } - - FunctionTimer timer(Meter.Id id, T obj, - ToLongFunction countFunction, - ToDoubleFunction totalTimeFunction, - TimeUnit totalTimeFunctionUnits) { - return registerMeterIfNecessary(FunctionTimer.class, id, id2 -> { - Meter.Id withUnit = id2.withBaseUnit(getBaseTimeUnitStr()); - return newFunctionTimer(withUnit, obj, countFunction, totalTimeFunction, totalTimeFunctionUnits); - }, NoopFunctionTimer::new); - } - - /** - * A gauge that tracks a time value, to be scaled to the monitoring system's base time unit. - */ - public TimeGauge timeGauge(String name, Iterable tags, T obj, - TimeUnit fUnit, ToDoubleFunction f) { - return TimeGauge.builder(name, obj, fUnit, f).tags(tags).register(MeterRegistry.this); - } - - TimeGauge timeGauge(Meter.Id id, T obj, TimeUnit fUnit, ToDoubleFunction f) { - return registerMeterIfNecessary(TimeGauge.class, id, id2 -> newTimeGauge(id2, obj, fUnit, f), NoopTimeGauge::new); - } - } - - private final More more = new More(); - /** * Access to less frequently used meter types and patterns. */ @@ -420,7 +270,8 @@ public More more() { * @return The number that was passed in so the registration can be done as part of an assignment * statement. */ - @Nullable public T gauge(String name, Iterable tags, @Nullable T obj, ToDoubleFunction f) { + @Nullable + public T gauge(String name, Iterable tags, @Nullable T obj, ToDoubleFunction f) { Gauge.builder(name, obj, f).tags(tags).register(this); return obj; } @@ -434,7 +285,8 @@ public More more() { * @return The number that was passed in so the registration can be done as part of an assignment * statement. */ - @Nullable public T gauge(String name, Iterable tags, T number) { + @Nullable + public T gauge(String name, Iterable tags, T number) { return gauge(name, tags, number, Number::doubleValue); } @@ -446,7 +298,8 @@ public More more() { * @return The number that was passed in so the registration can be done as part of an assignment * statement. */ - @Nullable public T gauge(String name, T number) { + @Nullable + public T gauge(String name, T number) { return gauge(name, emptyList(), number); } @@ -459,7 +312,8 @@ public More more() { * @return The number that was passed in so the registration can be done as part of an assignment * statement. */ - @Nullable public T gauge(String name, T obj, ToDoubleFunction f) { + @Nullable + public T gauge(String name, T obj, ToDoubleFunction f) { return gauge(name, emptyList(), obj, f); } @@ -476,7 +330,8 @@ public More more() { * @return The number that was passed in so the registration can be done as part of an assignment * statement. */ - @Nullable public > T gaugeCollectionSize(String name, Iterable tags, T collection) { + @Nullable + public > T gaugeCollectionSize(String name, Iterable tags, T collection) { return gauge(name, tags, collection, Collection::size); } @@ -493,7 +348,8 @@ public More more() { * @return The number that was passed in so the registration can be done as part of an assignment * statement. */ - @Nullable public > T gaugeMapSize(String name, Iterable tags, T map) { + @Nullable + public > T gaugeMapSize(String name, Iterable tags, T map) { return gauge(name, tags, map, Map::size); } @@ -576,4 +432,150 @@ private boolean accept(Meter.Id id) { return true; } + + /** + * Access to configuration options for this registry. + */ + public class Config { + /** + * Append a list of common tags to apply to all metrics reported to the monitoring system. + */ + public Config commonTags(Iterable tags) { + meterFilter(MeterFilter.commonTags(tags)); + return this; + } + + /** + * Append a list of common tags to apply to all metrics reported to the monitoring system. + * Must be an even number of arguments representing key/value pairs of tags. + */ + public Config commonTags(String... tags) { + return commonTags(zip(tags)); + } + + @Incubating(since = "1.0.0-rc.3") + public Config meterFilter(MeterFilter filter) { + filters.add(filter); + return this; + } + + @Incubating(since = "1.0.0-rc.6") + public Config onMeterAdded(Consumer meter) { + meterAddedListeners.add(meter); + return this; + } + + /** + * Use the provided naming convention, overriding the default for your monitoring system. + */ + public Config namingConvention(NamingConvention convention) { + namingConvention = convention; + return this; + } + + /** + * @return The naming convention currently in use on this registry. + */ + public NamingConvention namingConvention() { + return namingConvention; + } + + /** + * @return The clock used to measure durations of timers and long task timers (and sometimes + * influences publishing behavior). + */ + public Clock clock() { + return clock; + } + + @Incubating(since = "1.0.0-rc.6") + public Config pauseDetector(PauseDetector detector) { + pauseDetector = detector; + return this; + } + + @Incubating(since = "1.0.0-rc.6") + public PauseDetector pauseDetector() { + return pauseDetector; + } + } + + public class More { + /** + * Measures the time taken for long tasks. + */ + public LongTaskTimer longTaskTimer(String name, String... tags) { + return longTaskTimer(name, zip(tags)); + } + + /** + * Measures the time taken for long tasks. + */ + public LongTaskTimer longTaskTimer(String name, Iterable tags) { + return LongTaskTimer.builder(name).tags(tags).register(MeterRegistry.this); + } + + /** + * Only used by {@link LongTaskTimer#builder(String)} + */ + LongTaskTimer longTaskTimer(Meter.Id id) { + return registerMeterIfNecessary(LongTaskTimer.class, id, id2 -> { + Meter.Id withUnit = id2.withBaseUnit(getBaseTimeUnitStr()); + return newLongTaskTimer(withUnit); + }, NoopLongTaskTimer::new); + } + + /** + * Tracks a monotonically increasing value, automatically incrementing the counter whenever + * the value is observed. + */ + public FunctionCounter counter(String name, Iterable tags, T obj, ToDoubleFunction f) { + return FunctionCounter.builder(name, obj, f).tags(tags).register(MeterRegistry.this); + } + + /** + * Tracks a number, maintaining a weak reference on it. + */ + public FunctionCounter counter(String name, Iterable tags, T number) { + return FunctionCounter.builder(name, number, Number::doubleValue).tags(tags).register(MeterRegistry.this); + } + + FunctionCounter counter(Meter.Id id, T obj, ToDoubleFunction f) { + return registerMeterIfNecessary(FunctionCounter.class, id, id2 -> newFunctionCounter(id2, obj, f), + NoopFunctionCounter::new); + } + + /** + * A timer that tracks monotonically increasing functions for count and totalTime. + */ + public FunctionTimer timer(String name, Iterable tags, T obj, + ToLongFunction countFunction, + ToDoubleFunction totalTimeFunction, + TimeUnit totalTimeFunctionUnits) { + return FunctionTimer.builder(name, obj, countFunction, totalTimeFunction, totalTimeFunctionUnits) + .tags(tags).register(MeterRegistry.this); + } + + FunctionTimer timer(Meter.Id id, T obj, + ToLongFunction countFunction, + ToDoubleFunction totalTimeFunction, + TimeUnit totalTimeFunctionUnits) { + return registerMeterIfNecessary(FunctionTimer.class, id, id2 -> { + Meter.Id withUnit = id2.withBaseUnit(getBaseTimeUnitStr()); + return newFunctionTimer(withUnit, obj, countFunction, totalTimeFunction, totalTimeFunctionUnits); + }, NoopFunctionTimer::new); + } + + /** + * A gauge that tracks a time value, to be scaled to the monitoring system's base time unit. + */ + public TimeGauge timeGauge(String name, Iterable tags, T obj, + TimeUnit fUnit, ToDoubleFunction f) { + return TimeGauge.builder(name, obj, fUnit, f).tags(tags).register(MeterRegistry.this); + } + + TimeGauge timeGauge(Meter.Id id, T obj, TimeUnit fUnit, ToDoubleFunction f) { + return registerMeterIfNecessary(TimeGauge.class, id, id2 -> newTimeGauge(id2, obj, fUnit, f), NoopTimeGauge::new); + } + } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/Metrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/Metrics.java index 1234717ecd..adfb4c48fe 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/Metrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/Metrics.java @@ -29,6 +29,7 @@ */ public class Metrics { public static final CompositeMeterRegistry globalRegistry = new CompositeMeterRegistry(); + private static final More more = new More(); public static void addRegistry(MeterRegistry registry) { globalRegistry.add(registry); @@ -89,56 +90,6 @@ public static Timer timer(String name, String... tags) { return globalRegistry.timer(name, tags); } - static class More { - /** - * Measures the time taken for long tasks. - */ - public LongTaskTimer longTaskTimer(String name, String... tags) { - return globalRegistry.more().longTaskTimer(name, tags); - } - - /** - * Measures the time taken for long tasks. - */ - public LongTaskTimer longTaskTimer(String name, Iterable tags) { - return globalRegistry.more().longTaskTimer(name, tags); - } - - /** - * Tracks a monotonically increasing value, automatically incrementing the counter whenever - * the value is observed. - */ - public FunctionCounter counter(String name, Iterable tags, T obj, ToDoubleFunction f) { - return globalRegistry.more().counter(name, tags, obj, f); - } - - /** - * Tracks a number, maintaining a weak reference on it. - */ - public FunctionCounter counter(String name, Iterable tags, T number) { - return globalRegistry.more().counter(name, tags, number); - } - - /** - * A gauge that tracks a time value, to be scaled to the monitoring system's base time unit. - */ - public TimeGauge timeGauge(String name, Iterable tags, T obj, TimeUnit fUnit, ToDoubleFunction f) { - return globalRegistry.more().timeGauge(name, tags, obj, fUnit, f); - } - - /** - * A timer that tracks monotonically increasing functions for count and totalTime. - */ - public FunctionTimer timer(String name, Iterable tags, T obj, - ToLongFunction countFunction, - ToDoubleFunction totalTimeFunction, - TimeUnit totalTimeFunctionUnits) { - return globalRegistry.more().timer(name, tags, obj, countFunction, totalTimeFunction, totalTimeFunctionUnits); - } - } - - private static final More more = new More(); - /** * Access to less frequently used meter types and patterns. */ @@ -245,4 +196,52 @@ public static > T gaugeCollectionSize(String name, Itera public static > T gaugeMapSize(String name, Iterable tags, T map) { return globalRegistry.gaugeMapSize(name, tags, map); } + + static class More { + /** + * Measures the time taken for long tasks. + */ + public LongTaskTimer longTaskTimer(String name, String... tags) { + return globalRegistry.more().longTaskTimer(name, tags); + } + + /** + * Measures the time taken for long tasks. + */ + public LongTaskTimer longTaskTimer(String name, Iterable tags) { + return globalRegistry.more().longTaskTimer(name, tags); + } + + /** + * Tracks a monotonically increasing value, automatically incrementing the counter whenever + * the value is observed. + */ + public FunctionCounter counter(String name, Iterable tags, T obj, ToDoubleFunction f) { + return globalRegistry.more().counter(name, tags, obj, f); + } + + /** + * Tracks a number, maintaining a weak reference on it. + */ + public FunctionCounter counter(String name, Iterable tags, T number) { + return globalRegistry.more().counter(name, tags, number); + } + + /** + * A gauge that tracks a time value, to be scaled to the monitoring system's base time unit. + */ + public TimeGauge timeGauge(String name, Iterable tags, T obj, TimeUnit fUnit, ToDoubleFunction f) { + return globalRegistry.more().timeGauge(name, tags, obj, fUnit, f); + } + + /** + * A timer that tracks monotonically increasing functions for count and totalTime. + */ + public FunctionTimer timer(String name, Iterable tags, T obj, + ToLongFunction countFunction, + ToDoubleFunction totalTimeFunction, + TimeUnit totalTimeFunctionUnits) { + return globalRegistry.more().timer(name, tags, obj, countFunction, totalTimeFunction, totalTimeFunctionUnits); + } + } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/MockClock.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/MockClock.java index 4081bca302..6a458f0851 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/MockClock.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/MockClock.java @@ -22,6 +22,10 @@ public class MockClock implements Clock { // has to be non-zero to prevent divide-by-zeroes and other weird math results based on the clock private long timeNanos = 1; + public static MockClock clock(MeterRegistry registry) { + return (MockClock) registry.config().clock(); + } + @Override public long monotonicTime() { return timeNanos; @@ -32,10 +36,6 @@ public long wallTime() { return TimeUnit.MILLISECONDS.convert(timeNanos, TimeUnit.NANOSECONDS); } - public static MockClock clock(MeterRegistry registry) { - return (MockClock) registry.config().clock(); - } - public long add(long amount, TimeUnit unit) { timeNanos += unit.toNanos(amount); return timeNanos; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/Statistic.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/Statistic.java index 6faa5c8d81..1e45877960 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/Statistic.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/Statistic.java @@ -16,26 +16,40 @@ package io.micrometer.core.instrument; public enum Statistic { - /** The sum of the amounts recorded. */ + /** + * The sum of the amounts recorded. + */ Total, - /** The sum of the times recorded. Always reported in nanoseconds. */ + /** + * The sum of the times recorded. Always reported in nanoseconds. + */ TotalTime, - /** Rate per second for calls. */ + /** + * Rate per second for calls. + */ Count, - /** The maximum amount recorded. When this represents a time, it is always reported in nanoseconds. */ + /** + * The maximum amount recorded. When this represents a time, it is always reported in nanoseconds. + */ Max, - /** Instantaneous value, such as those reported by gauges **/ + /** + * Instantaneous value, such as those reported by gauges + **/ Value, Unknown, - /** Number of currently active tasks for a long task timer. */ + /** + * Number of currently active tasks for a long task timer. + */ ActiveTasks, - /** Duration of a running task in a long task timer. Always reported in nanoseconds. */ + /** + * Duration of a running task in a long task timer. Always reported in nanoseconds. + */ Duration, } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/Tag.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/Tag.java index 1be7193a13..52bf064fe1 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/Tag.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/Tag.java @@ -21,11 +21,11 @@ * @author Jon Schneider */ public interface Tag { - String getKey(); - - String getValue(); - static Tag of(String key, String value) { return new ImmutableTag(key, value); } + + String getKey(); + + String getValue(); } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/Tags.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/Tags.java index c79952deb6..8b8846dd71 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/Tags.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/Tags.java @@ -16,7 +16,9 @@ package io.micrometer.core.instrument; -import java.util.*; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import java.util.function.Function; import java.util.stream.Stream; @@ -28,7 +30,8 @@ * @author Maciej Walkowiak */ public final class Tags { - private Tags() {} + private Tags() { + } public static Iterable zip(String... keyValues) { if (keyValues.length % 2 == 1) { @@ -44,7 +47,7 @@ public static Iterable zip(String... keyValues) { } public static Iterable concat(Iterable tags, Iterable otherTags) { - if(!otherTags.iterator().hasNext()) + if (!otherTags.iterator().hasNext()) return tags; return Stream.concat(stream(tags.spliterator(), false), stream(otherTags.spliterator(), false)) diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/TimeGauge.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/TimeGauge.java index 0032dd7b42..f59d9b0f10 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/TimeGauge.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/TimeGauge.java @@ -27,23 +27,24 @@ * @author Jon Schneider */ public interface TimeGauge extends Gauge { + static Builder builder(String name, T obj, TimeUnit fUnits, ToDoubleFunction f) { + return new Builder<>(name, obj, fUnits, f); + } + TimeUnit baseTimeUnit(); default double value(TimeUnit unit) { return TimeUtils.convert(value(), baseTimeUnit(), unit); } - static Builder builder(String name, T obj, TimeUnit fUnits, ToDoubleFunction f) { - return new Builder<>(name, obj, fUnits, f); - } - class Builder { private final String name; private final T obj; private final TimeUnit fUnits; private final ToDoubleFunction f; private final List tags = new ArrayList<>(); - @Nullable private String description; + @Nullable + private String description; private Builder(String name, T obj, TimeUnit fUnits, ToDoubleFunction f) { this.name = name; 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 b4501a9e88..05fde00a48 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 @@ -34,6 +34,38 @@ * under a minute. */ public interface Timer extends Meter { + static Sample start(MeterRegistry registry) { + return new Sample(registry.config().clock()); + } + + static Sample start(Clock clock) { + return new Sample(clock); + } + + static Builder builder(String name) { + return new Builder(name); + } + + /** + * Create a timer builder from a {@link Timed} annotation. + * + * @param timed The annotation instance to base a new timer on. + * @param defaultName A default name to use in the event that the value attribute is empty. + */ + static Builder builder(Timed timed, String defaultName) { + if (timed.longTask() && timed.value().isEmpty()) { + // the user MUST name long task timers, we don't lump them in with regular + // timers with the same name + throw new IllegalArgumentException("Long tasks instrumented with @Timed require the value attribute to be non-empty"); + } + + return new Builder(timed.value().isEmpty() ? defaultName : timed.value()) + .tags(timed.extraTags()) + .description(timed.description().isEmpty() ? null : timed.description()) + .publishPercentileHistogram(timed.histogram()) + .publishPercentiles(timed.percentiles().length > 0 ? timed.percentiles() : null); + } + /** * Updates the statistics kept by the counter with the specified amount. * @@ -139,14 +171,6 @@ default Type type() { return Type.Timer; } - static Sample start(MeterRegistry registry) { - return new Sample(registry.config().clock()); - } - - static Sample start(Clock clock) { - return new Sample(clock); - } - class Sample { private final long startTime; private final Clock clock; @@ -168,36 +192,12 @@ public long stop(Timer timer) { } } - static Builder builder(String name) { - return new Builder(name); - } - - /** - * Create a timer builder from a {@link Timed} annotation. - * - * @param timed The annotation instance to base a new timer on. - * @param defaultName A default name to use in the event that the value attribute is empty. - */ - static Builder builder(Timed timed, String defaultName) { - if (timed.longTask() && timed.value().isEmpty()) { - // the user MUST name long task timers, we don't lump them in with regular - // timers with the same name - throw new IllegalArgumentException("Long tasks instrumented with @Timed require the value attribute to be non-empty"); - } - - return new Builder(timed.value().isEmpty() ? defaultName : timed.value()) - .tags(timed.extraTags()) - .description(timed.description().isEmpty() ? null : timed.description()) - .publishPercentileHistogram(timed.histogram()) - .publishPercentiles(timed.percentiles().length > 0 ? timed.percentiles() : null); - } - class Builder { private final String name; private final List tags = new ArrayList<>(); + private final HistogramConfig.Builder histogramConfigBuilder; @Nullable private String description; - private final HistogramConfig.Builder histogramConfigBuilder; @Nullable private PauseDetector pauseDetector; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/ValueAtPercentile.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/ValueAtPercentile.java index f0af02323c..421cc61564 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/ValueAtPercentile.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/ValueAtPercentile.java @@ -15,24 +15,23 @@ */ package io.micrometer.core.instrument; -import java.util.concurrent.TimeUnit; - import io.micrometer.core.instrument.util.TimeUtils; -public final class ValueAtPercentile { +import java.util.concurrent.TimeUnit; - public static ValueAtPercentile of(double percentile, double value) { - return new ValueAtPercentile(percentile, value); - } +public final class ValueAtPercentile { private final double percentile; private final double value; - private ValueAtPercentile(double percentile, double value) { this.percentile = percentile; this.value = value; } + public static ValueAtPercentile of(double percentile, double value) { + return new ValueAtPercentile(percentile, value); + } + public double percentile() { return percentile; } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/MeterBinder.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/MeterBinder.java index fff78dd343..bea6bddb16 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/MeterBinder.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/MeterBinder.java @@ -21,7 +21,7 @@ /** * Binders register one or more metrics to provide information about the state * of some aspect of the application or its container. - * + *

* Binders are enabled by default if they source data for an alert * that is recommended for a production ready app. */ diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/CaffeineCacheMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/CaffeineCacheMetrics.java index 11abfc2f2c..5dfd0e7c7a 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/CaffeineCacheMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/CaffeineCacheMetrics.java @@ -42,6 +42,24 @@ @NonNullApi @NonNullFields public class CaffeineCacheMetrics implements MeterBinder { + private final String name; + private final Iterable tags; + private final Cache cache; + + /** + * Creates a new {@link CaffeineCacheMetrics} instance. + * + * @param cache The cache to be instrumented. You must call {@link Caffeine#recordStats()} prior to building the cache + * for metrics to be recorded. + * @param name The metric name prefix + * @param tags tags to apply to all recorded metrics + */ + public CaffeineCacheMetrics(Cache cache, String name, Iterable tags) { + this.name = name; + this.tags = tags; + this.cache = cache; + } + /** * Record metrics on a Caffeine cache. You must call {@link Caffeine#recordStats()} prior to building the cache * for metrics to be recorded. @@ -102,23 +120,6 @@ public static C monitor(MeterRegistry registry, C return cache; } - private final String name; - private final Iterable tags; - private final Cache cache; - - /** - * Creates a new {@link CaffeineCacheMetrics} instance. - * @param cache The cache to be instrumented. You must call {@link Caffeine#recordStats()} prior to building the cache - * for metrics to be recorded. - * @param name The metric name prefix - * @param tags tags to apply to all recorded metrics - */ - public CaffeineCacheMetrics(Cache cache, String name, Iterable tags) { - this.name = name; - this.tags = tags; - this.cache = cache; - } - @Override public void bindTo(MeterRegistry registry) { Gauge.builder(name + ".estimated.size", cache, Cache::estimatedSize) diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/EhCache2Metrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/EhCache2Metrics.java index 363ad91a1a..f452988521 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/EhCache2Metrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/EhCache2Metrics.java @@ -32,6 +32,12 @@ public class EhCache2Metrics implements MeterBinder { private final Iterable tags; private final StatisticsGateway stats; + public EhCache2Metrics(Ehcache cache, String name, Iterable tags) { + this.stats = cache.getStatistics(); + this.name = name; + this.tags = Tags.concat(tags, "name", cache.getName()); + } + /** * Record metrics on a JCache cache. * @@ -60,12 +66,6 @@ public static Ehcache monitor(MeterRegistry registry, Ehcache cache, String name new EhCache2Metrics(cache, name, tags).bindTo(registry); return cache; } - - public EhCache2Metrics(Ehcache cache, String name, Iterable tags) { - this.stats = cache.getStatistics(); - this.name = name; - this.tags = Tags.concat(tags, "name", cache.getName()); - } @Override public void bindTo(MeterRegistry registry) { @@ -93,7 +93,7 @@ public void bindTo(MeterRegistry registry) { .tags(tags).tags("result", "added") .description("Cache puts resulting in a new key/value pair") .register(registry); - + FunctionCounter.builder(name + ".puts", stats, StatisticsGateway::cachePutAddedCount) .tags(tags).tags("result", "updated") .description("Cache puts resulting in an updated value") diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/GuavaCacheMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/GuavaCacheMetrics.java index b0060e9e0a..6c43038669 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/GuavaCacheMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/GuavaCacheMetrics.java @@ -31,6 +31,15 @@ @NonNullApi @NonNullFields public class GuavaCacheMetrics implements MeterBinder { + private final String name; + private final Iterable tags; + private final Cache cache; + public GuavaCacheMetrics(Cache cache, String name, Iterable tags) { + this.name = name; + this.tags = tags; + this.cache = cache; + } + /** * Record metrics on a Guava cache. You must call {@link CacheBuilder#recordStats()} prior to building the cache * for metrics to be recorded. @@ -62,16 +71,6 @@ public static C monitor(MeterRegistry registry, C cache, Strin return cache; } - private final String name; - private final Iterable tags; - private final Cache cache; - - public GuavaCacheMetrics(Cache cache, String name, Iterable tags) { - this.name = name; - this.tags = tags; - this.cache = cache; - } - @Override public void bindTo(MeterRegistry registry) { Gauge.builder(name + ".estimated.size", cache, Cache::size) @@ -101,7 +100,7 @@ public void bindTo(MeterRegistry registry) { .description("The time the cache has spent loading new values") .register(registry); - FunctionCounter.builder(name + ".load",cache, c -> c.stats().loadSuccessCount()) + FunctionCounter.builder(name + ".load", cache, c -> c.stats().loadSuccessCount()) .tags(tags).tags("result", "success") .description("The number of times cache lookup methods have successfully loaded a new value") .register(registry); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/HazelcastCacheMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/HazelcastCacheMetrics.java index f544296344..9830b76256 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/HazelcastCacheMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/HazelcastCacheMetrics.java @@ -31,6 +31,12 @@ public class HazelcastCacheMetrics implements MeterBinder { private final String name; private final Iterable tags; + public HazelcastCacheMetrics(IMap cache, String name, Iterable tags) { + this.cache = cache; + this.name = name; + this.tags = tags; + } + /** * Record metrics on a Hazelcast cache. * @@ -60,12 +66,6 @@ public static > C monitor(MeterRegistry registry, C c return cache; } - public HazelcastCacheMetrics(IMap cache, String name, Iterable tags) { - this.cache = cache; - this.name = name; - this.tags = tags; - } - @Override public void bindTo(MeterRegistry registry) { Gauge.builder(name + ".requests", cache, cache -> cache.getLocalMapStats().getHits()) @@ -134,28 +134,28 @@ private void nearCacheMetrics(MeterRegistry registry) { private void timings(MeterRegistry registry) { FunctionTimer.builder(name + ".gets", - cache, - cache -> cache.getLocalMapStats().getGetOperationCount(), - cache -> cache.getLocalMapStats().getTotalGetLatency(), TimeUnit.NANOSECONDS - ) + cache, + cache -> cache.getLocalMapStats().getGetOperationCount(), + cache -> cache.getLocalMapStats().getTotalGetLatency(), TimeUnit.NANOSECONDS + ) .tags(tags) .description("Cache gets") .register(registry); FunctionTimer.builder(name + ".puts", - cache, - cache -> cache.getLocalMapStats().getPutOperationCount(), - cache -> cache.getLocalMapStats().getTotalPutLatency(), TimeUnit.NANOSECONDS - ) + cache, + cache -> cache.getLocalMapStats().getPutOperationCount(), + cache -> cache.getLocalMapStats().getTotalPutLatency(), TimeUnit.NANOSECONDS + ) .tags(tags) .description("Cache puts") .register(registry); FunctionTimer.builder(name + ".removals", - cache, - cache -> cache.getLocalMapStats().getRemoveOperationCount(), - cache -> cache.getLocalMapStats().getTotalRemoveLatency(), TimeUnit.NANOSECONDS - ) + cache, + cache -> cache.getLocalMapStats().getRemoveOperationCount(), + cache -> cache.getLocalMapStats().getTotalRemoveLatency(), TimeUnit.NANOSECONDS + ) .tags(tags) .description("Cache removals") .register(registry); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/JCacheMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/JCacheMetrics.java index f542ed1345..461f48658d 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/JCacheMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/cache/JCacheMetrics.java @@ -35,39 +35,24 @@ @NonNullApi @NonNullFields public class JCacheMetrics implements MeterBinder { - /** - * Defining cache statistics parameters as constants. - */ - private enum CacheStatistics { - CacheHits, CacheHitPercentage, - CacheMisses, CacheMissPercentage, - CacheGets, CachePuts, CacheRemovals, CacheEvictions, - AverageGetTime, AveragePutTime, AverageRemoveTime; - - public long get(ObjectName objectName) { - try { - List mBeanServers = MBeanServerFactory.findMBeanServer(null); - for (MBeanServer mBeanServer : mBeanServers) { - try { - Object attribute = mBeanServer.getAttribute(objectName, this.toString()); - return (Long) attribute; - } catch (AttributeNotFoundException | InstanceNotFoundException ex) { - // did not find MBean, try the next server - } - } - } catch (MBeanException | ReflectionException ex) { - throw new IllegalStateException(ex); - } + private final String name; + private final Iterable tags; + private ObjectName objectName; + public JCacheMetrics(Cache cache, String name, Iterable tags) { + try { + String cacheManagerUri = cache.getCacheManager().getURI().toString() + .replace(':', '.'); // ehcache's uri is prefixed with 'urn:' - // didn't find the MBean in any servers - return 0; + this.objectName = new ObjectName("javax.cache:type=CacheStatistics" + + ",CacheManager=" + cacheManagerUri + + ",Cache=" + cache.getName()); + } catch (MalformedObjectNameException ignored) { + throw new IllegalStateException("Cache name '" + cache.getName() + "' results in an invalid JMX name"); } + this.name = name; + this.tags = Tags.concat(tags, "name", cache.getName()); } - private ObjectName objectName; - private final String name; - private final Iterable tags; - /** * Record metrics on a JCache cache. * @@ -97,21 +82,6 @@ public static > C monitor(MeterRegistry registry, C return cache; } - public JCacheMetrics(Cache cache, String name, Iterable tags) { - try { - String cacheManagerUri = cache.getCacheManager().getURI().toString() - .replace(':', '.'); // ehcache's uri is prefixed with 'urn:' - - this.objectName = new ObjectName("javax.cache:type=CacheStatistics" - + ",CacheManager=" + cacheManagerUri - + ",Cache=" + cache.getName()); - } catch (MalformedObjectNameException ignored) { - throw new IllegalStateException("Cache name '" + cache.getName() + "' results in an invalid JMX name"); - } - this.name = name; - this.tags = Tags.concat(tags, "name", cache.getName()); - } - @Override public void bindTo(MeterRegistry registry) { Gauge.builder(name + ".requests", objectName, CacheStatistics.CacheHits::get) @@ -139,4 +109,33 @@ public void bindTo(MeterRegistry registry) { .description("Cache evictions") .register(registry); } + + /** + * Defining cache statistics parameters as constants. + */ + private enum CacheStatistics { + CacheHits, CacheHitPercentage, + CacheMisses, CacheMissPercentage, + CacheGets, CachePuts, CacheRemovals, CacheEvictions, + AverageGetTime, AveragePutTime, AverageRemoveTime; + + public long get(ObjectName objectName) { + try { + List mBeanServers = MBeanServerFactory.findMBeanServer(null); + for (MBeanServer mBeanServer : mBeanServers) { + try { + Object attribute = mBeanServer.getAttribute(objectName, this.toString()); + return (Long) attribute; + } catch (AttributeNotFoundException | InstanceNotFoundException ex) { + // did not find MBean, try the next server + } + } + } catch (MBeanException | ReflectionException ex) { + throw new IllegalStateException(ex); + } + + // didn't find the MBean in any servers + return 0; + } + } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/db/DatabaseTableMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/db/DatabaseTableMetrics.java index fb1299a464..48fd3c0ca4 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/db/DatabaseTableMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/db/DatabaseTableMetrics.java @@ -34,38 +34,11 @@ @NonNullApi @NonNullFields public class DatabaseTableMetrics implements MeterBinder { - /** - * Record the row count for an individual database table. - * - * @param registry The registry to bind metrics to. - * @param ds The data source to use to run the row count query. - * @param tableName The name of the table to report table size for. - * @param name The name prefix of the metrics. - * @param tags Tags to apply to all recorded metrics. Must be an even number of arguments representing key/value pairs of tags. - */ - public static void monitor(MeterRegistry registry, DataSource ds, String tableName, String name, String... tags) { - monitor(registry, ds, tableName, name, Tags.zip(tags)); - } - - /** - * Record the row count for an individual database table. - * - * @param registry The registry to bind metrics to. - * @param ds The data source to use to run the row count query. - * @param tableName The name of the table to report table size for. - * @param name The name prefix of the metrics. - * @param tags Tags to apply to all recorded metrics. - */ - public static void monitor(MeterRegistry registry, DataSource ds, String tableName, String name, Iterable tags) { - new DatabaseTableMetrics(ds, tableName, name, tags).bindTo(registry); - } - private final String query; private final String tableName; private final String name; private final Iterable tags; private final DataSource dataSource; - /** * Record the row count for an individual database table. * @@ -77,7 +50,6 @@ public static void monitor(MeterRegistry registry, DataSource ds, String tableNa public DatabaseTableMetrics(DataSource dataSource, String tableName, String name, Iterable tags) { this(dataSource, "SELECT COUNT(1) FROM " + tableName, tableName, name, tags); } - /** * Record the result based on a query. * @@ -96,15 +68,41 @@ public DatabaseTableMetrics(DataSource dataSource, String query, String tableNam this.tags = tags; } + /** + * Record the row count for an individual database table. + * + * @param registry The registry to bind metrics to. + * @param ds The data source to use to run the row count query. + * @param tableName The name of the table to report table size for. + * @param name The name prefix of the metrics. + * @param tags Tags to apply to all recorded metrics. Must be an even number of arguments representing key/value pairs of tags. + */ + public static void monitor(MeterRegistry registry, DataSource ds, String tableName, String name, String... tags) { + monitor(registry, ds, tableName, name, Tags.zip(tags)); + } + + /** + * Record the row count for an individual database table. + * + * @param registry The registry to bind metrics to. + * @param ds The data source to use to run the row count query. + * @param tableName The name of the table to report table size for. + * @param name The name prefix of the metrics. + * @param tags Tags to apply to all recorded metrics. + */ + public static void monitor(MeterRegistry registry, DataSource ds, String tableName, String name, Iterable tags) { + new DatabaseTableMetrics(ds, tableName, name, tags).bindTo(registry); + } + @Override public void bindTo(MeterRegistry registry) { - registry.gauge(name, Tags.concat(tags,"table", tableName), dataSource, ds -> { + registry.gauge(name, Tags.concat(tags, "table", tableName), dataSource, ds -> { try (Connection conn = ds.getConnection(); PreparedStatement ps = conn.prepareStatement(query); ResultSet rs = ps.executeQuery()) { rs.next(); return rs.getInt(1); - } catch(SQLException ignored) { + } catch (SQLException ignored) { return 0; } }); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/hystrix/MicrometerMetricsPublisherCommand.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/hystrix/MicrometerMetricsPublisherCommand.java index eec584bf7b..00282ac08b 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/hystrix/MicrometerMetricsPublisherCommand.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/hystrix/MicrometerMetricsPublisherCommand.java @@ -134,7 +134,7 @@ public void initialize() { int count = hystrixCommandCompletion.getEventCounts().getCount(hystrixEventType); if (count > 0) { switch (hystrixEventType) { - /* this list is derived from {@link HystrixCommandMetrics.HealthCounts.plus} */ + /* this list is derived from {@link HystrixCommandMetrics.HealthCounts.plus} */ case FAILURE: case TIMEOUT: case THREAD_POOL_REJECTED: @@ -152,9 +152,9 @@ public void initialize() { break; } - if(executionEvents.contains(hystrixEventType)) { + if (executionEvents.contains(hystrixEventType)) { getExecutionCounter(hystrixEventType).increment(count); - } else if(fallbackEvents.contains(hystrixEventType)){ + } else if (fallbackEvents.contains(hystrixEventType)) { getFallbackCounter(hystrixEventType).increment(count); } else { getOtherExecutionCounter(hystrixEventType).increment(count); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jetty/JettyStatisticsMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jetty/JettyStatisticsMetrics.java index 959083e9a1..fa126f76c8 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jetty/JettyStatisticsMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jetty/JettyStatisticsMetrics.java @@ -32,6 +32,11 @@ public class JettyStatisticsMetrics implements MeterBinder { private Iterable tags; + public JettyStatisticsMetrics(StatisticsHandler statisticsHandler, Iterable tags) { + this.tags = tags; + this.statisticsHandler = statisticsHandler; + } + public static void monitor(MeterRegistry meterRegistry, StatisticsHandler statisticsHandler, String... tags) { monitor(meterRegistry, statisticsHandler, Tags.zip(tags)); } @@ -40,45 +45,40 @@ public static void monitor(MeterRegistry meterRegistry, StatisticsHandler statis new JettyStatisticsMetrics(statisticsHandler, tags).bindTo(meterRegistry); } - public JettyStatisticsMetrics(StatisticsHandler statisticsHandler, Iterable tags) { - this.tags = tags; - this.statisticsHandler = statisticsHandler; - } - @Override public void bindTo(MeterRegistry reg) { - bindTimer(reg,"jetty.requests", "Request duration", StatisticsHandler::getRequests, StatisticsHandler::getRequestTimeTotal); - bindTimer(reg,"jetty.dispatched", "Dispatch duration", StatisticsHandler::getDispatched, StatisticsHandler::getDispatchedTimeTotal); + bindTimer(reg, "jetty.requests", "Request duration", StatisticsHandler::getRequests, StatisticsHandler::getRequestTimeTotal); + bindTimer(reg, "jetty.dispatched", "Dispatch duration", StatisticsHandler::getDispatched, StatisticsHandler::getDispatchedTimeTotal); - bindCounter(reg,"jetty.async.requests", "Total number of async requests", StatisticsHandler::getAsyncRequests); - bindCounter(reg,"jetty.async.dispatches", "Total number of requests that have been asynchronously dispatched", StatisticsHandler::getAsyncDispatches); - bindCounter(reg,"jetty.async.expires", "Total number of async requests that have expired", StatisticsHandler::getExpires); + bindCounter(reg, "jetty.async.requests", "Total number of async requests", StatisticsHandler::getAsyncRequests); + bindCounter(reg, "jetty.async.dispatches", "Total number of requests that have been asynchronously dispatched", StatisticsHandler::getAsyncDispatches); + bindCounter(reg, "jetty.async.expires", "Total number of async requests that have expired", StatisticsHandler::getExpires); FunctionCounter.builder("jetty.responses.size", statisticsHandler, StatisticsHandler::getResponsesBytesTotal) .description("Total number of bytes across all responses") .baseUnit("bytes") .register(reg); - bindGauge(reg,"jetty.requests.active", "Number of requests currently active", StatisticsHandler::getRequestsActive); - bindGauge(reg,"jetty.dispatched.active", "Number of dispatches currently active", StatisticsHandler::getDispatchedActive); - bindGauge(reg,"jetty.dispatched.active.max", "Maximum number of active dispatches being handled", StatisticsHandler::getDispatchedActiveMax); + bindGauge(reg, "jetty.requests.active", "Number of requests currently active", StatisticsHandler::getRequestsActive); + bindGauge(reg, "jetty.dispatched.active", "Number of dispatches currently active", StatisticsHandler::getDispatchedActive); + bindGauge(reg, "jetty.dispatched.active.max", "Maximum number of active dispatches being handled", StatisticsHandler::getDispatchedActiveMax); - bindTimeGauge(reg,"jetty.dispatched.time.max", "Maximum time spent in dispatch handling", StatisticsHandler::getDispatchedTimeMax); + bindTimeGauge(reg, "jetty.dispatched.time.max", "Maximum time spent in dispatch handling", StatisticsHandler::getDispatchedTimeMax); - bindGauge(reg,"jetty.async.requests.waiting", "Currently waiting async requests", StatisticsHandler::getAsyncRequestsWaiting); - bindGauge(reg,"jetty.async.requests.waiting.max", "Maximum number of waiting async requests", StatisticsHandler::getAsyncRequestsWaitingMax); + bindGauge(reg, "jetty.async.requests.waiting", "Currently waiting async requests", StatisticsHandler::getAsyncRequestsWaiting); + bindGauge(reg, "jetty.async.requests.waiting.max", "Maximum number of waiting async requests", StatisticsHandler::getAsyncRequestsWaitingMax); - bindTimeGauge(reg,"jetty.request.time.max", "Maximum time spent handling requests", StatisticsHandler::getRequestTimeMax); - bindTimeGauge(reg,"jetty.stats", "Time stats have been collected for", StatisticsHandler::getStatsOnMs); + bindTimeGauge(reg, "jetty.request.time.max", "Maximum time spent handling requests", StatisticsHandler::getRequestTimeMax); + bindTimeGauge(reg, "jetty.stats", "Time stats have been collected for", StatisticsHandler::getStatsOnMs); bindStatusCounters(reg); } private void bindStatusCounters(MeterRegistry reg) { - buildStatusCounter(reg,"1xx", StatisticsHandler::getResponses1xx); - buildStatusCounter(reg,"2xx", StatisticsHandler::getResponses2xx); - buildStatusCounter(reg,"3xx", StatisticsHandler::getResponses3xx); - buildStatusCounter(reg,"4xx", StatisticsHandler::getResponses4xx); - buildStatusCounter(reg,"5xx", StatisticsHandler::getResponses5xx); + buildStatusCounter(reg, "1xx", StatisticsHandler::getResponses1xx); + buildStatusCounter(reg, "2xx", StatisticsHandler::getResponses2xx); + buildStatusCounter(reg, "3xx", StatisticsHandler::getResponses3xx); + buildStatusCounter(reg, "4xx", StatisticsHandler::getResponses4xx); + buildStatusCounter(reg, "5xx", StatisticsHandler::getResponses5xx); } private void bindGauge(MeterRegistry reg, String name, String desc, ToDoubleFunction func) { diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jpa/HibernateMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jpa/HibernateMetrics.java index 2cb2074a78..4fa59c998b 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jpa/HibernateMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jpa/HibernateMetrics.java @@ -39,6 +39,15 @@ @NonNullFields public class HibernateMetrics implements MeterBinder { + private final Iterable tags; + @Nullable + private final Statistics stats; + + private HibernateMetrics(EntityManagerFactory emf, String name, Iterable tags) { + this.tags = Tags.concat(tags, "entityManagerFactory", name); + this.stats = hasStatisticsEnabled(emf) ? getStatistics(emf) : null; + } + public static void monitor(MeterRegistry meterRegistry, EntityManagerFactory emf, String name, String... tags) { monitor(meterRegistry, emf, name, Tags.zip(tags)); } @@ -47,16 +56,8 @@ public static void monitor(MeterRegistry meterRegistry, EntityManagerFactory emf new HibernateMetrics(emf, name, tags).bindTo(meterRegistry); } - private final Iterable tags; - @Nullable private final Statistics stats; - - private HibernateMetrics(EntityManagerFactory emf, String name, Iterable tags) { - this.tags = Tags.concat(tags, "entityManagerFactory", name); - this.stats = hasStatisticsEnabled(emf) ? getStatistics(emf) : null; - } - private void counter(MeterRegistry registry, String name, String description, ToDoubleFunction f, String... extraTags) { - if(this.stats == null) { + if (this.stats == null) { return; } @@ -172,7 +173,8 @@ private boolean hasStatisticsEnabled(EntityManagerFactory emf) { * @param emf an {@code EntityManagerFactory} * @return the {@code Statistics} from the underlying {@code SessionFactory} or {@code null}. */ - @Nullable private Statistics getStatistics(EntityManagerFactory emf) { + @Nullable + private Statistics getStatistics(EntityManagerFactory emf) { try { SessionFactory sf = emf.unwrap(SessionFactory.class); return sf.getStatistics(); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/ExecutorServiceMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/ExecutorServiceMetrics.java index 5b7b1f2c7e..24aa7186fc 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/ExecutorServiceMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/ExecutorServiceMetrics.java @@ -42,6 +42,17 @@ @NonNullApi @NonNullFields public class ExecutorServiceMetrics implements MeterBinder { + @Nullable + private final ExecutorService executorService; + private final String name; + private final Iterable tags; + + public ExecutorServiceMetrics(@Nullable ExecutorService executorService, String name, Iterable tags) { + this.name = name; + this.tags = tags; + this.executorService = executorService; + } + /** * Record metrics on the use of an {@link Executor}. * @@ -98,16 +109,6 @@ public static ExecutorService monitor(MeterRegistry registry, ExecutorService ex return monitor(registry, executor, name, asList(tags)); } - @Nullable private final ExecutorService executorService; - private final String name; - private final Iterable tags; - - public ExecutorServiceMetrics(@Nullable ExecutorService executorService, String name, Iterable tags) { - this.name = name; - this.tags = tags; - this.executorService = executorService; - } - @Override public void bindTo(MeterRegistry registry) { if (executorService == null) { @@ -131,7 +132,8 @@ public void bindTo(MeterRegistry registry) { * Every ScheduledThreadPoolExecutor created by {@link Executors} is wrapped. Also, * {@link Executors#newSingleThreadExecutor()} wrap a regular {@link ThreadPoolExecutor}. */ - @Nullable private ThreadPoolExecutor unwrapThreadPoolExecutor(ExecutorService executor, Class wrapper) { + @Nullable + private ThreadPoolExecutor unwrapThreadPoolExecutor(ExecutorService executor, Class wrapper) { try { Field e = wrapper.getDeclaredField("e"); e.setAccessible(true); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/JvmGcMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/JvmGcMetrics.java index 4afdc6b5b6..a3676c9cc6 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/JvmGcMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/JvmGcMetrics.java @@ -36,6 +36,32 @@ import static java.util.Collections.emptyList; +/** + * Generalization of which parts of the heap are considered "young" or "old" for multiple GC implementations + */ +@NonNullApi +enum GcGenerationAge { + OLD, + YOUNG, + UNKNOWN; + + private static Map knownCollectors = new HashMap() {{ + put("ConcurrentMarkSweep", OLD); + put("Copy", YOUNG); + put("G1 Old Generation", OLD); + put("G1 Young Generation", YOUNG); + put("MarkSweepCompact", OLD); + put("PS MarkSweep", OLD); + put("PS Scavenge", YOUNG); + put("ParNew", YOUNG); + }}; + + static GcGenerationAge fromName(String name) { + GcGenerationAge t = knownCollectors.get(name); + return (t == null) ? UNKNOWN : t; + } +} + /** * Record metrics that report a number of statistics related to garbage * collection emanating from the MXBean and also adds information about GC causes. @@ -45,8 +71,10 @@ @NonNullApi @NonNullFields public class JvmGcMetrics implements MeterBinder { - @Nullable private String youngGenPoolName; - @Nullable private String oldGenPoolName; + @Nullable + private String youngGenPoolName; + @Nullable + private String oldGenPoolName; private Iterable tags; public JvmGcMetrics() { @@ -101,7 +129,7 @@ public void bindTo(MeterRegistry registry) { CompositeData cd = (CompositeData) notification.getUserData(); GarbageCollectionNotificationInfo notificationInfo = GarbageCollectionNotificationInfo.from(cd); - if(isConcurrentPhase(notificationInfo)) { + if (isConcurrentPhase(notificationInfo)) { Timer.builder("jvm.gc.concurrent.phase.time") .tags(tags) .tags("action", notificationInfo.getGcAction(), "cause", notificationInfo.getGcCause()) @@ -169,29 +197,3 @@ private boolean isYoungGenPool(String name) { return name.endsWith("Eden Space"); } } - -/** - * Generalization of which parts of the heap are considered "young" or "old" for multiple GC implementations - */ -@NonNullApi -enum GcGenerationAge { - OLD, - YOUNG, - UNKNOWN; - - private static Map knownCollectors = new HashMap() {{ - put("ConcurrentMarkSweep", OLD); - put("Copy", YOUNG); - put("G1 Old Generation", OLD); - put("G1 Young Generation", YOUNG); - put("MarkSweepCompact", OLD); - put("PS MarkSweep", OLD); - put("PS Scavenge", YOUNG); - put("ParNew", YOUNG); - }}; - - static GcGenerationAge fromName(String name) { - GcGenerationAge t = knownCollectors.get(name); - return (t == null) ? UNKNOWN : t; - } -} diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/JvmMemoryMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/JvmMemoryMetrics.java index f6a7e458d1..679797395f 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/JvmMemoryMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/jvm/JvmMemoryMetrics.java @@ -33,10 +33,9 @@ /** * Record metrics that report utilization of various memory and buffer pools. * + * @author Jon Schneider * @see MemoryPoolMXBean * @see BufferPoolMXBean - * - * @author Jon Schneider */ @NonNullApi @NonNullFields @@ -76,7 +75,7 @@ public void bindTo(MeterRegistry registry) { for (MemoryPoolMXBean memoryPoolBean : ManagementFactory.getPlatformMXBeans(MemoryPoolMXBean.class)) { String area = MemoryType.HEAP.equals(memoryPoolBean.getType()) ? "heap" : "nonheap"; - Iterable tagsWithId = Tags.concat(tags,"id", memoryPoolBean.getName(), "area", area); + Iterable tagsWithId = Tags.concat(tags, "id", memoryPoolBean.getName(), "area", area); Gauge.builder("jvm.memory.used", memoryPoolBean, (mem) -> mem.getUsage().getUsed()) .tags(tagsWithId) diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/LogbackMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/LogbackMetrics.java index 948895829e..c7d94cb7c5 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/LogbackMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/LogbackMetrics.java @@ -93,7 +93,7 @@ class MetricsTurboFilter extends TurboFilter { @Override public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { // cannot use logger.isEnabledFor(level), as it would cause a StackOverflowError by calling this filter again! - if(level.isGreaterOrEqual(logger.getEffectiveLevel()) && format != null) { + if (level.isGreaterOrEqual(logger.getEffectiveLevel()) && format != null) { switch (level.toInt()) { case Level.ERROR_INT: errorCounter.increment(); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/okhttp3/OkHttpMetricsEventListener.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/okhttp3/OkHttpMetricsEventListener.java index 0af565c8d3..f24edf2dd6 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/okhttp3/OkHttpMetricsEventListener.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/okhttp3/OkHttpMetricsEventListener.java @@ -50,17 +50,6 @@ public class OkHttpMetricsEventListener extends EventListener { private final MeterRegistry registry; private final ConcurrentMap callState = new ConcurrentHashMap<>(); - private static class CallState { - final long startTime; - @Nullable Request request; - @Nullable Response response; - @Nullable IOException exception; - - CallState(long startTime) { - this.startTime = startTime; - } - } - OkHttpMetricsEventListener(MeterRegistry registry, String requestsMetricName, Function urlMapper, Iterable extraTags) { this.registry = registry; this.requestsMetricName = requestsMetricName; @@ -68,6 +57,10 @@ private static class CallState { this.extraTags = extraTags; } + public static Builder builder(MeterRegistry registry, String name) { + return new Builder(registry, name); + } + @Override public void callStart(Call call) { callState.put(call, new CallState(registry.config().clock().monotonicTime())); @@ -84,7 +77,7 @@ public void requestHeadersEnd(Call call, Request request) { @Override public void callFailed(Call call, IOException e) { CallState state = callState.remove(call); - if(state != null) { + if (state != null) { state.exception = e; time(state); } @@ -93,7 +86,7 @@ public void callFailed(Call call, IOException e) { @Override public void responseHeadersEnd(Call call, Response response) { CallState state = callState.remove(call); - if(state != null) { + if (state != null) { state.response = response; time(state); } @@ -129,8 +122,18 @@ private String getStatusMessage(@Nullable Response response, @Nullable IOExcepti return Integer.toString(response.code()); } - public static Builder builder(MeterRegistry registry, String name) { - return new Builder(registry, name); + private static class CallState { + final long startTime; + @Nullable + Request request; + @Nullable + Response response; + @Nullable + IOException exception; + + CallState(long startTime) { + this.startTime = startTime; + } } public static class Builder { diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/reactor/ReactorMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/reactor/ReactorMetrics.java index 829b31f0a5..d029939565 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/reactor/ReactorMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/reactor/ReactorMetrics.java @@ -31,6 +31,9 @@ * @author Jon Schneider */ public class ReactorMetrics { + private static final Predicate POINTCUT_FILTER = + s -> !(s instanceof Fuseable.ScalarCallable); + private ReactorMetrics() { } @@ -50,7 +53,4 @@ private ReactorMetrics() { ); })); } - - private static final Predicate POINTCUT_FILTER = - s -> !(s instanceof Fuseable.ScalarCallable); } \ No newline at end of file diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/system/FileDescriptorMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/system/FileDescriptorMetrics.java index 3bafe023b6..7d8589bed1 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/system/FileDescriptorMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/system/FileDescriptorMetrics.java @@ -41,8 +41,10 @@ public class FileDescriptorMetrics implements MeterBinder { private final OperatingSystemMXBean osBean; private final Iterable tags; - @Nullable private final Method openFdsMethod; - @Nullable private final Method maxFdsMethod; + @Nullable + private final Method openFdsMethod; + @Nullable + private final Method maxFdsMethod; public FileDescriptorMetrics() { this(emptyList()); @@ -63,14 +65,14 @@ public FileDescriptorMetrics(Iterable tags) { @Override public void bindTo(MeterRegistry registry) { - if(openFdsMethod != null) { + if (openFdsMethod != null) { Gauge.builder("process.open.fds", osBean, x -> invoke(openFdsMethod)) .tags(tags) .description("The open file descriptor count") .register(registry); } - if(maxFdsMethod != null) { + if (maxFdsMethod != null) { Gauge.builder("process.max.fds", osBean, x -> invoke(maxFdsMethod)) .tags(tags) .description("The maximum file descriptor count") diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/system/UptimeMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/system/UptimeMetrics.java index 1e551937dc..e56f1167f8 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/system/UptimeMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/system/UptimeMetrics.java @@ -61,7 +61,7 @@ public void bindTo(MeterRegistry registry) { .description("The uptime of the Java virtual machine") .register(registry); - TimeGauge.builder("process.start.time" ,runtimeMXBean, TimeUnit.MILLISECONDS, x -> Long.valueOf(x.getStartTime()).doubleValue()) + TimeGauge.builder("process.start.time", runtimeMXBean, TimeUnit.MILLISECONDS, x -> Long.valueOf(x.getStartTime()).doubleValue()) .tags(tags) .description("The start time of the Java virtual machine") .register(registry); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/tomcat/TomcatMetrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/tomcat/TomcatMetrics.java index e9fffa6675..2f88301bce 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/tomcat/TomcatMetrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/tomcat/TomcatMetrics.java @@ -38,10 +38,21 @@ @NonNullApi @NonNullFields public class TomcatMetrics implements MeterBinder { - @Nullable private final Manager manager; + @Nullable + private final Manager manager; private final MBeanServer mBeanServer; private final Iterable tags; + public TomcatMetrics(@Nullable Manager manager, Iterable tags) { + this(manager, tags, getMBeanServer()); + } + + public TomcatMetrics(@Nullable Manager manager, Iterable tags, MBeanServer mBeanServer) { + this.tags = tags; + this.manager = manager; + this.mBeanServer = mBeanServer; + } + public static void monitor(MeterRegistry meterRegistry, @Nullable Manager manager, String... tags) { monitor(meterRegistry, manager, Tags.zip(tags)); } @@ -58,16 +69,6 @@ public static MBeanServer getMBeanServer() { return ManagementFactory.getPlatformMBeanServer(); } - public TomcatMetrics(@Nullable Manager manager, Iterable tags) { - this(manager, tags, getMBeanServer()); - } - - public TomcatMetrics(@Nullable Manager manager, Iterable tags, MBeanServer mBeanServer) { - this.tags = tags; - this.manager = manager; - this.mBeanServer = mBeanServer; - } - @Override public void bindTo(MeterRegistry reg) { registerGlobalRequestMetrics(reg); @@ -197,7 +198,7 @@ private void registerGlobalRequestMetrics(MeterRegistry reg) { private void registerMetricsEventually(String key, String value, BiConsumer> perObject) { try { Set objs = mBeanServer.queryNames(new ObjectName("Tomcat:" + key + "=" + value + ",*"), null); - if(!objs.isEmpty()) { + if (!objs.isEmpty()) { // MBean is present, so we can register metrics now. objs.forEach(o -> perObject.accept(o, Tags.concat(tags, nameTag(o)))); return; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeCounter.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeCounter.java index 7ef8afe60a..9fdd3448ae 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeCounter.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeCounter.java @@ -44,9 +44,9 @@ Counter newNoopMeter() { @Override Counter registerNewMeter(MeterRegistry registry) { return Counter.builder(getId().getName()) - .tags(getId().getTags()) - .description(getId().getDescription()) - .baseUnit(getId().getBaseUnit()) - .register(registry); + .tags(getId().getTags()) + .description(getId().getDescription()) + .baseUnit(getId().getBaseUnit()) + .register(registry); } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeFunctionTimer.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeFunctionTimer.java index a27d10424a..56ee7ef9a9 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeFunctionTimer.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeFunctionTimer.java @@ -68,9 +68,9 @@ FunctionTimer registerNewMeter(MeterRegistry registry) { } return FunctionTimer.builder(getId().getName(), obj, countFunction, - totalTimeFunction, totalTimeFunctionUnits) - .tags(getId().getTags()) - .description(getId().getDescription()) - .baseUnit(getId().getBaseUnit()).register(registry); + totalTimeFunction, totalTimeFunctionUnits) + .tags(getId().getTags()) + .description(getId().getDescription()) + .baseUnit(getId().getBaseUnit()).register(registry); } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeGauge.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeGauge.java index 1ef1a2be62..a9ecf6ccad 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeGauge.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeGauge.java @@ -52,9 +52,9 @@ Gauge registerNewMeter(MeterRegistry registry) { } return Gauge.builder(getId().getName(), obj, f) - .tags(getId().getTags()) - .description(getId().getDescription()) - .baseUnit(getId().getBaseUnit()) - .register(registry); + .tags(getId().getTags()) + .description(getId().getDescription()) + .baseUnit(getId().getBaseUnit()) + .register(registry); } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeLongTaskTimer.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeLongTaskTimer.java index 6cf9c231ac..f79bb5b669 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeLongTaskTimer.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeLongTaskTimer.java @@ -46,7 +46,7 @@ public Sample start() { public long stop(long task) { Collection childMappings = timings.remove(task); long last = 0; - if(childMappings != null) { + if (childMappings != null) { for (Sample sample : childMappings) { last = sample.stop(); } @@ -57,7 +57,7 @@ public long stop(long task) { @Override public double duration(long task, TimeUnit unit) { Collection childSamples = timings.get(task); - if(childSamples != null) { + if (childSamples != null) { return childSamples.stream().findFirst().map(c -> c.duration(unit)).orElse(-1.0); } return -1.0; @@ -81,8 +81,8 @@ LongTaskTimer newNoopMeter() { @Override LongTaskTimer registerNewMeter(MeterRegistry registry) { return LongTaskTimer.builder(getId().getName()) - .tags(getId().getTags()) - .description(getId().getDescription()) - .register(registry); + .tags(getId().getTags()) + .description(getId().getDescription()) + .register(registry); } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeMeter.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeMeter.java index 56cccfcb93..6f2ce0305a 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeMeter.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeMeter.java @@ -20,5 +20,6 @@ interface CompositeMeter extends Meter { void add(MeterRegistry registry); + void remove(MeterRegistry registry); } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeMeterRegistry.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeMeterRegistry.java index 138514f674..8ba620841a 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeMeterRegistry.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeMeterRegistry.java @@ -105,7 +105,7 @@ protected Meter newMeter(Meter.Id id, Meter.Type type, Iterable mea } public CompositeMeterRegistry add(MeterRegistry registry) { - if(registries.add(registry)) { + if (registries.add(registry)) { // in the event of a race, the new meter will be added to this registry via the onMeterAdded listener forEachMeter(m -> ((CompositeMeter) m).add(registry)); } @@ -113,7 +113,7 @@ public CompositeMeterRegistry add(MeterRegistry registry) { } public CompositeMeterRegistry remove(MeterRegistry registry) { - if(registries.remove(registry)) { + if (registries.remove(registry)) { forEachMeter(m -> ((CompositeMeter) m).remove(registry)); } return this; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeTimeGauge.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeTimeGauge.java index cb4e70581e..c6b4dc2141 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeTimeGauge.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeTimeGauge.java @@ -59,8 +59,8 @@ TimeGauge registerNewMeter(MeterRegistry registry) { } return TimeGauge.builder(getId().getName(), obj, fUnit, f) - .tags(getId().getTags()) - .description(getId().getDescription()) - .register(registry); + .tags(getId().getTags()) + .description(getId().getDescription()) + .register(registry); } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeTimer.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeTimer.java index 889dc7a435..2c1b5ae212 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeTimer.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeTimer.java @@ -129,7 +129,7 @@ Timer registerNewMeter(MeterRegistry registry) { final long[] slaNanos = histogramConfig.getSlaBoundaries(); Duration[] sla = null; - if(slaNanos != null) { + if (slaNanos != null) { sla = new Duration[slaNanos.length]; for (int i = 0; i < slaNanos.length; i++) { sla[i] = Duration.ofNanos(slaNanos[i]); @@ -137,16 +137,16 @@ Timer registerNewMeter(MeterRegistry registry) { } return Timer.builder(getId().getName()) - .tags(getId().getTags()) - .description(getId().getDescription()) - .maximumExpectedValue(Duration.ofNanos(histogramConfig.getMaximumExpectedValue())) - .minimumExpectedValue(Duration.ofNanos(histogramConfig.getMinimumExpectedValue())) - .publishPercentiles(histogramConfig.getPercentiles()) - .publishPercentileHistogram(histogramConfig.isPercentileHistogram()) - .histogramBufferLength(histogramConfig.getHistogramBufferLength()) - .histogramExpiry(histogramConfig.getHistogramExpiry()) - .sla(sla) - .pauseDetector(pauseDetector) - .register(registry); + .tags(getId().getTags()) + .description(getId().getDescription()) + .maximumExpectedValue(Duration.ofNanos(histogramConfig.getMaximumExpectedValue())) + .minimumExpectedValue(Duration.ofNanos(histogramConfig.getMinimumExpectedValue())) + .publishPercentiles(histogramConfig.getPercentiles()) + .publishPercentileHistogram(histogramConfig.isPercentileHistogram()) + .histogramBufferLength(histogramConfig.getHistogramBufferLength()) + .histogramExpiry(histogramConfig.getHistogramExpiry()) + .sla(sla) + .pauseDetector(pauseDetector) + .register(registry); } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/config/MeterFilter.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/config/MeterFilter.java index 90ee67af42..390316492d 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/config/MeterFilter.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/config/MeterFilter.java @@ -44,34 +44,6 @@ */ @Incubating(since = "1.0.0-rc.3") public interface MeterFilter { - /** - * @param id Id with {@link MeterFilter#map} transformations applied. - * @return After all transformations, should a real meter be registered for this id, or should it be no-op'd. - */ - default MeterFilterReply accept(Meter.Id id) { - return MeterFilterReply.NEUTRAL; - } - - /** - * @return Transformations to any part of the id. - */ - default Meter.Id map(Meter.Id id) { - return id; - } - - /** - * This is only called when filtering new timers and distribution summaries (i.e. those meter types - * that use {@link HistogramConfig}). - * - * @param id Id with {@link MeterFilter#map} transformations applied. - * @param config A histogram configuration guaranteed to be non-null. - * @return Overrides to any part of the histogram config, when applicable. - */ - @Nullable - default HistogramConfig configure(Meter.Id id, HistogramConfig config) { - return config; - } - static MeterFilter commonTags(Iterable tags) { return new MeterFilter() { @Override @@ -215,13 +187,13 @@ static MeterFilter maximumAllowableTags(String meterName, String tagKey, int max @Override public MeterFilterReply accept(Meter.Id id) { - if(id.getName().equals(meterName)) { + if (id.getName().equals(meterName)) { String value = id.getTag(tagKey); - if(value != null) + if (value != null) observedTagValues.add(value); } - if(observedTagValues.size() > maximumTagValues) { + if (observedTagValues.size() > maximumTagValues) { return onMaxReached.accept(id); } return MeterFilterReply.NEUTRAL; @@ -229,7 +201,7 @@ public MeterFilterReply accept(Meter.Id id) { @Override public HistogramConfig configure(Meter.Id id, HistogramConfig config) { - if(observedTagValues.size() > maximumTagValues) { + if (observedTagValues.size() > maximumTagValues) { return onMaxReached.configure(id, config); } return config; @@ -240,4 +212,32 @@ public HistogramConfig configure(Meter.Id id, HistogramConfig config) { static MeterFilter denyNameStartsWith(String prefix) { return deny(id -> id.getName().startsWith(prefix)); } + + /** + * @param id Id with {@link MeterFilter#map} transformations applied. + * @return After all transformations, should a real meter be registered for this id, or should it be no-op'd. + */ + default MeterFilterReply accept(Meter.Id id) { + return MeterFilterReply.NEUTRAL; + } + + /** + * @return Transformations to any part of the id. + */ + default Meter.Id map(Meter.Id id) { + return id; + } + + /** + * This is only called when filtering new timers and distribution summaries (i.e. those meter types + * that use {@link HistogramConfig}). + * + * @param id Id with {@link MeterFilter#map} transformations applied. + * @param config A histogram configuration guaranteed to be non-null. + * @return Overrides to any part of the histogram config, when applicable. + */ + @Nullable + default HistogramConfig configure(Meter.Id id, HistogramConfig config) { + return config; + } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/config/MeterRegistryConfig.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/config/MeterRegistryConfig.java index dbe2a04f87..3b90eb3f2d 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/config/MeterRegistryConfig.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/config/MeterRegistryConfig.java @@ -23,10 +23,8 @@ public interface MeterRegistryConfig { /** * Get the value associated with a key. * - * @param k - * Key to lookup in the config. - * @return - * Value for the key or null if no key is present. + * @param k Key to lookup in the config. + * @return Value for the key or null if no key is present. */ @Nullable String get(String k); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/config/NamingConvention.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/config/NamingConvention.java index 8439eca1a4..1412509abf 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/config/NamingConvention.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/config/NamingConvention.java @@ -24,7 +24,7 @@ /** * Monitoring systems make different recommendations regarding naming convention. - * + *

* Also, many systems have constraints on valid characters that may appear * in a tag key/value or metric name. While it is recommended to choose tag * keys/values that are absent special characters that are invalid on any @@ -112,8 +112,14 @@ private String capitalize(String name) { default String name(String name, Meter.Type type) { return name(name, type, null); } + String name(String name, Meter.Type type, @Nullable String baseUnit); - default String tagKey(String key) { return key; } - default String tagValue(String value) { return value; } + default String tagKey(String key) { + return key; + } + + default String tagValue(String value) { + return value; + } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/config/PropertyMeterFilter.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/config/PropertyMeterFilter.java index 9b3d4cec90..f811039435 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/config/PropertyMeterFilter.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/config/PropertyMeterFilter.java @@ -34,14 +34,14 @@ public abstract class PropertyMeterFilter implements MeterFilter { @Nullable protected V getMostSpecific(String k, String suffix, Class vClass) { V v = get(k.isEmpty() ? suffix : k + "." + suffix, vClass); - if(v != null) + if (v != null) return v; - else if(k.isEmpty()) { + else if (k.isEmpty()) { return null; } int lastSep = k.lastIndexOf('.'); - if(lastSep == -1) + if (lastSep == -1) return getMostSpecific("", suffix, vClass); return getMostSpecific(k.substring(0, lastSep), suffix, vClass); @@ -50,69 +50,68 @@ else if(k.isEmpty()) { @Override public MeterFilterReply accept(Meter.Id id) { Boolean enabled = getMostSpecific(id.getName(), "enabled", Boolean.class); - if(enabled == null) + if (enabled == null) return MeterFilterReply.NEUTRAL; return enabled ? MeterFilterReply.ACCEPT : MeterFilterReply.DENY; } @Override public HistogramConfig configure(Meter.Id id, HistogramConfig histogramConfig) { - if(!id.getType().equals(Meter.Type.Timer) && !id.getType().equals(Meter.Type.DistributionSummary)) + if (!id.getType().equals(Meter.Type.Timer) && !id.getType().equals(Meter.Type.DistributionSummary)) return histogramConfig; HistogramConfig.Builder builder = HistogramConfig.builder(); Boolean percentileHistogram = getMostSpecific(id.getName(), "percentileHistogram", Boolean.class); - if(percentileHistogram != null) + if (percentileHistogram != null) builder.percentilesHistogram(percentileHistogram); double[] percentiles = getMostSpecific(id.getName(), "percentiles", double[].class); - if(percentiles != null) + if (percentiles != null) builder.percentiles(percentiles); Integer histogramBufferLength = getMostSpecific(id.getName(), "histogramBufferLength", Integer.class); - if(histogramBufferLength != null) { + if (histogramBufferLength != null) { builder.histogramBufferLength(histogramBufferLength); } Duration histogramExpiry = getMostSpecific(id.getName(), "histogramExpiry", Duration.class); - if(histogramExpiry != null) { + if (histogramExpiry != null) { builder.histogramExpiry(histogramExpiry); } - if(id.getType().equals(Meter.Type.Timer)) { + if (id.getType().equals(Meter.Type.Timer)) { Duration max = getMostSpecific(id.getName(), "maximumExpectedValue", Duration.class); if (max != null) { builder.maximumExpectedValue(max.toNanos()); } Duration min = getMostSpecific(id.getName(), "minimumExpectedValue", Duration.class); - if(min != null) { + if (min != null) { builder.minimumExpectedValue(min.toNanos()); } Duration[] sla = getMostSpecific(id.getName(), "sla", Duration[].class); - if(sla != null) { + if (sla != null) { long[] slaNanos = new long[sla.length]; for (int i = 0; i < sla.length; i++) { slaNanos[i] = sla[i].toNanos(); } builder.sla(slaNanos); } - } - else if(id.getType().equals(Meter.Type.DistributionSummary)) { + } else if (id.getType().equals(Meter.Type.DistributionSummary)) { Long max = getMostSpecific(id.getName(), "maximumExpectedValue", Long.class); if (max != null) { builder.maximumExpectedValue(max); } Long min = getMostSpecific(id.getName(), "minimumExpectedValue", Long.class); - if(min != null) { + if (min != null) { builder.minimumExpectedValue(min); } long[] sla = getMostSpecific(id.getName(), "sla", long[].class); - if(sla != null) + if (sla != null) builder.sla(sla); } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/cumulative/CumulativeCounter.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/cumulative/CumulativeCounter.java index d131027ac5..163707b655 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/cumulative/CumulativeCounter.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/cumulative/CumulativeCounter.java @@ -23,7 +23,9 @@ public class CumulativeCounter extends AbstractMeter implements Counter { private final DoubleAdder value; - /** Create a new instance. */ + /** + * Create a new instance. + */ public CumulativeCounter(Id id) { super(id); this.value = new DoubleAdder(); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/dropwizard/DropwizardFunctionTimer.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/dropwizard/DropwizardFunctionTimer.java index 661d3a43d2..f30d3c2f12 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/dropwizard/DropwizardFunctionTimer.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/dropwizard/DropwizardFunctionTimer.java @@ -37,10 +37,10 @@ public class DropwizardFunctionTimer extends AbstractMeter implements Functio private final TimeUnit totalTimeFunctionUnits; private final AtomicLong lastCount = new AtomicLong(0); - private volatile double lastTime = 0.0; private final DropwizardRate rate; private final Timer dropwizardMeter; private final TimeUnit registryBaseTimeUnit; + private volatile double lastTime = 0.0; DropwizardFunctionTimer(Meter.Id id, Clock clock, T obj, ToLongFunction countFunction, diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/HistogramConfig.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/HistogramConfig.java index 742f84e95a..dca9906f4b 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/HistogramConfig.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/HistogramConfig.java @@ -25,15 +25,6 @@ @Incubating(since = "1.0.0-rc.3") public class HistogramConfig implements Mergeable { - @Nullable private Boolean percentileHistogram; - @Nullable private double[] percentiles; - @Nullable private long[] sla; - @Nullable private Long minimumExpectedValue; - @Nullable private Long maximumExpectedValue; - - @Nullable private Duration histogramExpiry; - @Nullable private Integer histogramBufferLength; - public static final HistogramConfig DEFAULT = builder() .percentilesHistogram(false) .percentiles() @@ -43,8 +34,25 @@ public class HistogramConfig implements Mergeable { .histogramExpiry(Duration.ofMinutes(2)) .histogramBufferLength(5) .build(); - public static final HistogramConfig NONE = builder().build(); + @Nullable + private Boolean percentileHistogram; + @Nullable + private double[] percentiles; + @Nullable + private long[] sla; + @Nullable + private Long minimumExpectedValue; + @Nullable + private Long maximumExpectedValue; + @Nullable + private Duration histogramExpiry; + @Nullable + private Integer histogramBufferLength; + + public static Builder builder() { + return new Builder(); + } @Override public HistogramConfig merge(HistogramConfig parent) { @@ -66,13 +74,13 @@ public boolean isPublishingHistogram() { public NavigableSet getHistogramBuckets(boolean supportsAggregablePercentiles) { NavigableSet buckets = new TreeSet<>(); - if(percentileHistogram != null && percentileHistogram && supportsAggregablePercentiles) { + if (percentileHistogram != null && percentileHistogram && supportsAggregablePercentiles) { buckets.addAll(PercentileHistogramBuckets.buckets(this)); buckets.add(minimumExpectedValue); buckets.add(maximumExpectedValue); } - if(sla != null) { + if (sla != null) { for (long slaBoundary : sla) { buckets.add(slaBoundary); } @@ -81,38 +89,41 @@ public NavigableSet getHistogramBuckets(boolean supportsAggregablePercenti return buckets; } - public @Nullable Boolean isPercentileHistogram() { + public @Nullable + Boolean isPercentileHistogram() { return percentileHistogram; } - public @Nullable double[] getPercentiles() { + public @Nullable + double[] getPercentiles() { return percentiles; } - public @Nullable Long getMinimumExpectedValue() { + public @Nullable + Long getMinimumExpectedValue() { return minimumExpectedValue; } - public @Nullable Long getMaximumExpectedValue() { + public @Nullable + Long getMaximumExpectedValue() { return maximumExpectedValue; } - public @Nullable Duration getHistogramExpiry() { + public @Nullable + Duration getHistogramExpiry() { return histogramExpiry; } - public @Nullable Integer getHistogramBufferLength() { + public @Nullable + Integer getHistogramBufferLength() { return histogramBufferLength; } - public @Nullable long[] getSlaBoundaries() { + public @Nullable + long[] getSlaBoundaries() { return sla; } - public static Builder builder() { - return new Builder(); - } - public static class Builder { private final HistogramConfig config = new HistogramConfig(); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/NoopHistogram.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/NoopHistogram.java index 832e007e5a..374eaca007 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/NoopHistogram.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/NoopHistogram.java @@ -20,9 +20,8 @@ final class NoopHistogram extends Histogram { - private static final long serialVersionUID = 82886959971723882L; - static final NoopHistogram INSTANCE = new NoopHistogram(); + private static final long serialVersionUID = 82886959971723882L; private NoopHistogram() { super(1, 2, 0); @@ -49,61 +48,78 @@ public boolean isAutoResize() { } @Override - public boolean supportsAutoResize() { - return true; + public void setAutoResize(boolean autoResize) { } @Override - public void setAutoResize(boolean autoResize) {} + public boolean supportsAutoResize() { + return true; + } @Override - public void recordValue(long value) {} + public void recordValue(long value) { + } @Override - public void recordValueWithCount(long value, long count) {} + public void recordValueWithCount(long value, long count) { + } @Override - public void recordValueWithExpectedInterval(long value, long expectedIntervalBetweenValueSamples) {} + public void recordValueWithExpectedInterval(long value, long expectedIntervalBetweenValueSamples) { + } @Override - public void recordConvertedDoubleValueWithCount(double value, long count) {} + public void recordConvertedDoubleValueWithCount(double value, long count) { + } @SuppressWarnings("deprecation") @Override - public void recordValue(long value, long expectedIntervalBetweenValueSamples) {} + public void recordValue(long value, long expectedIntervalBetweenValueSamples) { + } @Override - public void reset() {} + public void reset() { + } @Override - public void copyInto(AbstractHistogram targetHistogram) {} + public void copyInto(AbstractHistogram targetHistogram) { + } @Override public void copyIntoCorrectedForCoordinatedOmission(AbstractHistogram targetHistogram, - long expectedIntervalBetweenValueSamples) {} + long expectedIntervalBetweenValueSamples) { + } @Override - public void add(AbstractHistogram otherHistogram) {} + public void add(AbstractHistogram otherHistogram) { + } @Override - public void subtract(AbstractHistogram otherHistogram) {} + public void subtract(AbstractHistogram otherHistogram) { + } @Override public void addWhileCorrectingForCoordinatedOmission(AbstractHistogram otherHistogram, - long expectedIntervalBetweenValueSamples) {} + long expectedIntervalBetweenValueSamples) { + } @Override - public void shiftValuesLeft(int numberOfBinaryOrdersOfMagnitude) {} + public void shiftValuesLeft(int numberOfBinaryOrdersOfMagnitude) { + } @Override - public void shiftValuesRight(int numberOfBinaryOrdersOfMagnitude) {} + public void shiftValuesRight(int numberOfBinaryOrdersOfMagnitude) { + } @Override - public void setStartTimeStamp(long timeStampMsec) {} + public void setStartTimeStamp(long timeStampMsec) { + } @Override - public void setEndTimeStamp(long timeStampMsec) {} + public void setEndTimeStamp(long timeStampMsec) { + } @Override - public void setTag(String tag) {} + public void setTag(String tag) { + } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowHistogramBase.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowHistogramBase.java index 6c0d9fd074..576a349dc3 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowHistogramBase.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowHistogramBase.java @@ -31,7 +31,6 @@ /** * @param the type of the buckets in a ring buffer * @param the type of accumulated histogram - * * @author Jon Schneider * @author Trustin Heuiseung Lee */ @@ -48,13 +47,13 @@ abstract class TimeWindowHistogramBase { private final HistogramConfig histogramConfig; private final T[] ringBuffer; - @Nullable private U accumulatedHistogram; - private volatile boolean accumulatedHistogramStale; - private final long durationBetweenRotatesMillis; + @Nullable + private U accumulatedHistogram; + private volatile boolean accumulatedHistogramStale; private int currentBucket; private volatile long lastRotateTimestampMillis; - @SuppressWarnings({ "unused", "FieldCanBeLocal" }) + @SuppressWarnings({"unused", "FieldCanBeLocal"}) private volatile int rotating; // 0 - not rotating, 1 - rotating TimeWindowHistogramBase(Clock clock, HistogramConfig histogramConfig, Class bucketType) { @@ -72,7 +71,7 @@ abstract class TimeWindowHistogramBase { durationBetweenRotatesMillis = histogramConfig.getHistogramExpiry().toMillis() / ageBuckets; if (durationBetweenRotatesMillis <= 0) { rejectHistogramConfig("histogramExpiry (" + histogramConfig.getHistogramExpiry().toMillis() + - "ms) / histogramBufferLength (" + ageBuckets + ") must be greater than 0."); + "ms) / histogramBufferLength (" + ageBuckets + ") must be greater than 0."); } currentBucket = 0; @@ -84,7 +83,7 @@ private static HistogramConfig validateHistogramConfig(HistogramConfig histogram for (double p : histogramConfig.getPercentiles()) { if (p < 0 || p > 1) { rejectHistogramConfig("percentiles must contain only the values between 0.0 and 1.0. " + - "Found " + p); + "Found " + p); } } @@ -95,19 +94,23 @@ private static HistogramConfig validateHistogramConfig(HistogramConfig histogram } if (maximumExpectedValue < minimumExpectedValue) { rejectHistogramConfig("maximumExpectedValue (" + maximumExpectedValue + - ") must be equal to or greater than minimumExpectedValue (" + - minimumExpectedValue + ")."); + ") must be equal to or greater than minimumExpectedValue (" + + minimumExpectedValue + ")."); } for (long sla : histogramConfig.getSlaBoundaries()) { if (sla <= 0) { rejectHistogramConfig("slaBoundaries must contain only the values greater than 0. " + - "Found " + sla); + "Found " + sla); } } return histogramConfig; } + private static void rejectHistogramConfig(String msg) { + throw new IllegalStateException("Invalid HistogramConfig: " + msg); + } + void initRingBuffer() { for (int i = 0; i < ringBuffer.length; i++) { ringBuffer[i] = newBucket(histogramConfig); @@ -115,20 +118,22 @@ void initRingBuffer() { accumulatedHistogram = newAccumulatedHistogram(ringBuffer); } - private static void rejectHistogramConfig(String msg) { - throw new IllegalStateException("Invalid HistogramConfig: " + msg); - } - abstract T newBucket(HistogramConfig histogramConfig); + abstract void recordLong(T bucket, long value); + abstract void recordDouble(T bucket, double value); + abstract void resetBucket(T bucket); abstract U newAccumulatedHistogram(T[] ringBuffer); + abstract void accumulate(T sourceBucket, U accumulatedHistogram); + abstract void resetAccumulatedHistogram(U accumulatedHistogram); abstract double valueAtPercentile(U accumulatedHistogram, double percentile); + abstract double countAtValue(U accumulatedHistogram, long value); public final double percentile(double percentile) { diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowLatencyHistogram.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowLatencyHistogram.java index 6d60b71a3b..108f1b281b 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowLatencyHistogram.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowLatencyHistogram.java @@ -41,12 +41,6 @@ public class TimeWindowLatencyHistogram extends TimeWindowHistogramBase summary.percentile(percentile)); } } - if(histogramConfig.isPublishingHistogram()) { + if (histogramConfig.isPublishingHistogram()) { for (Long bucket : histogramConfig.getHistogramBuckets(false)) { more().counter(getConventionName(id), Tags.concat(getConventionTags(id), "bucket", Long.toString(bucket)), summary, s -> s.histogramCountAtValue(bucket)); @@ -107,14 +107,14 @@ protected Timer newTimer(Meter.Id id, HistogramConfig histogramConfig, PauseDete break; } - if(histogramConfig.getPercentiles() != null) { + if (histogramConfig.getPercentiles() != null) { for (double percentile : histogramConfig.getPercentiles()) { gauge(id.getName(), Tags.concat(getConventionTags(id), "percentile", percentileFormat.format(percentile)), timer, t -> t.percentile(percentile, getBaseTimeUnit())); } } - if(histogramConfig.isPublishingHistogram()) { + if (histogramConfig.isPublishingHistogram()) { for (Long bucket : histogramConfig.getHistogramBuckets(false)) { more().counter(getConventionName(id), Tags.concat(getConventionTags(id), "bucket", percentileFormat.format(TimeUtils.nanosToUnit(bucket, getBaseTimeUnit()))), diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepCounter.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepCounter.java index 32cfcf21eb..fbaba1ddbc 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepCounter.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepCounter.java @@ -27,7 +27,9 @@ public class StepCounter extends AbstractMeter implements Counter { private final StepDouble value; - /** Create a new instance. */ + /** + * Create a new instance. + */ public StepCounter(Id id, Clock clock, long stepMillis) { super(id); this.value = new StepDouble(clock, stepMillis); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepDouble.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepDouble.java index 2fcc5209dd..4a5faac73a 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepDouble.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepDouble.java @@ -29,11 +29,9 @@ public class StepDouble { private final Clock clock; private final long stepMillis; - - private volatile double previous = 0.0; private final DoubleAdder current = new DoubleAdder(); - private final AtomicLong lastInitPos; + private volatile double previous = 0.0; public StepDouble(Clock clock, long stepMillis) { this.clock = clock; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepFunctionCounter.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepFunctionCounter.java index 6ef51f3af7..06cc57815b 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepFunctionCounter.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepFunctionCounter.java @@ -38,7 +38,7 @@ public StepFunctionCounter(Id id, Clock clock, long stepMillis, T obj, ToDoubleF @Override public double count() { T obj2 = ref.get(); - if(obj2 != null) { + if (obj2 != null) { double prevLast = last; last = f.applyAsDouble(obj2); count.getCurrent().add(last - prevLast); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepFunctionTimer.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepFunctionTimer.java index 9a8d590a7e..5861197675 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepFunctionTimer.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepFunctionTimer.java @@ -60,7 +60,7 @@ public StepFunctionTimer(Id id, Clock clock, long stepMillis, T obj, ToLongFunct */ public double count() { T obj2 = ref.get(); - if(obj2 != null) { + if (obj2 != null) { long prevLast = lastCount; lastCount = countFunction.applyAsLong(obj2); count.getCurrent().add(lastCount - prevLast); @@ -73,7 +73,7 @@ public double count() { */ public double totalTime(TimeUnit unit) { T obj2 = ref.get(); - if(obj2 != null) { + if (obj2 != null) { double prevLast = lastTime; lastTime = TimeUtils.convert(totalTimeFunction.applyAsDouble(obj2), totalTimeFunctionUnits, unit); total.getCurrent().add(lastTime - prevLast); diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepLong.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepLong.java index 2b3c49ef16..fc01c755f2 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepLong.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepLong.java @@ -23,11 +23,9 @@ public class StepLong { private final Clock clock; private final long stepMillis; - - private volatile double previous = 0.0; private final LongAdder current = new LongAdder(); - private final AtomicLong lastInitPos; + private volatile double previous = 0.0; public StepLong(Clock clock, long stepMillis) { this.clock = clock; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepMeterRegistry.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepMeterRegistry.java index 99b0b53191..fcfbc236cd 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepMeterRegistry.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/step/StepMeterRegistry.java @@ -37,7 +37,8 @@ */ public abstract class StepMeterRegistry extends MeterRegistry { private final StepRegistryConfig config; - @Nullable private ScheduledFuture publisher; + @Nullable + private ScheduledFuture publisher; public StepMeterRegistry(StepRegistryConfig config, Clock clock) { super(clock); @@ -49,7 +50,7 @@ public void start() { } public void start(ThreadFactory threadFactory) { - if(publisher != null) + if (publisher != null) stop(); publisher = Executors.newSingleThreadScheduledExecutor(threadFactory) @@ -57,7 +58,7 @@ public void start(ThreadFactory threadFactory) { } public void stop() { - if(publisher != null) { + if (publisher != null) { publisher.cancel(false); publisher = null; } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/HierarchicalNameMapper.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/HierarchicalNameMapper.java index cd681b2efa..9efadd3ac7 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/HierarchicalNameMapper.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/HierarchicalNameMapper.java @@ -33,7 +33,7 @@ public interface HierarchicalNameMapper { HierarchicalNameMapper DEFAULT = (id, convention) -> { String tags = ""; - if(id.getTags().iterator().hasNext()) { + if (id.getTags().iterator().hasNext()) { tags = "." + id.getConventionTags(convention).stream() .map(t -> t.getKey() + "." + t.getValue()) .map(nameSegment -> nameSegment.replace(" ", "_")) diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MathUtils.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MathUtils.java index 392f20d8c6..b3efd9b6fb 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MathUtils.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MathUtils.java @@ -22,6 +22,9 @@ */ public final class MathUtils { + private MathUtils() { + } + /** * Simplified {@link com.google.common.math.IntMath#divide(int, int, java.math.RoundingMode)}. */ @@ -48,7 +51,4 @@ public static int divideWithCeilingRoundingMode(int p, int q) { return increment ? div + signum : div; } - private MathUtils() { - } - } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MeterEquivalence.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MeterEquivalence.java index a50cb4b15f..86c2b9effd 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MeterEquivalence.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MeterEquivalence.java @@ -22,9 +22,10 @@ * @author Jon Schneider */ public final class MeterEquivalence { - private MeterEquivalence() {} + private MeterEquivalence() { + } - public static boolean equals(@Nullable Meter m1,@Nullable Object o) { + public static boolean equals(@Nullable Meter m1, @Nullable Object o) { if (m1 == null && o != null) return false; if (o == null && m1 != null) return false; if (!(o instanceof Meter)) return false; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MeterPartition.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MeterPartition.java index 4d0b14196a..3c7b31f363 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MeterPartition.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/MeterPartition.java @@ -37,6 +37,10 @@ public MeterPartition(MeterRegistry registry, int partitionSize) { this.partitionCount = MathUtils.divideWithCeilingRoundingMode(list.size(), partitionSize); } + public static List> partition(MeterRegistry registry, int partitionSize) { + return new MeterPartition(registry, partitionSize); + } + @Override public List get(int index) { int start = index * partitionSize; @@ -53,8 +57,4 @@ public int size() { public boolean isEmpty() { return list.isEmpty(); } - - public static List> partition(MeterRegistry registry, int partitionSize) { - return new MeterPartition(registry, partitionSize); - } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/TimeDecayingMax.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/TimeDecayingMax.java index ee6f46d31e..36aad25b04 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/TimeDecayingMax.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/TimeDecayingMax.java @@ -25,17 +25,15 @@ @Incubating(since = "1.0.0-rc.6") public class TimeDecayingMax { - private final Clock clock; - private AtomicLong[] ringBuffer; - @SuppressWarnings("rawtypes") private static final AtomicIntegerFieldUpdater rotatingUpdater = AtomicIntegerFieldUpdater.newUpdater(TimeDecayingMax.class, "rotating"); - + private final Clock clock; private final long durationBetweenRotatesMillis; + private AtomicLong[] ringBuffer; private int currentBucket; private volatile long lastRotateTimestampMillis; - @SuppressWarnings({ "unused", "FieldCanBeLocal" }) + @SuppressWarnings({"unused", "FieldCanBeLocal"}) private volatile int rotating = 0; // 0 - not rotating, 1 - rotating @SuppressWarnings("ConstantConditions") @@ -50,7 +48,7 @@ public TimeDecayingMax(Clock clock, long rotateFrequencyMillis, int bufferLength this.currentBucket = 0; this.ringBuffer = new AtomicLong[bufferLength]; - for(int i = 0; i < bufferLength; i++) { + for (int i = 0; i < bufferLength; i++) { this.ringBuffer[i] = new AtomicLong(); } } @@ -86,13 +84,13 @@ public double poll() { public void record(double sample) { rotate(); long sampleLong = Double.doubleToLongBits(sample); - for(AtomicLong max: ringBuffer) { + for (AtomicLong max : ringBuffer) { updateMax(max, sampleLong); } } private void updateMax(AtomicLong max, long sample) { - for(;;) { + for (; ; ) { long curMax = max.get(); if (curMax >= sample || max.compareAndSet(curMax, sample)) break; diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/TimeUtils.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/TimeUtils.java index fb690d52a4..3eb03b3a5b 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/util/TimeUtils.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/util/TimeUtils.java @@ -27,10 +27,19 @@ * @author Jon Schneider */ public final class TimeUtils { - private TimeUtils() {} + private static final long C0 = 1L; + private static final long C1 = C0 * 1000L; + private static final long C2 = C1 * 1000L; + private static final long C3 = C2 * 1000L; + private static final long C4 = C3 * 60L; + private static final long C5 = C4 * 60L; + private static final long C6 = C5 * 24L; + + private TimeUtils() { + } public static double convert(double t, TimeUnit sourceUnit, TimeUnit destinationUnit) { - switch(sourceUnit) { + switch (sourceUnit) { case NANOSECONDS: return nanosToUnit(t, destinationUnit); case MICROSECONDS: @@ -189,29 +198,21 @@ public static double daysToUnit(double days, TimeUnit destinationUnit) { } } - private static final long C0 = 1L; - private static final long C1 = C0 * 1000L; - private static final long C2 = C1 * 1000L; - private static final long C3 = C2 * 1000L; - private static final long C4 = C3 * 60L; - private static final long C5 = C4 * 60L; - private static final long C6 = C5 * 24L; - - public static Duration simpleParse(String time){ - String timeLower = time.toLowerCase().replaceAll("[,_ ]",""); - if(timeLower.endsWith("ns")) { - return Duration.ofNanos(Long.parseLong(timeLower.substring(0,timeLower.length()-2))); - } else if(timeLower.endsWith("ms")) { - return Duration.ofMillis(Long.parseLong(timeLower.substring(0,timeLower.length()-2))); - } else if(timeLower.endsWith("s")) { - return Duration.ofSeconds(Long.parseLong(timeLower.substring(0,timeLower.length()-1))); - } else if(timeLower.endsWith("m")) { - return Duration.ofMinutes(Long.parseLong(timeLower.substring(0,timeLower.length()-1))); - } else if(timeLower.endsWith("h")) { - return Duration.ofHours(Long.parseLong(timeLower.substring(0,timeLower.length()-1))); - } else if(timeLower.endsWith("d")) { - return Duration.of(Long.parseLong(timeLower.substring(0,timeLower.length()-1)), ChronoUnit.DAYS); + public static Duration simpleParse(String time) { + String timeLower = time.toLowerCase().replaceAll("[,_ ]", ""); + if (timeLower.endsWith("ns")) { + return Duration.ofNanos(Long.parseLong(timeLower.substring(0, timeLower.length() - 2))); + } else if (timeLower.endsWith("ms")) { + return Duration.ofMillis(Long.parseLong(timeLower.substring(0, timeLower.length() - 2))); + } else if (timeLower.endsWith("s")) { + return Duration.ofSeconds(Long.parseLong(timeLower.substring(0, timeLower.length() - 1))); + } else if (timeLower.endsWith("m")) { + return Duration.ofMinutes(Long.parseLong(timeLower.substring(0, timeLower.length() - 1))); + } else if (timeLower.endsWith("h")) { + return Duration.ofHours(Long.parseLong(timeLower.substring(0, timeLower.length() - 1))); + } else if (timeLower.endsWith("d")) { + return Duration.of(Long.parseLong(timeLower.substring(0, timeLower.length() - 1)), ChronoUnit.DAYS); } - throw new DateTimeParseException("Unable to parse "+time+" into duration", timeLower, 0); + throw new DateTimeParseException("Unable to parse " + time + " into duration", timeLower, 0); } } diff --git a/micrometer-core/src/main/java/io/micrometer/core/lang/NonNullFields.java b/micrometer-core/src/main/java/io/micrometer/core/lang/NonNullFields.java index 482406289f..1e4e6d40be 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/lang/NonNullFields.java +++ b/micrometer-core/src/main/java/io/micrometer/core/lang/NonNullFields.java @@ -15,21 +15,17 @@ */ package io.micrometer.core.lang; -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; import javax.annotation.Nonnull; import javax.annotation.meta.TypeQualifierDefault; +import java.lang.annotation.*; /** * A common annotation to declare that fields are to be considered as * non-nullable by default for a given package. - * + *

*

Leverages JSR-305 meta-annotations to indicate nullability in Java to common * tools with JSR-305 support and used by Kotlin to infer nullability of the API. - * + *

*

Should be used at package level in association with {@link Nullable} * annotations at field level. * diff --git a/micrometer-core/src/test/java/io/micrometer/core/Issue.java b/micrometer-core/src/test/java/io/micrometer/core/Issue.java index a225e6a549..ae364c7416 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/Issue.java +++ b/micrometer-core/src/test/java/io/micrometer/core/Issue.java @@ -25,7 +25,7 @@ * * @author Jon Schneider */ -@Target({ ElementType.TYPE, ElementType.METHOD }) +@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.SOURCE) public @interface Issue { String value(); diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterFilterTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterFilterTest.java index 4983149de3..3820bb8e6a 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterFilterTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterFilterTest.java @@ -32,6 +32,17 @@ * @author Jon Schneider */ class MeterFilterTest { + private static Condition tag(String tagKey) { + return tag(tagKey, null); + } + + private static Condition tag(String tagKey, @Nullable String tagValue) { + return new Condition<>( + id -> stream(id.getTags().spliterator(), false) + .anyMatch(t -> t.getKey().equals(tagKey) && (tagValue == null || t.getValue().equals(tagValue))), + "Must have a tag with key '" + tagKey + "'"); + } + @Test void commonTags() { MeterFilter filter = MeterFilter.commonTags(Tags.zip("k2", "v2")); @@ -113,15 +124,4 @@ public MeterFilterReply accept(Meter.Id id) { assertThat(n.get()).isEqualTo(1); } - - private static Condition tag(String tagKey) { - return tag(tagKey, null); - } - - private static Condition tag(String tagKey, @Nullable String tagValue) { - return new Condition<>( - id -> stream(id.getTags().spliterator(), false) - .anyMatch(t -> t.getKey().equals(tagKey) && (tagValue == null || t.getValue().equals(tagValue))), - "Must have a tag with key '" + tagKey + "'"); - } } diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterRegistryInjectionTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterRegistryInjectionTest.java index e66236bbc9..590e4126c7 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterRegistryInjectionTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterRegistryInjectionTest.java @@ -118,6 +118,10 @@ class MyComponent { @Nullable Counter counter; + @Inject + MyComponent() { + } + @PostConstruct void after() { counter = requireNonNull(registry).counter("feature.counter"); @@ -132,8 +136,4 @@ void notPerformanceCriticalFeature() { // the retrieval of the counter Metrics.counter("infrequent.counter").increment(); } - - @Inject - MyComponent() { - } } diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterRegistryTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterRegistryTest.java index c593ddc6b8..d6b449e17c 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterRegistryTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/MeterRegistryTest.java @@ -72,7 +72,7 @@ public HistogramConfig configure(Meter.Id mappedId, HistogramConfig config) { .merge(config); } }); - + registry.timer("my.timer"); } } diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/CaffeineCacheMetricsTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/CaffeineCacheMetricsTest.java index 4518179903..8c68d53a5c 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/CaffeineCacheMetricsTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/CaffeineCacheMetricsTest.java @@ -35,7 +35,7 @@ class CaffeineCacheMetricsTest { private Iterable userTags = Tags.zip("userTagKey", "userTagValue"); @Test - void cacheExposesMetricsForHitMissAndEviction() throws Exception { + void cacheExposesMetricsForHitMissAndEviction() { // Run cleanup in same thread, to remove async behavior with evictions Cache cache = Caffeine.newBuilder().maximumSize(2).recordStats().executor(Runnable::run).build(); CaffeineCacheMetrics.monitor(registry, cache, "c", userTags); @@ -57,7 +57,7 @@ void cacheExposesMetricsForHitMissAndEviction() throws Exception { @SuppressWarnings("unchecked") @Test - void loadingCacheExposesMetricsForLoadsAndExceptions() throws Exception { + void loadingCacheExposesMetricsForLoadsAndExceptions() { LoadingCache cache = CaffeineCacheMetrics.monitor(registry, Caffeine.newBuilder() .recordStats() .build(key -> { diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/HazelcastCacheMetricsTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/HazelcastCacheMetricsTest.java index 00d211faae..9006def9fb 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/HazelcastCacheMetricsTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/HazelcastCacheMetricsTest.java @@ -32,13 +32,13 @@ class HazelcastCacheMetricsTest { private HazelcastInstance h; @BeforeEach - void setup(){ + void setup() { Config config = new Config(); h = Hazelcast.newHazelcastInstance(config); } @AfterEach - void cleanup(){ + void cleanup() { h.shutdown(); } @@ -47,7 +47,7 @@ void cacheMetrics() { IMap map = h.getMap("my-distributed-map"); SimpleMeterRegistry registry = new SimpleMeterRegistry(); - HazelcastCacheMetrics.monitor(registry, map, "cache",emptyList()); + HazelcastCacheMetrics.monitor(registry, map, "cache", emptyList()); map.put("key", "value"); map.get("key"); diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/JCacheMetricsTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/JCacheMetricsTest.java index 5865b98b1e..c592478096 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/JCacheMetricsTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/cache/JCacheMetricsTest.java @@ -37,6 +37,13 @@ * @author Jon Schneider */ class JCacheMetricsTest { + private static Stream cachingProviders() { + return Stream.of( + new RICachingProvider(), + new EhcacheCachingProvider() + ); + } + @ParameterizedTest @MethodSource("cachingProviders") void cacheExposesMetrics(CachingProvider provider) { @@ -55,11 +62,4 @@ void cacheExposesMetrics(CachingProvider provider) { assertThat(registry.mustFind("jcache.puts").tags("name", "a").gauge().value()).isEqualTo(1.0); } - - private static Stream cachingProviders() { - return Stream.of( - new RICachingProvider(), - new EhcacheCachingProvider() - ); - } } diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/db/DatabaseTableMetricsTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/db/DatabaseTableMetricsTest.java index f5428dcfc8..b662cfd77b 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/db/DatabaseTableMetricsTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/db/DatabaseTableMetricsTest.java @@ -41,7 +41,7 @@ void setup() throws SQLException { ds = new JDBCDataSource(); ds.setURL("jdbc:hsqldb:mem:test"); - try(Connection conn = ds.getConnection()) { + try (Connection conn = ds.getConnection()) { conn.prepareStatement("CREATE TABLE foo (id int)").execute(); conn.prepareStatement("INSERT INTO foo VALUES (1)").executeUpdate(); } @@ -49,7 +49,7 @@ void setup() throws SQLException { @AfterEach void shutdown() throws SQLException { - try(Connection conn = ds.getConnection()) { + try (Connection conn = ds.getConnection()) { conn.prepareStatement("SHUTDOWN").execute(); } } diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/hystrix/MicrometerMetricsPublisherCommandTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/hystrix/MicrometerMetricsPublisherCommandTest.java index bf0c50f831..9494d94bf6 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/hystrix/MicrometerMetricsPublisherCommandTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/hystrix/MicrometerMetricsPublisherCommandTest.java @@ -82,7 +82,7 @@ private void assertExecutionMetric(SimpleMeterRegistry registry, String eventTyp .functionCounter() .count() == count) .blockLast(Duration.ofSeconds(30)); - } catch(RuntimeException e) { + } catch (RuntimeException e) { assertThat(registry.mustFind("hystrix.execution").tags("event", eventType) .functionCounter() .count()).isEqualTo(count); @@ -91,7 +91,7 @@ private void assertExecutionMetric(SimpleMeterRegistry registry, String eventTyp @Disabled @Test - void testOpenCircuit() throws Exception { + void testOpenCircuit() { HystrixCommandKey key = HystrixCommandKey.Factory.asKey("MicrometerCOMMAND-B"); HystrixCommandProperties properties = new HystrixPropertiesCommandDefault(key, propertiesSetter.withCircuitBreakerForceOpen(true)); HystrixCommandMetrics metrics = HystrixCommandMetrics.getInstance(key, groupKey, properties); diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/jetty/JettyStatisticsMetricsTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/jetty/JettyStatisticsMetricsTest.java index 9dc6151ad8..689bb6a55c 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/jetty/JettyStatisticsMetricsTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/jetty/JettyStatisticsMetricsTest.java @@ -29,7 +29,6 @@ import javax.servlet.ServletException; import java.io.IOException; -import java.sql.SQLException; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -40,7 +39,7 @@ class JettyStatisticsMetricsTest { private StatisticsHandler handler; @BeforeEach - void setup() throws SQLException { + void setup() { this.registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock()); this.handler = new StatisticsHandler(); JettyStatisticsMetrics.monitor(registry, handler); @@ -49,7 +48,8 @@ void setup() throws SQLException { @Test void stats() throws IOException, ServletException { Request baseReq = mock(Request.class); - HttpChannelState s = new HttpChannelState(null){}; + HttpChannelState s = new HttpChannelState(null) { + }; when(baseReq.getHttpChannelState()).thenReturn(s); Response resp = mock(Response.class); when(baseReq.getResponse()).thenReturn(resp); diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/jpa/HibernateMetricsTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/jpa/HibernateMetricsTest.java index 5771600c53..6d954ad6be 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/jpa/HibernateMetricsTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/jpa/HibernateMetricsTest.java @@ -26,7 +26,6 @@ import org.mockito.Mockito; import javax.persistence.EntityManagerFactory; -import java.sql.SQLException; import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; @@ -39,8 +38,22 @@ class HibernateMetricsTest { private MeterRegistry registry; + private static EntityManagerFactory createEntityManagerFactoryMock(final boolean statsEnabled) { + EntityManagerFactory emf = Mockito.mock(EntityManagerFactory.class); + SessionFactory sf = Mockito.mock(SessionFactory.class); + Statistics stats = Mockito.mock(Statistics.class, invocation -> { + if (invocation.getMethod().getName().equals("isStatisticsEnabled")) { + return statsEnabled; + } + return 42L; + }); + when(emf.unwrap(SessionFactory.class)).thenReturn(sf); + when(sf.getStatistics()).thenReturn(stats); + return emf; + } + @BeforeEach - void setup() throws SQLException { + void setup() { registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock()); } @@ -100,18 +113,4 @@ void shouldNotExposeMetricsWhenStatsNotEnabled() { assertThat(registry.find("hibernate.sessions.open").gauge()).isNull(); } - private static EntityManagerFactory createEntityManagerFactoryMock(final boolean statsEnabled) { - EntityManagerFactory emf = Mockito.mock(EntityManagerFactory.class); - SessionFactory sf = Mockito.mock(SessionFactory.class); - Statistics stats = Mockito.mock(Statistics.class, invocation -> { - if (invocation.getMethod().getName().equals("isStatisticsEnabled")) { - return statsEnabled; - } - return 42L; - }); - when(emf.unwrap(SessionFactory.class)).thenReturn(sf); - when(sf.getStatistics()).thenReturn(stats); - return emf; - } - } diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/okhttp3/OkHttpMetricsEventListenerTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/okhttp3/OkHttpMetricsEventListenerTest.java index e9fd965330..433f68d86e 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/okhttp3/OkHttpMetricsEventListenerTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/okhttp3/OkHttpMetricsEventListenerTest.java @@ -60,7 +60,7 @@ void timeNotFound() { try { client.newCall(request).execute().close(); - } catch(IOException ignore) { + } catch (IOException ignore) { // expected } @@ -85,7 +85,7 @@ void timeFailureDueToTimeout() { try { client.newCall(request).execute().close(); - } catch(IOException ignored) { + } catch (IOException ignored) { // expected } diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/system/FileDescriptorMetricsTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/system/FileDescriptorMetricsTest.java index 43948459d7..0253029c9f 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/system/FileDescriptorMetricsTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/system/FileDescriptorMetricsTest.java @@ -37,11 +37,6 @@ class FileDescriptorMetricsTest { private MeterRegistry registry = new SimpleMeterRegistry(); - private interface HotSpotLikeOperatingSystemMXBean extends OperatingSystemMXBean { - long getOpenFileDescriptorCount(); - long getMaxFileDescriptorCount(); - } - @Test @SuppressWarnings("restriction") void fileDescriptorMetricsRuntime() { @@ -91,4 +86,10 @@ void fileDescriptorMetricsInvocationException() { assertThat(registry.mustFind("process.max.fds").tags("some", "tag") .gauge().value()).isEqualTo(Double.NaN); } + + private interface HotSpotLikeOperatingSystemMXBean extends OperatingSystemMXBean { + long getOpenFileDescriptorCount(); + + long getMaxFileDescriptorCount(); + } } diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/tomcat/TomcatMetricsTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/tomcat/TomcatMetricsTest.java index 6236ea0bb8..7ec7230935 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/tomcat/TomcatMetricsTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/tomcat/TomcatMetricsTest.java @@ -30,7 +30,6 @@ import org.apache.catalina.startup.Tomcat; import org.junit.jupiter.api.Test; -import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -50,11 +49,11 @@ void managerBasedMetrics() { ManagerBase manager = new ManagerBase() { @Override - public void load() throws ClassNotFoundException, IOException { + public void load() { } @Override - public void unload() throws IOException { + public void unload() { } @Override @@ -98,7 +97,7 @@ void mbeansAvailableAfterBinder() throws LifecycleException, InterruptedExceptio CountDownLatch latch = new CountDownLatch(1); registry.config().onMeterAdded(m -> { - if(m.getId().getName().equals("tomcat.global.received")) + if (m.getId().getName().equals("tomcat.global.received")) latch.countDown(); }); diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/composite/CompositeMeterRegistryTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/composite/CompositeMeterRegistryTest.java index 5afbc8745f..2d21349492 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/composite/CompositeMeterRegistryTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/composite/CompositeMeterRegistryTest.java @@ -204,7 +204,7 @@ void histogramConfigDefaultIsNotAffectedByComposite() { } @Test - void compositePauseDetectorConfigOverridesChild() throws InterruptedException { + void compositePauseDetectorConfigOverridesChild() { composite.add(simple); CountDownLatch count = new CountDownLatch(1); diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/config/PropertyMeterFilterTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/config/PropertyMeterFilterTest.java index a905a52938..7cd9dd6868 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/config/PropertyMeterFilterTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/config/PropertyMeterFilterTest.java @@ -50,7 +50,8 @@ public V get(String k, Class vClass) { } }; - @Nullable private HistogramConfig histogramConfig; + @Nullable + private HistogramConfig histogramConfig; private MeterRegistry registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock()) { @Override diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/histogram/TimeWindowLatencyHistogramTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/histogram/TimeWindowLatencyHistogramTest.java index afa57ed4df..a0ceded7ec 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/histogram/TimeWindowLatencyHistogramTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/histogram/TimeWindowLatencyHistogramTest.java @@ -69,7 +69,7 @@ void recordValuesThatExceedTheDynamicRange() { void percentiles() { TimeWindowLatencyHistogram histogram = new TimeWindowLatencyHistogram(new MockClock(), HistogramConfig.DEFAULT, noPause); - for(int i = 1; i <= 10; i++) { + for (int i = 1; i <= 10; i++) { histogram.recordLong((long) millisToUnit(i, TimeUnit.NANOSECONDS)); } @@ -88,14 +88,14 @@ void percentilesWithNoSamples() { void percentilesChangeWithMoreRecentSamples() { TimeWindowLatencyHistogram histogram = new TimeWindowLatencyHistogram(new MockClock(), HistogramConfig.DEFAULT, noPause); - for(int i = 1; i <= 10; i++) { + for (int i = 1; i <= 10; i++) { histogram.recordLong((long) millisToUnit(i, TimeUnit.NANOSECONDS)); } // baseline median assertThat(nanosToUnit(histogram.percentile(0.50), TimeUnit.MILLISECONDS)).isEqualTo(5, Offset.offset(0.1)); - for(int i = 11; i <= 20; i++) { + for (int i = 11; i <= 20; i++) { histogram.recordLong((long) millisToUnit(i, TimeUnit.NANOSECONDS)); } diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/histogram/TimeWindowRotationTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/histogram/TimeWindowRotationTest.java index 738b35347d..6a64af46b5 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/histogram/TimeWindowRotationTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/histogram/TimeWindowRotationTest.java @@ -15,87 +15,92 @@ */ package io.micrometer.core.instrument.histogram; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import io.micrometer.core.instrument.Clock; +import io.micrometer.core.instrument.MockClock; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.time.Duration; import java.util.Arrays; import java.util.Collection; import java.util.concurrent.TimeUnit; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import io.micrometer.core.instrument.Clock; -import io.micrometer.core.instrument.MockClock; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class TimeWindowRotationTest { private static final HistogramConfig histogramConfig = - HistogramConfig.builder() - .percentiles(0.0, 0.5, 0.75, 0.9, 0.99, 0.999, 1.0) - .histogramExpiry(Duration.ofSeconds(4)) - .histogramBufferLength(4) - .build() - .merge(HistogramConfig.DEFAULT); + HistogramConfig.builder() + .percentiles(0.0, 0.5, 0.75, 0.9, 0.99, 0.999, 1.0) + .histogramExpiry(Duration.ofSeconds(4)) + .histogramBufferLength(4) + .build() + .merge(HistogramConfig.DEFAULT); static Collection>> histogramTypes() { return Arrays.asList(TimeWindowHistogram.class, TimeWindowLatencyHistogram.class); } + private static void expectValidationFailure(Class> histogramType, + HistogramConfig badConfig) { + assertThatThrownBy(() -> newHistogram(histogramType, new MockClock(), badConfig.merge(HistogramConfig.DEFAULT))) + .hasRootCauseExactlyInstanceOf(IllegalStateException.class) + .satisfies(cause -> assertThat(cause.getCause()).hasMessageStartingWith("Invalid HistogramConfig:")); + } + + private static TimeWindowHistogramBase newHistogram( + Class> histogramType, + MockClock clock, HistogramConfig config) throws Exception { + return histogramType.getDeclaredConstructor(Clock.class, HistogramConfig.class).newInstance(clock, config); + } + @ParameterizedTest @MethodSource("histogramTypes") - void percentilesValidation(Class> histogramType) throws Exception { + void percentilesValidation(Class> histogramType) { expectValidationFailure(histogramType, HistogramConfig.builder() - .percentiles(-0.01) - .build()); + .percentiles(-0.01) + .build()); expectValidationFailure(histogramType, HistogramConfig.builder() - .percentiles(1.01) - .build()); + .percentiles(1.01) + .build()); } @ParameterizedTest @MethodSource("histogramTypes") - void expectedValueRangeValidation(Class> histogramType) throws Exception { + void expectedValueRangeValidation(Class> histogramType) { expectValidationFailure(histogramType, HistogramConfig.builder() - .minimumExpectedValue(0L) - .build()); + .minimumExpectedValue(0L) + .build()); expectValidationFailure(histogramType, HistogramConfig.builder() - .minimumExpectedValue(10L) - .maximumExpectedValue(9L) - .build()); + .minimumExpectedValue(10L) + .maximumExpectedValue(9L) + .build()); } @ParameterizedTest @MethodSource("histogramTypes") - void slaBoundariesValidation(Class> histogramType) throws Exception { + void slaBoundariesValidation(Class> histogramType) { expectValidationFailure(histogramType, HistogramConfig.builder() - .sla(0L) - .build()); + .sla(0L) + .build()); } @ParameterizedTest @MethodSource("histogramTypes") - void bufferLengthValidation(Class> histogramType) throws Exception { + void bufferLengthValidation(Class> histogramType) { expectValidationFailure(histogramType, HistogramConfig.builder() - .histogramBufferLength(-1) - .build()); + .histogramBufferLength(-1) + .build()); } @ParameterizedTest @MethodSource("histogramTypes") - void rotationIntervalValidation(Class> histogramType) throws Exception { + void rotationIntervalValidation(Class> histogramType) { expectValidationFailure(histogramType, HistogramConfig.builder() - .histogramExpiry(Duration.ofMillis(9)) - .histogramBufferLength(10) - .build()); - } - - private static void expectValidationFailure(Class> histogramType, - HistogramConfig badConfig) { - assertThatThrownBy(() -> newHistogram(histogramType, new MockClock(), badConfig.merge(HistogramConfig.DEFAULT))) - .hasRootCauseExactlyInstanceOf(IllegalStateException.class) - .satisfies(cause -> assertThat(cause.getCause()).hasMessageStartingWith("Invalid HistogramConfig:")); + .histogramExpiry(Duration.ofMillis(9)) + .histogramBufferLength(10) + .build()); } @ParameterizedTest @@ -163,10 +168,4 @@ void timeBasedSlidingWindow(Class> histo assertThat(q.percentile(0.0)).isZero(); assertThat(q.percentile(1.0)).isZero(); } - - private static TimeWindowHistogramBase newHistogram( - Class> histogramType, - MockClock clock, HistogramConfig config) throws Exception { - return histogramType.getDeclaredConstructor(Clock.class, HistogramConfig.class).newInstance(clock, config); - } } diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/util/TimeUtilsTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/util/TimeUtilsTest.java index 4aa0b233c0..12dd033d6f 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/util/TimeUtilsTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/util/TimeUtilsTest.java @@ -21,7 +21,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; class TimeUtilsTest { @Test @@ -41,7 +40,7 @@ void simpleParseHandlesSpacesCommasAndUnderscores() { } @Test - void cantParseDecimal(){ + void cantParseDecimal() { assertThatThrownBy(() -> TimeUtils.simpleParse("1.1s")) .isInstanceOf(NumberFormatException.class); } diff --git a/micrometer-spring-legacy/build.gradle b/micrometer-spring-legacy/build.gradle index 53f90c625a..0ff86d650c 100644 --- a/micrometer-spring-legacy/build.gradle +++ b/micrometer-spring-legacy/build.gradle @@ -1,5 +1,6 @@ plugins { id "io.spring.dependency-management" version "1.0.3.RELEASE" + id "net.ltgt.apt-eclipse" version "0.13" } apply plugin: 'nebula.optional-base' @@ -43,6 +44,7 @@ dependencies { // to validate auto-completion on configuration properties compileOnly 'org.springframework.boot:spring-boot-configuration-processor' + apt 'org.springframework.boot:spring-boot-configuration-processor' testCompile 'org.springframework.boot:spring-boot-starter-web' testCompile 'org.springframework.boot:spring-boot-actuator' diff --git a/micrometer-spring-legacy/src/main/java/io/micrometer/spring/PropertiesMeterFilter.java b/micrometer-spring-legacy/src/main/java/io/micrometer/spring/PropertiesMeterFilter.java new file mode 100644 index 0000000000..8c3ff37078 --- /dev/null +++ b/micrometer-spring-legacy/src/main/java/io/micrometer/spring/PropertiesMeterFilter.java @@ -0,0 +1,133 @@ +/** + * Copyright 2017 Pivotal Software, Inc. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micrometer.spring; + +import io.micrometer.core.instrument.Meter; +import io.micrometer.core.instrument.config.MeterFilter; +import io.micrometer.core.instrument.config.MeterFilterReply; +import io.micrometer.core.instrument.histogram.HistogramConfig; +import io.micrometer.core.lang.NonNullApi; +import io.micrometer.core.lang.Nullable; +import io.micrometer.spring.autoconfigure.MetricsProperties; + +import java.time.Duration; +import java.util.function.Function; + +@NonNullApi +public class PropertiesMeterFilter implements MeterFilter { + private final MetricsProperties props; + + public PropertiesMeterFilter(MetricsProperties props) { + this.props = props; + } + + @Override + public MeterFilterReply accept(Meter.Id id) { + Boolean enabled = getMostSpecific(name -> props.getEnabled().get(name), id.getName()); + if (enabled != null && !enabled) + return MeterFilterReply.DENY; + return MeterFilterReply.NEUTRAL; + } + + @Nullable + private V getMostSpecific(Function lookup, String k) { + V v = lookup.apply(k.isEmpty() ? "" : k); + if (v != null) + return v; + else if (k.isEmpty() || k.equals("all")) { + return null; + } + + int lastSep = k.lastIndexOf('.'); + if (lastSep == -1) + return getMostSpecific(lookup, "all"); + + return getMostSpecific(lookup, k.substring(0, lastSep)); + } + + @Override + public HistogramConfig configure(Meter.Id id, HistogramConfig config) { + if (!id.getType().equals(Meter.Type.Timer) && !id.getType().equals(Meter.Type.DistributionSummary)) + return config; + + HistogramConfig.Builder builder = HistogramConfig.builder(); + + Boolean percentileHistogram = getMostSpecific( + name -> props.getSummaries().getPercentileHistogram().getOrDefault(name, props.getTimers().getPercentileHistogram().get(name)), + id.getName()); + if (percentileHistogram != null) + builder.percentilesHistogram(percentileHistogram); + + double[] percentiles = getMostSpecific( + name -> props.getSummaries().getPercentiles().getOrDefault(name, props.getTimers().getPercentiles().get(name)), + id.getName()); + + if (percentiles != null) { + builder.percentiles(percentiles); + } + + Integer histogramBufferLength = getMostSpecific( + name -> props.getSummaries().getHistogramBufferLength().getOrDefault(name, props.getTimers().getHistogramBufferLength().get(name)), + id.getName()); + if (histogramBufferLength != null) { + builder.histogramBufferLength(histogramBufferLength); + } + + Duration histogramExpiry = getMostSpecific( + name -> props.getSummaries().getHistogramExpiry().getOrDefault(name, props.getTimers().getHistogramExpiry().get(name)), + id.getName()); + if (histogramExpiry != null) { + builder.histogramExpiry(histogramExpiry); + } + + if (id.getType().equals(Meter.Type.Timer)) { + Duration max = getMostSpecific(name -> props.getTimers().getMaximumExpectedValue().get(name), id.getName()); + if (max != null) { + builder.maximumExpectedValue(max.toNanos()); + } + + Duration min = getMostSpecific(name -> props.getTimers().getMinimumExpectedValue().get(name), id.getName()); + if (min != null) { + builder.minimumExpectedValue(min.toNanos()); + } + + Duration[] sla = getMostSpecific(name -> props.getTimers().getSla().get(name), id.getName()); + if (sla != null) { + long[] slaNanos = new long[sla.length]; + for (int i = 0; i < sla.length; i++) { + slaNanos[i] = sla[i].toNanos(); + } + builder.sla(slaNanos); + } + } else if (id.getType().equals(Meter.Type.DistributionSummary)) { + Long max = getMostSpecific(name -> props.getSummaries().getMaximumExpectedValue().get(name), id.getName()); + if (max != null) { + builder.maximumExpectedValue(max); + } + + Long min = getMostSpecific(name -> props.getSummaries().getMinimumExpectedValue().get(name), id.getName()); + if (min != null) { + builder.minimumExpectedValue(min); + } + + long[] sla = getMostSpecific(name -> props.getSummaries().getSla().get(name), id.getName()); + if (sla != null) + builder.sla(sla); + } + + return builder.build().merge(config); + } +} diff --git a/micrometer-spring-legacy/src/main/java/io/micrometer/spring/SpringEnvironmentMeterFilter.java b/micrometer-spring-legacy/src/main/java/io/micrometer/spring/SpringEnvironmentMeterFilter.java deleted file mode 100644 index 6d4bb7dcfc..0000000000 --- a/micrometer-spring-legacy/src/main/java/io/micrometer/spring/SpringEnvironmentMeterFilter.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright 2017 Pivotal Software, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.micrometer.spring; - -import io.micrometer.core.instrument.config.PropertyMeterFilter; -import io.micrometer.core.lang.NonNullApi; -import io.micrometer.core.lang.NonNullFields; -import io.micrometer.core.lang.Nullable; -import io.micrometer.spring.autoconfigure.export.StringToDurationConverter; -import org.springframework.core.convert.ConversionFailedException; -import org.springframework.core.convert.support.DefaultConversionService; -import org.springframework.core.env.Environment; - -/** - * @author Jon Schneider - */ -@NonNullApi -@NonNullFields -public class SpringEnvironmentMeterFilter extends PropertyMeterFilter { - private final Environment environment; - private final DefaultConversionService conversionService = new DefaultConversionService(); - - public SpringEnvironmentMeterFilter(Environment environment) { - this.environment = environment; - this.conversionService.addConverter(new StringToDurationConverter()); - } - - @Override - @Nullable - public V get(String k, Class vClass) { - if (conversionService.canConvert(String.class, vClass)) { - Object val = environment.getProperty("management.metrics.filter." + k); - try { - return conversionService.convert(val, vClass); - } catch (ConversionFailedException e) { - throw new ConfigurationException("Invalid configuration for '" + k + "' value '" + val + "' as " + vClass, e); - } - } - return null; - } -} - -class ConfigurationException extends RuntimeException { - ConfigurationException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/MetricsAutoConfiguration.java b/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/MetricsAutoConfiguration.java index 512232b15a..b5d8a0b1d6 100644 --- a/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/MetricsAutoConfiguration.java +++ b/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/MetricsAutoConfiguration.java @@ -18,7 +18,8 @@ import io.micrometer.core.annotation.Timed; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.binder.hystrix.HystrixMetricsBinder; -import io.micrometer.spring.SpringEnvironmentMeterFilter; +import io.micrometer.core.instrument.config.MeterFilter; +import io.micrometer.spring.PropertiesMeterFilter; import io.micrometer.spring.autoconfigure.export.CompositeMeterRegistryConfiguration; import io.micrometer.spring.autoconfigure.export.atlas.AtlasExportConfiguration; import io.micrometer.spring.autoconfigure.export.datadog.DatadogExportConfiguration; @@ -47,7 +48,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.core.annotation.Order; -import org.springframework.core.env.Environment; import org.springframework.integration.config.EnableIntegrationManagement; import org.springframework.integration.support.management.IntegrationManagementConfigurer; @@ -81,8 +81,8 @@ public class MetricsAutoConfiguration { @Bean @Order(0) - MeterRegistryCustomizer springEnvironmentMeterFilter(Environment environment) { - return r -> r.config().meterFilter(new SpringEnvironmentMeterFilter(environment)); + public MeterFilter propertyBasedFilter(MetricsProperties props) { + return new PropertiesMeterFilter(props); } /** diff --git a/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/MetricsProperties.java b/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/MetricsProperties.java index 58c11cfee1..d0fd63dc5f 100644 --- a/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/MetricsProperties.java +++ b/micrometer-spring-legacy/src/main/java/io/micrometer/spring/autoconfigure/MetricsProperties.java @@ -15,8 +15,14 @@ */ package io.micrometer.spring.autoconfigure; +import io.micrometer.core.instrument.DistributionSummary; +import io.micrometer.core.instrument.Timer; import org.springframework.boot.context.properties.ConfigurationProperties; +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + /** * {@link ConfigurationProperties} for configuring Micrometer-based metrics. * @@ -26,6 +32,13 @@ public class MetricsProperties { private Web web = new Web(); + private Summaries summaries = new Summaries(); + private Timers timers = new Timers(); + + /** + * If {@code false}, the matching meter(s) are no-op. + */ + private Map enabled = new HashMap<>(); /** * Whether or not auto-configured MeterRegistry implementations should be bound to the @@ -46,6 +59,34 @@ public Web getWeb() { return this.web; } + public void setWeb(Web web) { + this.web = web; + } + + public Summaries getSummaries() { + return summaries; + } + + public void setSummaries(Summaries summaries) { + this.summaries = summaries; + } + + public Timers getTimers() { + return timers; + } + + public void setTimers(Timers timers) { + this.timers = timers; + } + + public Map getEnabled() { + return enabled; + } + + public void setEnabled(Map enabled) { + this.enabled = enabled; + } + public static class Web { private Client client = new Client(); @@ -69,7 +110,6 @@ public void setServer(Server server) { } public static class Client { - /** * Name of the metric for sent requests. */ @@ -130,4 +170,159 @@ public void setRequestsMetricName(String requestsMetricName) { } } } + + /** + * Properties common to "distribution" style meters - timers and distribution summaries. + */ + static abstract class AbstractDistributions { + /** + * Controls whether to publish a histogram structure for those monitoring systems that support + * aggregable percentile calculation based on a histogram. For other systems, this has no effect. + */ + private Map percentileHistogram = new HashMap<>(); + + /** + * The set of Micrometer-computed non-aggregable percentiles to ship to the backend. Percentiles should + * be defined in the range of (0, 1]. For example, 0.999 represents the 99.9th percentile of the distribution. + */ + private Map percentiles = new HashMap<>(); + + /** + * Statistics emanating from a distribution like max, percentiles, and histogram counts decay over time to + * give greater weight to recent samples (exception: histogram counts are cumulative for those systems that expect cumulative + * histogram buckets). Samples are accumulated to such statistics in ring buffers which rotate after + * this expiry, with a buffer length of {@link #histogramBufferLength}. + */ + private Map histogramExpiry = new HashMap<>(); + + /** + * Statistics emanating from a distribution like max, percentiles, and histogram counts decay over time to + * give greater weight to recent samples (exception: histogram counts are cumulative for those systems that expect cumulative + * histogram buckets). Samples are accumulated to such statistics in ring buffers which rotate after + * {@link #histogramExpiry}, with this buffer length. + */ + private Map histogramBufferLength = new HashMap<>(); + + public Map getPercentileHistogram() { + return percentileHistogram; + } + + public void setPercentileHistogram(Map percentileHistogram) { + this.percentileHistogram = percentileHistogram; + } + + public Map getPercentiles() { + return percentiles; + } + + public void setPercentiles(Map percentiles) { + this.percentiles = percentiles; + } + + public Map getHistogramExpiry() { + return histogramExpiry; + } + + public void setHistogramExpiry(Map histogramExpiry) { + this.histogramExpiry = histogramExpiry; + } + + public Map getHistogramBufferLength() { + return histogramBufferLength; + } + + public void setHistogramBufferLength(Map histogramBufferLength) { + this.histogramBufferLength = histogramBufferLength; + } + } + + public static class Summaries extends AbstractDistributions { + /** + * Clamps {@link DistributionSummary} to the first percentile bucket greater than + * or equal to the supplied value. Use this property to control the number of histogram buckets used + * to represent a distribution. + */ + private Map minimumExpectedValue = new HashMap<>(); + + /** + * Clamps {@link DistributionSummary} to the percentile buckets less than + * or equal to the supplied value. Use this property to control the number of histogram buckets used + * to represent a distribution. + */ + private Map maximumExpectedValue = new HashMap<>(); + + /** + * Publish a counter for each SLA boundary that counts violations of the SLA. + */ + private Map sla = new HashMap<>(); + + public Map getMinimumExpectedValue() { + return minimumExpectedValue; + } + + public void setMinimumExpectedValue(Map minimumExpectedValue) { + this.minimumExpectedValue = minimumExpectedValue; + } + + public Map getMaximumExpectedValue() { + return maximumExpectedValue; + } + + public void setMaximumExpectedValue(Map maximumExpectedValue) { + this.maximumExpectedValue = maximumExpectedValue; + } + + public Map getSla() { + return sla; + } + + public void setSla(Map sla) { + this.sla = sla; + } + } + + public static class Timers extends AbstractDistributions { + /** + * Clamps {@link Timer} to the first percentile bucket greater than + * or equal to the supplied value. Use this property to control the number of histogram buckets used + * to represent a distribution. + */ + Map minimumExpectedValue = new HashMap<>(); + + /** + * Clamps {@link Timer} to the percentile buckets less than + * or equal to the supplied value. Use this property to control the number of histogram buckets used + * to represent a distribution. + */ + Map maximumExpectedValue = new HashMap<>(); + + /** + * Publish a counter for each SLA boundary that counts violations of the SLA. + */ + Map sla = new HashMap<>(); + + public Map getMinimumExpectedValue() { + return minimumExpectedValue; + } + + public void setMinimumExpectedValue(Map minimumExpectedValue) { + this.minimumExpectedValue = minimumExpectedValue; + } + + public Map getMaximumExpectedValue() { + return maximumExpectedValue; + } + + public void setMaximumExpectedValue(Map maximumExpectedValue) { + this.maximumExpectedValue = maximumExpectedValue; + } + + public Map getSla() { + return sla; + } + + public void setSla(Map sla) { + this.sla = sla; + } + } } diff --git a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/SpringEnvironmentMeterFilterTest.java b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/SpringEnvironmentMeterFilterTest.java deleted file mode 100644 index 34c07e2872..0000000000 --- a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/SpringEnvironmentMeterFilterTest.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright 2017 Pivotal Software, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.micrometer.spring; - -import io.micrometer.core.instrument.*; -import io.micrometer.core.instrument.histogram.HistogramConfig; -import io.micrometer.core.instrument.histogram.pause.PauseDetector; -import io.micrometer.core.instrument.simple.SimpleConfig; -import io.micrometer.core.instrument.simple.SimpleMeterRegistry; -import io.micrometer.core.lang.NonNull; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import java.time.Duration; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -@RunWith(SpringRunner.class) -@TestPropertySource(properties = { - "management.metrics.filter.enabled=false", // turn off all metrics by default - "management.metrics.filter.my.timer.enabled=true", - "management.metrics.filter.my.timer.maximumExpectedValue=PT10S", - "management.metrics.filter.my.timer.minimumExpectedValue=1ms", - "management.metrics.filter.my.timer.percentiles=0.5,0.95", - "management.metrics.filter.my.timer.that.is.misconfigured.enabled=troo", - - "management.metrics.filter.my.summary.enabled=true", - "management.metrics.filter.my.summary.maximumExpectedValue=100", -}) -public class SpringEnvironmentMeterFilterTest { - private HistogramConfig histogramConfig; - - private MeterRegistry registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock()) { - @Override - protected Timer newTimer(@NonNull Meter.Id id, @NonNull HistogramConfig conf, @NonNull PauseDetector pauseDetector) { - histogramConfig = conf; - return super.newTimer(id, conf, pauseDetector); - } - - @Override - protected DistributionSummary newDistributionSummary(@NonNull Meter.Id id, @NonNull HistogramConfig conf) { - histogramConfig = conf; - return super.newDistributionSummary(id, conf); - } - }; - - @Autowired - private SpringEnvironmentMeterFilter filter; - - @Before - public void configureRegistry() { - registry.config().meterFilter(filter); - } - - @Test - public void disable() { - registry.counter("my.counter"); - assertThat(registry.find("my.counter").counter()).isNull(); - } - - @Test - public void enable() { - registry.timer("my.timer"); - registry.mustFind("my.timer").timer(); - } - - @Test - public void timerHistogramConfig() { - registry.timer("my.timer"); - assertThat(histogramConfig.getMaximumExpectedValue()).isEqualTo(Duration.ofSeconds(10).toNanos()); - assertThat(histogramConfig.getMinimumExpectedValue()).isEqualTo(Duration.ofMillis(1).toNanos()); - assertThat(histogramConfig.getPercentiles()).containsExactly(0.5, 0.95); - } - - @Test - public void summaryHistogramConfig() { - registry.summary("my.summary"); - assertThat(histogramConfig.getMaximumExpectedValue()).isEqualTo(100); - } - - @Test - public void configErrorMessage() { - assertThatThrownBy(() -> registry.timer("my.timer.that.is.misconfigured")) - .isInstanceOf(ConfigurationException.class) - .hasMessage("Invalid configuration for 'my.timer.that.is.misconfigured.enabled' value 'troo' as class java.lang.Boolean"); - } - - @Configuration - static class FilterTestConfiguration { - @Bean - public SpringEnvironmentMeterFilter filter(Environment environment) { - return new SpringEnvironmentMeterFilter(environment); - } - } -} diff --git a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/filter/PropertiesMeterFilterTest.java b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/filter/PropertiesMeterFilterTest.java new file mode 100644 index 0000000000..5583b954e3 --- /dev/null +++ b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/filter/PropertiesMeterFilterTest.java @@ -0,0 +1,87 @@ +/** + * Copyright 2017 Pivotal Software, Inc. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.micrometer.spring.filter; + +import io.micrometer.core.instrument.DistributionSummary; +import io.micrometer.core.instrument.Meter; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.MockClock; +import io.micrometer.core.instrument.histogram.HistogramConfig; +import io.micrometer.core.instrument.simple.SimpleConfig; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import io.micrometer.core.lang.NonNull; +import io.micrometer.core.lang.Nullable; +import io.micrometer.spring.PropertiesMeterFilter; +import io.micrometer.spring.autoconfigure.MetricsProperties; +import org.junit.Before; +import org.junit.Test; + +import static java.util.Objects.requireNonNull; +import static org.assertj.core.api.Assertions.assertThat; + +public class PropertiesMeterFilterTest { + private MetricsProperties props = new MetricsProperties(); + + @Nullable + private HistogramConfig histogramConfig; + + private MeterRegistry registry = new SimpleMeterRegistry(SimpleConfig.DEFAULT, new MockClock()) { + @Override + @NonNull + protected DistributionSummary newDistributionSummary(@NonNull Meter.Id id, @NonNull HistogramConfig conf) { + histogramConfig = conf; + return super.newDistributionSummary(id, conf); + } + }; + + @Before + public void before() { + registry.config().meterFilter(new PropertiesMeterFilter(props)); + } + + @Test + public void disable() { + props.getEnabled().put("my.counter", false); + registry.counter("my.counter"); + + assertThat(registry.find("my.counter").counter()).isNull(); + } + + @Test + public void disableAll() { + props.getEnabled().put("all", false); + registry.timer("my.timer"); + + assertThat(registry.find("my.timer").timer()).isNull(); + } + + @Test + public void enable() { + props.getEnabled().put("all", false); + props.getEnabled().put("my.timer", true); + registry.timer("my.timer"); + + registry.mustFind("my.timer").timer(); + } + + @Test + public void summaryHistogramConfig() { + props.getSummaries().getMaximumExpectedValue().put("my.summary", 100L); + registry.summary("my.summary"); + + assertThat(requireNonNull(histogramConfig).getMaximumExpectedValue()).isEqualTo(100); + } +} \ No newline at end of file diff --git a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/integration/SpringIntegrationMetricsTest.java b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/integration/SpringIntegrationMetricsTest.java index e10e35b7a7..87aab2df62 100644 --- a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/integration/SpringIntegrationMetricsTest.java +++ b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/integration/SpringIntegrationMetricsTest.java @@ -30,24 +30,12 @@ import org.springframework.integration.dsl.support.Transformers; import org.springframework.integration.ws.SimpleWebServiceOutboundGateway; import org.springframework.integration.ws.WebServiceHeaders; -import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @RunWith(SpringRunner.class) @SpringBootTest -@TestPropertySource(properties = { - "management.metrics.useGlobalRegistry=false", - "management.metrics.export.atlas.enabled=false", - "management.metrics.export.datadog.enabled=false", - "management.metrics.export.ganglia.enabled=false", - "management.metrics.export.influx.enabled=false", - "management.metrics.export.jmx.enabled=false", - "management.metrics.export.statsd.enabled=false", - "management.metrics.export.newrelic.enabled=false", - "management.metrics.export.signalfx.enabled=false" -}) public class SpringIntegrationMetricsTest { @Autowired TestSpringIntegrationApplication.TempConverter converter; diff --git a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/jdbc/DataSourceMetricsHikariTest.java b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/jdbc/DataSourceMetricsHikariTest.java index dfe732d633..00b9e2eecc 100644 --- a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/jdbc/DataSourceMetricsHikariTest.java +++ b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/jdbc/DataSourceMetricsHikariTest.java @@ -30,7 +30,6 @@ import org.springframework.test.context.junit4.SpringRunner; import javax.sql.DataSource; -import java.sql.SQLException; import java.util.Collection; import static java.util.Collections.emptyList; @@ -43,7 +42,6 @@ @TestPropertySource(properties = { "spring.datasource.generate-unique-name=true", "management.security.enabled=false", - "management.metrics.useGlobalRegistry=false", "spring.datasource.type=com.zaxxer.hikari.HikariDataSource" }) public class DataSourceMetricsHikariTest { @@ -54,7 +52,7 @@ public class DataSourceMetricsHikariTest { MeterRegistry registry; @Test - public void dataSourceIsInstrumented() throws SQLException, InterruptedException { + public void dataSourceIsInstrumented() { registry.mustFind("data.source.active.connections").meter(); } diff --git a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/jdbc/DataSourceMetricsTest.java b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/jdbc/DataSourceMetricsTest.java index e8a6ae1719..4a1b6ab7fa 100644 --- a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/jdbc/DataSourceMetricsTest.java +++ b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/jdbc/DataSourceMetricsTest.java @@ -43,7 +43,6 @@ @TestPropertySource(properties = { "spring.datasource.generate-unique-name=true", "management.security.enabled=false", - "management.metrics.useGlobalRegistry=false", "spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource" }) public class DataSourceMetricsTest { @@ -54,7 +53,7 @@ public class DataSourceMetricsTest { MeterRegistry registry; @Test - public void dataSourceIsInstrumented() throws SQLException, InterruptedException { + public void dataSourceIsInstrumented() throws SQLException { dataSource.getConnection().getMetaData(); registry.find("data.source.max.connections").meter(); } diff --git a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/scheduling/ScheduledMethodMetricsTest.java b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/scheduling/ScheduledMethodMetricsTest.java index eaabef7ca9..6ad467d829 100644 --- a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/scheduling/ScheduledMethodMetricsTest.java +++ b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/scheduling/ScheduledMethodMetricsTest.java @@ -28,7 +28,6 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; -import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import java.util.concurrent.CountDownLatch; @@ -37,7 +36,6 @@ @RunWith(SpringRunner.class) @SpringBootTest -@TestPropertySource(properties = "management.metrics.useGlobalRegistry=false") @Ignore("Race condition still...") public class ScheduledMethodMetricsTest { diff --git a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/web/servlet/MetricsFilterCustomExceptionHandlerTest.java b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/web/servlet/MetricsFilterCustomExceptionHandlerTest.java index 91bd479819..8ade05a711 100644 --- a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/web/servlet/MetricsFilterCustomExceptionHandlerTest.java +++ b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/web/servlet/MetricsFilterCustomExceptionHandlerTest.java @@ -73,7 +73,7 @@ public void handledExceptionIsRecordedInMetricTag() throws Exception { } @Test - public void rethrownExceptionIsRecordedInMetricTag() throws Exception { + public void rethrownExceptionIsRecordedInMetricTag() { assertThatCode(() -> mvc.perform(get("/api/rethrownError")) .andExpect(status().is5xxServerError())); @@ -126,14 +126,14 @@ static class Exception2 extends RuntimeException { static class CustomExceptionHandler { @ExceptionHandler - ResponseEntity handleError(Exception1 ex) throws Throwable { + ResponseEntity handleError(Exception1 ex) { MetricsFilter.tagWithException(ex); return new ResponseEntity<>("this is a custom exception body", HttpStatus.INTERNAL_SERVER_ERROR); } @ExceptionHandler - ResponseEntity rethrowError(Exception2 ex) throws Throwable { + ResponseEntity rethrowError(Exception2 ex) { throw ex; } } diff --git a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/web/servlet/MetricsFilterTest.java b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/web/servlet/MetricsFilterTest.java index 71cd4c1c39..ff5239d47d 100644 --- a/micrometer-spring-legacy/src/test/java/io/micrometer/spring/web/servlet/MetricsFilterTest.java +++ b/micrometer-spring-legacy/src/test/java/io/micrometer/spring/web/servlet/MetricsFilterTest.java @@ -160,7 +160,7 @@ public void notFoundRequest() throws Exception { } @Test - public void unhandledError() throws Exception { + public void unhandledError() { assertThatCode(() -> mvc.perform(get("/api/c1/unhandledError/10")) .andExpect(status().isOk())) .hasRootCauseInstanceOf(RuntimeException.class); @@ -409,7 +409,7 @@ CompletableFuture asyncCompletableFuture(@PathVariable Long id) throws E @Timed @Timed(value = "my.long.request.exception", longTask = true) @GetMapping("/completableFutureException") - CompletableFuture asyncCompletableFutureException() throws Exception { + CompletableFuture asyncCompletableFutureException() { return CompletableFuture.supplyAsync(() -> { throw new RuntimeException("boom"); }); diff --git a/micrometer-test/src/main/java/io/micrometer/core/tck/TimerTest.java b/micrometer-test/src/main/java/io/micrometer/core/tck/TimerTest.java index 9105126ea5..580760d594 100644 --- a/micrometer-test/src/main/java/io/micrometer/core/tck/TimerTest.java +++ b/micrometer-test/src/main/java/io/micrometer/core/tck/TimerTest.java @@ -87,7 +87,7 @@ default void recordZero(MeterRegistry registry) { @Test @DisplayName("record a runnable task") - default void recordWithRunnable(MeterRegistry registry) throws Exception { + default void recordWithRunnable(MeterRegistry registry) { Timer t = registry.timer("myTimer"); try { @@ -101,7 +101,7 @@ default void recordWithRunnable(MeterRegistry registry) throws Exception { @Test @DisplayName("record with stateful Sample instance") - default void recordWithSample(MeterRegistry registry) throws Exception { + default void recordWithSample(MeterRegistry registry) { Timer timer = registry.timer("myTimer"); Timer.Sample sample = Timer.start(registry); diff --git a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/AtlasSample.java b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/AtlasSample.java index 4ad37bab13..6cc12e6584 100644 --- a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/AtlasSample.java +++ b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/AtlasSample.java @@ -15,12 +15,11 @@ */ package io.micrometer.boot2.samples; +import io.micrometer.boot2.samples.components.PersonController; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.scheduling.annotation.EnableScheduling; -import io.micrometer.boot2.samples.components.PersonController; - @SpringBootApplication(scanBasePackageClasses = PersonController.class) @EnableScheduling public class AtlasSample { diff --git a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/DatadogSample.java b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/DatadogSample.java index ffd9a712c6..27d09a70ea 100644 --- a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/DatadogSample.java +++ b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/DatadogSample.java @@ -15,12 +15,11 @@ */ package io.micrometer.boot2.samples; +import io.micrometer.boot2.samples.components.PersonController; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.scheduling.annotation.EnableScheduling; -import io.micrometer.boot2.samples.components.PersonController; - @SpringBootApplication(scanBasePackageClasses = PersonController.class) @EnableScheduling public class DatadogSample { diff --git a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/InfluxSample.java b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/InfluxSample.java index e5a9c8220a..8bc076896d 100644 --- a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/InfluxSample.java +++ b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/InfluxSample.java @@ -15,12 +15,11 @@ */ package io.micrometer.boot2.samples; +import io.micrometer.boot2.samples.components.PersonController; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.scheduling.annotation.EnableScheduling; -import io.micrometer.boot2.samples.components.PersonController; - @SpringBootApplication(scanBasePackageClasses = PersonController.class) @EnableScheduling public class InfluxSample { diff --git a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/JmxSample.java b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/JmxSample.java index bc3e9d695e..dcb789a68d 100644 --- a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/JmxSample.java +++ b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/JmxSample.java @@ -15,12 +15,11 @@ */ package io.micrometer.boot2.samples; +import io.micrometer.boot2.samples.components.PersonController; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.scheduling.annotation.EnableScheduling; -import io.micrometer.boot2.samples.components.PersonController; - @SpringBootApplication(scanBasePackageClasses = PersonController.class) @EnableScheduling public class JmxSample { diff --git a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/NewRelicSample.java b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/NewRelicSample.java index d9fb049383..faaf0f341d 100644 --- a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/NewRelicSample.java +++ b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/NewRelicSample.java @@ -15,12 +15,11 @@ */ package io.micrometer.boot2.samples; +import io.micrometer.boot2.samples.components.PersonController; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.scheduling.annotation.EnableScheduling; -import io.micrometer.boot2.samples.components.PersonController; - @SpringBootApplication(scanBasePackageClasses = PersonController.class) @EnableScheduling public class NewRelicSample { diff --git a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/PrometheusSample.java b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/PrometheusSample.java index 6d88998b12..5f8e61fb1d 100644 --- a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/PrometheusSample.java +++ b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/PrometheusSample.java @@ -16,13 +16,12 @@ package io.micrometer.boot2.samples; import com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect; +import io.micrometer.boot2.samples.components.PersonController; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableScheduling; -import io.micrometer.boot2.samples.components.PersonController; - @SpringBootApplication(scanBasePackageClasses = PersonController.class) @EnableScheduling public class PrometheusSample { diff --git a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/SignalfxSample.java b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/SignalfxSample.java index 851247165d..3acbd1f878 100644 --- a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/SignalfxSample.java +++ b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/SignalfxSample.java @@ -15,12 +15,11 @@ */ package io.micrometer.boot2.samples; +import io.micrometer.boot2.samples.components.PersonController; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.scheduling.annotation.EnableScheduling; -import io.micrometer.boot2.samples.components.PersonController; - @SpringBootApplication(scanBasePackageClasses = PersonController.class) @EnableScheduling public class SignalfxSample { diff --git a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/SimpleSample.java b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/SimpleSample.java index 941729cde9..e1f7af2501 100644 --- a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/SimpleSample.java +++ b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/SimpleSample.java @@ -15,15 +15,14 @@ */ package io.micrometer.boot2.samples; +import io.micrometer.boot2.samples.components.PersonController; +import io.micrometer.core.instrument.histogram.pause.NoPauseDetector; import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryConfigurer; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableScheduling; -import io.micrometer.boot2.samples.components.PersonController; -import io.micrometer.core.instrument.histogram.pause.NoPauseDetector; - @SpringBootApplication(scanBasePackageClasses = PersonController.class) @EnableScheduling public class SimpleSample { diff --git a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/StatsdDatadogSample.java b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/StatsdDatadogSample.java index f024a112e3..a465f472ae 100644 --- a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/StatsdDatadogSample.java +++ b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/StatsdDatadogSample.java @@ -15,12 +15,11 @@ */ package io.micrometer.boot2.samples; +import io.micrometer.boot2.samples.components.PersonController; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.scheduling.annotation.EnableScheduling; -import io.micrometer.boot2.samples.components.PersonController; - @SpringBootApplication(scanBasePackageClasses = PersonController.class) @EnableScheduling public class StatsdDatadogSample { diff --git a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/StatsdTelegrafSample.java b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/StatsdTelegrafSample.java index 67d36d3c0f..74a7503be8 100644 --- a/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/StatsdTelegrafSample.java +++ b/samples/micrometer-samples-boot2/src/main/java/io/micrometer/boot2/samples/StatsdTelegrafSample.java @@ -15,12 +15,11 @@ */ package io.micrometer.boot2.samples; +import io.micrometer.boot2.samples.components.PersonController; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.scheduling.annotation.EnableScheduling; -import io.micrometer.boot2.samples.components.PersonController; - @SpringBootApplication(scanBasePackageClasses = PersonController.class) @EnableScheduling public class StatsdTelegrafSample { diff --git a/samples/micrometer-samples-core/src/main/java/io/micrometer/core/samples/UptimeMetricsSample.java b/samples/micrometer-samples-core/src/main/java/io/micrometer/core/samples/UptimeMetricsSample.java index ced3eb99ff..6b54db284d 100644 --- a/samples/micrometer-samples-core/src/main/java/io/micrometer/core/samples/UptimeMetricsSample.java +++ b/samples/micrometer-samples-core/src/main/java/io/micrometer/core/samples/UptimeMetricsSample.java @@ -19,13 +19,11 @@ import io.micrometer.core.instrument.binder.system.UptimeMetrics; import io.micrometer.core.samples.utils.SampleConfig; -import java.io.IOException; - /** * Sample to diagnose issue #243 */ public class UptimeMetricsSample { - public static void main(String[] args) throws IOException { + public static void main(String[] args) { MeterRegistry registry = SampleConfig.myMonitoringSystem(); registry.config().commonTags("instance", "sample-host"); new UptimeMetrics().bindTo(registry);