diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowHistogram.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowHistogram.java index f4b1349e29..951919f9ea 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowHistogram.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/histogram/TimeWindowHistogram.java @@ -32,6 +32,7 @@ public class TimeWindowHistogram extends TimeWindowHistogramBase { private final HistogramConfig histogramConfig; private final T[] ringBuffer; - private final U accumulatedHistogram; + private U accumulatedHistogram; private volatile boolean accumulatedHistogramStale; private final long durationBetweenRotatesMillis; @@ -64,8 +64,8 @@ abstract class TimeWindowHistogramBase { rejectHistogramConfig("histogramBufferLength (" + ageBuckets + ") must be greater than 0."); } - ringBuffer = newRingBuffer(bucketType, ageBuckets, histogramConfig); - accumulatedHistogram = newAccumulatedHistogram(ringBuffer); + //noinspection unchecked + ringBuffer = (T[]) Array.newInstance(bucketType, ageBuckets); durationBetweenRotatesMillis = histogramConfig.getHistogramExpiry().toMillis() / ageBuckets; if (durationBetweenRotatesMillis <= 0) { @@ -75,7 +75,6 @@ abstract class TimeWindowHistogramBase { currentBucket = 0; lastRotateTimestampMillis = clock.wallTime(); - } private static HistogramConfig validateHistogramConfig(HistogramConfig histogramConfig) { @@ -107,13 +106,11 @@ private static HistogramConfig validateHistogramConfig(HistogramConfig histogram return histogramConfig; } - private T[] newRingBuffer(Class bucketType, int ageBuckets, HistogramConfig histogramConfig) { - @SuppressWarnings("unchecked") - final T[] ringBuffer = (T[]) Array.newInstance(bucketType, ageBuckets); - for (int i = 0; i < ageBuckets; i++) { + void initRingBuffer() { + for (int i = 0; i < ringBuffer.length; i++) { ringBuffer[i] = newBucket(histogramConfig); } - return ringBuffer; + accumulatedHistogram = newAccumulatedHistogram(ringBuffer); } private static void rejectHistogramConfig(String msg) { 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 4a619cbb7d..bbd9f6ee6f 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 @@ -28,6 +28,8 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import static java.util.Objects.requireNonNull; + /** * @author Jon Schneider * @author Trustin Heuiseung Lee @@ -54,7 +56,7 @@ public TimeWindowLatencyHistogram(Clock clock, HistogramConfig histogramConfig, io.micrometer.core.instrument.histogram.pause.PauseDetector pauseDetector) { super(clock, histogramConfig, LatencyStats.class); - this.pauseDetector = pauseDetectorCache.computeIfAbsent(pauseDetector, detector -> { + this.pauseDetector = requireNonNull(pauseDetectorCache.computeIfAbsent(pauseDetector, detector -> { if (detector instanceof ClockDriftPauseDetector) { ClockDriftPauseDetector clockDriftPauseDetector = (ClockDriftPauseDetector) detector; return new SimplePauseDetector(clockDriftPauseDetector.getSleepInterval().toNanos(), @@ -63,11 +65,15 @@ public TimeWindowLatencyHistogram(Clock clock, HistogramConfig histogramConfig, return new NoopPauseDetector(); } return new NoopPauseDetector(); - }); + })); + + initRingBuffer(); } @Override LatencyStats newBucket(HistogramConfig histogramConfig) { + requireNonNull(pauseDetector); + return new LatencyStats.Builder() .pauseDetector(pauseDetector) .lowestTrackableLatency(histogramConfig.getMinimumExpectedValue()) diff --git a/scripts/cpu.sh b/scripts/cpu.sh new file mode 100755 index 0000000000..ad624e0452 --- /dev/null +++ b/scripts/cpu.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +htop -p $(ps ax | grep '[m]icrometer-core' | awk '{print $1}') \ No newline at end of file