Skip to content

Commit 10b76fd

Browse files
authored
Prevent CompositeMeter allocating on each record (#3059)
The way forEachChild was written mean each lambda has to close over the argument which results in an allocation for each call. Instead we slightly rewrite the forEachChild api to allow passing through the data to each call so that the lambdas do not need to capture the argument.
1 parent 3f097e1 commit 10b76fd

File tree

5 files changed

+18
-9
lines changed

5 files changed

+18
-9
lines changed

micrometer-core/src/main/java/io/micrometer/core/instrument/composite/AbstractCompositeMeter.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,9 @@
2525
import java.util.Iterator;
2626
import java.util.Map;
2727
import java.util.concurrent.atomic.AtomicBoolean;
28-
import java.util.function.Consumer;
2928

3029
abstract class AbstractCompositeMeter<T extends Meter> extends AbstractMeter implements CompositeMeter {
31-
private AtomicBoolean childrenGuard = new AtomicBoolean();
30+
private final AtomicBoolean childrenGuard = new AtomicBoolean();
3231
private Map<MeterRegistry, T> children = Collections.emptyMap();
3332

3433
@Nullable
@@ -43,8 +42,8 @@ abstract class AbstractCompositeMeter<T extends Meter> extends AbstractMeter imp
4342
@Nullable
4443
abstract T registerNewMeter(MeterRegistry registry);
4544

46-
final void forEachChild(Consumer<T> task) {
47-
children.values().forEach(task);
45+
final Iterable<T> getChildren() {
46+
return children.values();
4847
}
4948

5049
T firstChild() {

micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeCounter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ class CompositeCounter extends AbstractCompositeMeter<Counter> implements Counte
2828

2929
@Override
3030
public void increment(double amount) {
31-
forEachChild(c -> c.increment(amount));
31+
for (Counter c : getChildren()) {
32+
c.increment(amount);
33+
}
3234
}
3335

3436
@Override

micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeDistributionSummary.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ class CompositeDistributionSummary extends AbstractCompositeMeter<DistributionSu
3535

3636
@Override
3737
public void record(double amount) {
38-
forEachChild(ds -> ds.record(amount));
38+
for (DistributionSummary ds : getChildren()) {
39+
ds.record(amount);
40+
}
3941
}
4042

4143
@Override

micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeLongTaskTimer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ class CompositeLongTaskTimer extends AbstractCompositeMeter<LongTaskTimer> imple
3838
@Override
3939
public Sample start() {
4040
List<Sample> samples = new ArrayList<>();
41-
forEachChild(ltt -> samples.add(ltt.start()));
41+
for (LongTaskTimer ltt : getChildren()) {
42+
samples.add(ltt.start());
43+
}
4244
return new CompositeSample(samples);
4345
}
4446

micrometer-core/src/main/java/io/micrometer/core/instrument/composite/CompositeTimer.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,16 @@ class CompositeTimer extends AbstractCompositeMeter<Timer> implements Timer {
4242

4343
@Override
4444
public void record(long amount, TimeUnit unit) {
45-
forEachChild(ds -> ds.record(amount, unit));
45+
for (Timer ds : getChildren()) {
46+
ds.record(amount, unit);
47+
}
4648
}
4749

4850
@Override
4951
public void record(Duration duration) {
50-
forEachChild(ds -> ds.record(duration));
52+
for (Timer ds : getChildren()) {
53+
ds.record(duration);
54+
}
5155
}
5256

5357
@Override

0 commit comments

Comments
 (0)