Skip to content

Commit fbdeb3a

Browse files
adinauerclaude
andcommitted
merge: Update Micrometer stack
Carry active meter removal handling forward and use the shared removal lifecycle for function timers. Co-Authored-By: Claude <noreply@anthropic.com>
2 parents 4821c5a + 54b12af commit fbdeb3a

8 files changed

Lines changed: 80 additions & 14 deletions

File tree

sentry-micrometer/src/main/java/io/sentry/micrometer/SentryCounter.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
import io.micrometer.core.instrument.cumulative.CumulativeCounter;
55
import org.jetbrains.annotations.NotNull;
66

7-
final class SentryCounter extends CumulativeCounter {
7+
final class SentryCounter extends CumulativeCounter implements SentryRemovableMeter {
88
private final @NotNull SentryMeterRegistry registry;
99
private final @NotNull SentryMetricInfo metricInfo;
10+
private volatile boolean removed;
1011

1112
SentryCounter(
1213
final @NotNull Meter.Id id,
@@ -20,8 +21,13 @@ final class SentryCounter extends CumulativeCounter {
2021
@Override
2122
public void increment(final double amount) {
2223
super.increment(amount);
23-
if (amount > 0.0 && Double.isFinite(amount)) {
24+
if (amount > 0.0 && Double.isFinite(amount) && !removed) {
2425
registry.captureCounter(metricInfo, amount);
2526
}
2627
}
28+
29+
@Override
30+
public void markRemoved() {
31+
removed = true;
32+
}
2733
}

sentry-micrometer/src/main/java/io/sentry/micrometer/SentryDistributionSummary.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
77
import org.jetbrains.annotations.NotNull;
88

9-
final class SentryDistributionSummary extends CumulativeDistributionSummary {
9+
final class SentryDistributionSummary extends CumulativeDistributionSummary
10+
implements SentryRemovableMeter {
1011
private final @NotNull SentryMeterRegistry registry;
1112
private final @NotNull SentryMetricInfo metricInfo;
13+
private volatile boolean removed;
1214

1315
SentryDistributionSummary(
1416
final @NotNull Meter.Id id,
@@ -25,8 +27,13 @@ final class SentryDistributionSummary extends CumulativeDistributionSummary {
2527
@Override
2628
protected void recordNonNegative(final double amount) {
2729
super.recordNonNegative(amount);
28-
if (Double.isFinite(amount)) {
30+
if (Double.isFinite(amount) && !removed) {
2931
registry.captureDistribution(metricInfo, amount);
3032
}
3133
}
34+
35+
@Override
36+
public void markRemoved() {
37+
removed = true;
38+
}
3239
}

sentry-micrometer/src/main/java/io/sentry/micrometer/SentryFunctionCounter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import java.util.function.ToDoubleFunction;
66
import org.jetbrains.annotations.NotNull;
77

8-
final class SentryFunctionCounter<T> extends CumulativeFunctionCounter<T> {
8+
final class SentryFunctionCounter<T> extends CumulativeFunctionCounter<T>
9+
implements SentryRemovableMeter {
910
private final @NotNull SentryMeterRegistry registry;
1011
private final @NotNull SentryMetricInfo metricInfo;
1112
private volatile boolean removed;
@@ -42,7 +43,8 @@ void poll() {
4243
}
4344
}
4445

45-
void markRemoved() {
46+
@Override
47+
public void markRemoved() {
4648
removed = true;
4749
}
4850
}

sentry-micrometer/src/main/java/io/sentry/micrometer/SentryFunctionTimer.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
import java.util.function.ToLongFunction;
99
import org.jetbrains.annotations.NotNull;
1010

11-
final class SentryFunctionTimer<T> extends CumulativeFunctionTimer<T> {
11+
final class SentryFunctionTimer<T> extends CumulativeFunctionTimer<T>
12+
implements SentryRemovableMeter {
1213
private final @NotNull SentryMeterRegistry registry;
1314
private final @NotNull SentryMetricInfo countMetricInfo;
1415
private final @NotNull SentryMetricInfo totalTimeMetricInfo;
@@ -88,7 +89,8 @@ private void pollTotalTime() {
8889
}
8990
}
9091

91-
void markRemoved() {
92+
@Override
93+
public void markRemoved() {
9294
removed = true;
9395
}
9496
}

sentry-micrometer/src/main/java/io/sentry/micrometer/SentryMeterRegistry.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -281,10 +281,8 @@ private void publishLongTaskTimer(final @NotNull LongTaskTimer timer) {
281281
}
282282

283283
private void onMeterRemoved(final @NotNull Meter meter) {
284-
if (meter instanceof SentryFunctionCounter) {
285-
((SentryFunctionCounter<?>) meter).markRemoved();
286-
} else if (meter instanceof SentryFunctionTimer) {
287-
((SentryFunctionTimer<?>) meter).markRemoved();
284+
if (meter instanceof SentryRemovableMeter) {
285+
((SentryRemovableMeter) meter).markRemoved();
288286
}
289287
}
290288

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.sentry.micrometer;
2+
3+
interface SentryRemovableMeter {
4+
void markRemoved();
5+
}

sentry-micrometer/src/main/java/io/sentry/micrometer/SentryTimer.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88
import java.util.concurrent.TimeUnit;
99
import org.jetbrains.annotations.NotNull;
1010

11-
final class SentryTimer extends CumulativeTimer {
11+
final class SentryTimer extends CumulativeTimer implements SentryRemovableMeter {
1212
private final @NotNull SentryMeterRegistry registry;
1313
private final @NotNull SentryMetricInfo metricInfo;
14+
private volatile boolean removed;
1415

1516
SentryTimer(
1617
final @NotNull Meter.Id id,
@@ -28,7 +29,14 @@ final class SentryTimer extends CumulativeTimer {
2829
@Override
2930
protected void recordNonNegative(final long amount, final @NotNull TimeUnit unit) {
3031
super.recordNonNegative(amount, unit);
31-
registry.captureDistribution(metricInfo, toMilliseconds(amount, unit));
32+
if (!removed) {
33+
registry.captureDistribution(metricInfo, toMilliseconds(amount, unit));
34+
}
35+
}
36+
37+
@Override
38+
public void markRemoved() {
39+
removed = true;
3240
}
3341

3442
private static double toMilliseconds(final long amount, final @NotNull TimeUnit unit) {

sentry-micrometer/src/test/kotlin/io/sentry/micrometer/SentryMeterRegistryTest.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,44 @@ class SentryMeterRegistryTest {
200200
verifyNoInteractions(metrics)
201201
}
202202

203+
@Test
204+
fun `removed active meters stop forwarding but retain local behavior`() {
205+
val metrics = installMetricsApi()
206+
val registry = SentryMeterRegistry()
207+
val counter = registry.counter("counter")
208+
val timer = registry.timer("timer")
209+
val summary = registry.summary("summary")
210+
211+
registry.remove(counter)
212+
registry.remove(timer)
213+
registry.remove(summary)
214+
counter.increment()
215+
timer.record(1, TimeUnit.MILLISECONDS)
216+
summary.record(1.0)
217+
218+
assertThat(counter.count()).isEqualTo(1.0)
219+
assertThat(timer.count()).isEqualTo(1)
220+
assertThat(summary.count()).isEqualTo(1)
221+
verifyNoInteractions(metrics)
222+
}
223+
224+
@Test
225+
fun `re-registering a removed meter does not reactivate its stale handle`() {
226+
val metrics = installMetricsApi()
227+
val registry = SentryMeterRegistry()
228+
val staleCounter = registry.counter("counter")
229+
230+
registry.remove(staleCounter)
231+
val replacementCounter = registry.counter("counter")
232+
staleCounter.increment(2.0)
233+
replacementCounter.increment(3.0)
234+
235+
assertThat(staleCounter.count()).isEqualTo(2.0)
236+
assertThat(replacementCounter.count()).isEqualTo(3.0)
237+
verify(metrics).count(eq("counter"), eq(3.0), anyOrNull(), any())
238+
verify(metrics, times(1)).count(any(), anyOrNull(), anyOrNull(), any())
239+
}
240+
203241
@Test
204242
fun `global Sentry metrics option disables forwarding`() {
205243
val client = mock<ISentryClient>()

0 commit comments

Comments
 (0)