Skip to content

Commit d7e2985

Browse files
Merge branch '1.15.x'
2 parents 9633a03 + fd340e5 commit d7e2985

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ log4j = "2.25.1"
5656
maven-resolver = "1.9.24"
5757
mockito5 = "5.18.0"
5858
mongo = "4.11.5"
59-
netty = "4.1.122.Final"
59+
netty = "4.1.123.Final"
6060
newrelic-api = "5.14.0"
6161
# Kotlin 1.7 sample will fail from OkHttp 4.12.0 due to okio dependency being a Kotlin 1.9 module
6262
okhttp = "4.11.0"

micrometer-core/src/main/java/io/micrometer/core/instrument/distribution/TimeWindowPercentileHistogram.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.micrometer.core.instrument.distribution;
1717

18+
import io.micrometer.common.util.internal.logging.WarnThenDebugLogger;
1819
import io.micrometer.core.instrument.Clock;
1920
import org.HdrHistogram.DoubleHistogram;
2021
import org.HdrHistogram.DoubleRecorder;
@@ -36,6 +37,9 @@
3637
*/
3738
public class TimeWindowPercentileHistogram extends AbstractTimeWindowHistogram<DoubleRecorder, DoubleHistogram> {
3839

40+
private static final WarnThenDebugLogger WARN_THEN_DEBUG_LOGGER = new WarnThenDebugLogger(
41+
TimeWindowPercentileHistogram.class);
42+
3943
private final DoubleHistogram intervalHistogram;
4044

4145
private final double[] histogramBuckets;
@@ -102,7 +106,12 @@ DoubleHistogram newAccumulatedHistogram(DoubleRecorder[] ringBuffer) {
102106
@Override
103107
void accumulate() {
104108
currentHistogram().getIntervalHistogramInto(intervalHistogram);
105-
accumulatedHistogram().add(intervalHistogram);
109+
try {
110+
accumulatedHistogram().add(intervalHistogram);
111+
}
112+
catch (ArrayIndexOutOfBoundsException ex) {
113+
WARN_THEN_DEBUG_LOGGER.log("Failed to accumulate.", ex);
114+
}
106115
}
107116

108117
@Override

micrometer-core/src/test/java/io/micrometer/core/instrument/DistributionSummaryTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,15 @@
1919
import io.micrometer.core.instrument.simple.CountingMode;
2020
import io.micrometer.core.instrument.simple.SimpleConfig;
2121
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
22+
import io.micrometer.core.testsupport.system.CapturedOutput;
23+
import io.micrometer.core.testsupport.system.OutputCaptureExtension;
2224
import org.jspecify.annotations.Nullable;
2325
import org.junit.jupiter.api.Test;
26+
import org.junit.jupiter.api.extension.ExtendWith;
2427

2528
import static org.assertj.core.api.Assertions.assertThat;
2629

30+
@ExtendWith(OutputCaptureExtension.class)
2731
class DistributionSummaryTest {
2832

2933
@Test
@@ -68,4 +72,18 @@ public CountingMode mode() {
6872
assertThat(summary.takeSnapshot().histogramCounts()).containsExactly(new CountAtBucket(1.0, 0));
6973
}
7074

75+
@Test
76+
void takeSnapshotShouldNotThrowExceptionEvenIfDoubleHistogramThrowsException(CapturedOutput output) {
77+
SimpleMeterRegistry registry = new SimpleMeterRegistry();
78+
DistributionSummary summary = DistributionSummary.builder("my.summary")
79+
.publishPercentiles(0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.99)
80+
.register(registry);
81+
summary.record(1);
82+
summary.record(1E-10);
83+
summary.takeSnapshot();
84+
summary.record(1E-20);
85+
summary.takeSnapshot();
86+
assertThat(output).contains("Failed to accumulate.");
87+
}
88+
7189
}

0 commit comments

Comments
 (0)