@@ -96,14 +96,13 @@ public static MicrometerMetricsBuilder newMicrometerMetricsBuilder(MeterRegistry
9696
9797 /**
9898 * 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.
101100 *
102101 * @param registry the {@link MeterRegistry} instance to use for metrics recording
103102 * @param cleaner the {@link Cleaner} to use
104103 * @param collectingPerResourceMetrics whether to collect per resource metrics
105104 */
106- private MicrometerMetrics (
105+ protected MicrometerMetrics (
107106 MeterRegistry registry , Cleaner cleaner , boolean collectingPerResourceMetrics ) {
108107 this .registry = registry ;
109108 this .cleaner = cleaner ;
@@ -315,11 +314,9 @@ protected Set<Meter.Id> recordedMeterIdsFor(ResourceID resourceID) {
315314 public static class PerResourceCollectingMicrometerMetricsBuilder
316315 extends MicrometerMetricsBuilder {
317316
318- private int cleaningThreadsNumber ;
319- private int cleanUpDelayInSeconds ;
320-
321317 private PerResourceCollectingMicrometerMetricsBuilder (MeterRegistry registry ) {
322318 super (registry );
319+ collectingPerResourceMetrics = true ;
323320 }
324321
325322 /**
@@ -329,7 +326,7 @@ private PerResourceCollectingMicrometerMetricsBuilder(MeterRegistry registry) {
329326 */
330327 public PerResourceCollectingMicrometerMetricsBuilder withCleaningThreadNumber (
331328 int cleaningThreadsNumber ) {
332- this . cleaningThreadsNumber = cleaningThreadsNumber <= 0 ? 1 : cleaningThreadsNumber ;
329+ cleanerBuilder . withCleaningThreadNumber ( cleaningThreadsNumber ) ;
333330 return this ;
334331 }
335332
@@ -343,30 +340,24 @@ public PerResourceCollectingMicrometerMetricsBuilder withCleaningThreadNumber(
343340 */
344341 public PerResourceCollectingMicrometerMetricsBuilder withCleanUpDelayInSeconds (
345342 int cleanUpDelayInSeconds ) {
346- this . cleanUpDelayInSeconds = Math . max (cleanUpDelayInSeconds , 1 );
343+ cleanerBuilder . withCleanUpDelayInSeconds (cleanUpDelayInSeconds );
347344 return this ;
348345 }
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- }
356346 }
357347
358348 public static class MicrometerMetricsBuilder {
359349 protected final MeterRegistry registry ;
360- private boolean collectingPerResourceMetrics = true ;
350+ protected final CleanerBuilder cleanerBuilder ;
351+ protected boolean collectingPerResourceMetrics = true ;
361352
362353 private MicrometerMetricsBuilder (MeterRegistry registry ) {
363354 this .registry = registry ;
355+ this .cleanerBuilder = new CleanerBuilder (registry );
364356 }
365357
366358 /** Configures the instance to collect metrics on a per-resource basis. */
367359 @ SuppressWarnings ("unused" )
368360 public PerResourceCollectingMicrometerMetricsBuilder collectingMetricsPerResource () {
369- collectingPerResourceMetrics = true ;
370361 return new PerResourceCollectingMicrometerMetricsBuilder (registry );
371362 }
372363
@@ -381,11 +372,52 @@ public MicrometerMetricsBuilder notCollectingMetricsPerResource() {
381372 }
382373
383374 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 ;
385417 }
386418 }
387419
388- interface Cleaner {
420+ public interface Cleaner {
389421 Cleaner NOOP = new Cleaner () {};
390422
391423 default void removeMetersFor (ResourceID resourceID ) {}
@@ -444,5 +476,10 @@ public void removeMetersFor(ResourceID resourceID) {
444476 metersCleaner .schedule (
445477 () -> super .removeMetersFor (resourceID ), cleanUpDelayInSeconds , TimeUnit .SECONDS );
446478 }
479+
480+ // for testing purposes only
481+ int getCleanUpDelayInSeconds () {
482+ return cleanUpDelayInSeconds ;
483+ }
447484 }
448485}
0 commit comments