@@ -96,14 +96,13 @@ public static MicrometerMetricsBuilder newMicrometerMetricsBuilder(MeterRegistry
96
96
97
97
/**
98
98
* Creates a micrometer-based Metrics implementation that cleans up {@link Meter}s associated with
99
- * deleted resources as specified by the (possibly {@code null}) provided {@link Cleaner}
100
- * instance.
99
+ * deleted resources as specified by the provided {@link Cleaner} instance.
101
100
*
102
101
* @param registry the {@link MeterRegistry} instance to use for metrics recording
103
102
* @param cleaner the {@link Cleaner} to use
104
103
* @param collectingPerResourceMetrics whether to collect per resource metrics
105
104
*/
106
- private MicrometerMetrics (
105
+ protected MicrometerMetrics (
107
106
MeterRegistry registry , Cleaner cleaner , boolean collectingPerResourceMetrics ) {
108
107
this .registry = registry ;
109
108
this .cleaner = cleaner ;
@@ -315,11 +314,9 @@ protected Set<Meter.Id> recordedMeterIdsFor(ResourceID resourceID) {
315
314
public static class PerResourceCollectingMicrometerMetricsBuilder
316
315
extends MicrometerMetricsBuilder {
317
316
318
- private int cleaningThreadsNumber ;
319
- private int cleanUpDelayInSeconds ;
320
-
321
317
private PerResourceCollectingMicrometerMetricsBuilder (MeterRegistry registry ) {
322
318
super (registry );
319
+ collectingPerResourceMetrics = true ;
323
320
}
324
321
325
322
/**
@@ -329,7 +326,7 @@ private PerResourceCollectingMicrometerMetricsBuilder(MeterRegistry registry) {
329
326
*/
330
327
public PerResourceCollectingMicrometerMetricsBuilder withCleaningThreadNumber (
331
328
int cleaningThreadsNumber ) {
332
- this . cleaningThreadsNumber = cleaningThreadsNumber <= 0 ? 1 : cleaningThreadsNumber ;
329
+ cleanerBuilder . withCleaningThreadNumber ( cleaningThreadsNumber ) ;
333
330
return this ;
334
331
}
335
332
@@ -343,30 +340,24 @@ public PerResourceCollectingMicrometerMetricsBuilder withCleaningThreadNumber(
343
340
*/
344
341
public PerResourceCollectingMicrometerMetricsBuilder withCleanUpDelayInSeconds (
345
342
int cleanUpDelayInSeconds ) {
346
- this . cleanUpDelayInSeconds = Math . max (cleanUpDelayInSeconds , 1 );
343
+ cleanerBuilder . withCleanUpDelayInSeconds (cleanUpDelayInSeconds );
347
344
return this ;
348
345
}
349
-
350
- @ Override
351
- public MicrometerMetrics build () {
352
- final var cleaner =
353
- new DelayedCleaner (registry , cleanUpDelayInSeconds , cleaningThreadsNumber );
354
- return new MicrometerMetrics (registry , cleaner , true );
355
- }
356
346
}
357
347
358
348
public static class MicrometerMetricsBuilder {
359
349
protected final MeterRegistry registry ;
360
- private boolean collectingPerResourceMetrics = true ;
350
+ protected final CleanerBuilder cleanerBuilder ;
351
+ protected boolean collectingPerResourceMetrics = true ;
361
352
362
353
private MicrometerMetricsBuilder (MeterRegistry registry ) {
363
354
this .registry = registry ;
355
+ this .cleanerBuilder = new CleanerBuilder (registry );
364
356
}
365
357
366
358
/** Configures the instance to collect metrics on a per-resource basis. */
367
359
@ SuppressWarnings ("unused" )
368
360
public PerResourceCollectingMicrometerMetricsBuilder collectingMetricsPerResource () {
369
- collectingPerResourceMetrics = true ;
370
361
return new PerResourceCollectingMicrometerMetricsBuilder (registry );
371
362
}
372
363
@@ -381,11 +372,52 @@ public MicrometerMetricsBuilder notCollectingMetricsPerResource() {
381
372
}
382
373
383
374
public MicrometerMetrics build () {
384
- return new MicrometerMetrics (registry , Cleaner .NOOP , collectingPerResourceMetrics );
375
+ return new MicrometerMetrics (registry , cleanerBuilder .build (), collectingPerResourceMetrics );
376
+ }
377
+ }
378
+
379
+ public static class CleanerBuilder {
380
+
381
+ private final MeterRegistry registry ;
382
+ private int cleaningThreadsNumber = 0 ;
383
+ private int cleanUpDelayInSeconds = 0 ;
384
+
385
+ public CleanerBuilder (MeterRegistry registry ) {
386
+ this .registry = registry ;
387
+ }
388
+
389
+ /**
390
+ * @param cleaningThreadsNumber the maximal number of threads that can be assigned to the
391
+ * removal of {@link Meter}s associated with deleted resources, defaults to 1 if not
392
+ * specified or if the provided number is lesser or equal to 0
393
+ */
394
+ public CleanerBuilder withCleaningThreadNumber (int cleaningThreadsNumber ) {
395
+ this .cleaningThreadsNumber = cleaningThreadsNumber <= 0 ? 1 : cleaningThreadsNumber ;
396
+ return this ;
397
+ }
398
+
399
+ /**
400
+ * @param cleanUpDelayInSeconds the number of seconds to wait before {@link Meter}s are removed
401
+ * for deleted resources, defaults to 1 (meaning meters will be removed one second after the
402
+ * associated resource is deleted) if not specified or if the provided number is lesser than
403
+ * 0. Threading and the general interaction model of interacting with the API server means
404
+ * that it's not possible to ensure that meters are immediately deleted in all cases so a
405
+ * minimal delay of one second is always enforced
406
+ */
407
+ public CleanerBuilder withCleanUpDelayInSeconds (int cleanUpDelayInSeconds ) {
408
+ this .cleanUpDelayInSeconds = Math .max (cleanUpDelayInSeconds , 1 );
409
+ return this ;
410
+ }
411
+
412
+ public Cleaner build () {
413
+ if (cleanUpDelayInSeconds > 0 || cleaningThreadsNumber > 0 ) {
414
+ return new DelayedCleaner (registry , cleanUpDelayInSeconds , cleaningThreadsNumber );
415
+ }
416
+ return Cleaner .NOOP ;
385
417
}
386
418
}
387
419
388
- interface Cleaner {
420
+ public interface Cleaner {
389
421
Cleaner NOOP = new Cleaner () {};
390
422
391
423
default void removeMetersFor (ResourceID resourceID ) {}
@@ -444,5 +476,10 @@ public void removeMetersFor(ResourceID resourceID) {
444
476
metersCleaner .schedule (
445
477
() -> super .removeMetersFor (resourceID ), cleanUpDelayInSeconds , TimeUnit .SECONDS );
446
478
}
479
+
480
+ // for testing purposes only
481
+ int getCleanUpDelayInSeconds () {
482
+ return cleanUpDelayInSeconds ;
483
+ }
447
484
}
448
485
}
0 commit comments