@@ -32,18 +32,27 @@ public class MicrometerMetrics implements Metrics {
32
32
private final MeterRegistry registry ;
33
33
private final Map <String , AtomicInteger > gauges = new ConcurrentHashMap <>();
34
34
private final Map <ResourceID , Set <Meter .Id >> metersPerResource = new ConcurrentHashMap <>();
35
- private final ScheduledExecutorService metersCleaner ;
36
- private final int cleanUpDelayInSeconds ;
35
+ private final Cleaner cleaner ;
37
36
38
37
public MicrometerMetrics (MeterRegistry registry ) {
39
- this (registry , 300 , Runtime .getRuntime ().availableProcessors ());
38
+ this (registry , 0 );
39
+ }
40
+
41
+ public MicrometerMetrics (MeterRegistry registry , int cleanUpDelayInSeconds ) {
42
+ this (registry , cleanUpDelayInSeconds , 0 );
40
43
}
41
44
42
45
public MicrometerMetrics (MeterRegistry registry , int cleanUpDelayInSeconds ,
43
46
int cleaningThreadsNumber ) {
44
47
this .registry = registry ;
45
- this .cleanUpDelayInSeconds = cleanUpDelayInSeconds ;
46
- this .metersCleaner = Executors .newScheduledThreadPool (cleaningThreadsNumber );
48
+ if (cleanUpDelayInSeconds < 0 ) {
49
+ cleaner = new NoDelayCleaner ();
50
+ } else {
51
+ cleaningThreadsNumber =
52
+ cleaningThreadsNumber <= 0 ? Runtime .getRuntime ().availableProcessors ()
53
+ : cleaningThreadsNumber ;
54
+ cleaner = new DelayedCleaner (cleanUpDelayInSeconds , cleaningThreadsNumber );
55
+ }
47
56
}
48
57
49
58
@ Override
@@ -127,16 +136,7 @@ public void receivedEvent(Event event, Map<String, Object> metadata) {
127
136
public void cleanupDoneFor (ResourceID resourceID , Map <String , Object > metadata ) {
128
137
incrementCounter (resourceID , "events.delete" , metadata );
129
138
130
- // schedule deletion of meters associated with ResourceID
131
- metersCleaner .schedule (() -> {
132
- // remove each meter
133
- final var toClean = metersPerResource .get (resourceID );
134
- if (toClean != null ) {
135
- toClean .forEach (registry ::remove );
136
- }
137
- // then clean-up local recording of associations
138
- metersPerResource .remove (resourceID );
139
- }, cleanUpDelayInSeconds , TimeUnit .SECONDS );
139
+ cleaner .removeMetersFor (resourceID );
140
140
}
141
141
142
142
@ Override
@@ -231,4 +231,42 @@ private void incrementCounter(ResourceID id, String counterName, Map<String, Obj
231
231
protected Set <Meter .Id > recordedMeterIdsFor (ResourceID resourceID ) {
232
232
return metersPerResource .get (resourceID );
233
233
}
234
+
235
+ private interface Cleaner {
236
+ void removeMetersFor (ResourceID resourceID );
237
+ }
238
+
239
+ private void removeMetersFor (ResourceID resourceID ) {
240
+ // remove each meter
241
+ final var toClean = metersPerResource .get (resourceID );
242
+ if (toClean != null ) {
243
+ toClean .forEach (registry ::remove );
244
+ }
245
+ // then clean-up local recording of associations
246
+ metersPerResource .remove (resourceID );
247
+ }
248
+
249
+ private class NoDelayCleaner implements Cleaner {
250
+ @ Override
251
+ public void removeMetersFor (ResourceID resourceID ) {
252
+ MicrometerMetrics .this .removeMetersFor (resourceID );
253
+ }
254
+ }
255
+
256
+ private class DelayedCleaner implements Cleaner {
257
+ private final ScheduledExecutorService metersCleaner ;
258
+ private final int cleanUpDelayInSeconds ;
259
+
260
+ private DelayedCleaner (int cleanUpDelayInSeconds , int cleaningThreadsNumber ) {
261
+ this .cleanUpDelayInSeconds = cleanUpDelayInSeconds ;
262
+ this .metersCleaner = Executors .newScheduledThreadPool (cleaningThreadsNumber );
263
+ }
264
+
265
+ @ Override
266
+ public void removeMetersFor (ResourceID resourceID ) {
267
+ // schedule deletion of meters associated with ResourceID
268
+ metersCleaner .schedule (() -> MicrometerMetrics .this .removeMetersFor (resourceID ),
269
+ cleanUpDelayInSeconds , TimeUnit .SECONDS );
270
+ }
271
+ }
234
272
}
0 commit comments