@@ -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,10 @@ 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+ cleanerBuilder = cleanerBuilder .withCleanerType (CleanerType .DELAYED );
320+ collectingPerResourceMetrics = true ;
323321 }
324322
325323 /**
@@ -329,7 +327,7 @@ private PerResourceCollectingMicrometerMetricsBuilder(MeterRegistry registry) {
329327 */
330328 public PerResourceCollectingMicrometerMetricsBuilder withCleaningThreadNumber (
331329 int cleaningThreadsNumber ) {
332- this . cleaningThreadsNumber = cleaningThreadsNumber <= 0 ? 1 : cleaningThreadsNumber ;
330+ cleanerBuilder = cleanerBuilder . withCleaningThreadNumber ( cleaningThreadsNumber ) ;
333331 return this ;
334332 }
335333
@@ -343,30 +341,24 @@ public PerResourceCollectingMicrometerMetricsBuilder withCleaningThreadNumber(
343341 */
344342 public PerResourceCollectingMicrometerMetricsBuilder withCleanUpDelayInSeconds (
345343 int cleanUpDelayInSeconds ) {
346- this . cleanUpDelayInSeconds = Math . max (cleanUpDelayInSeconds , 1 );
344+ cleanerBuilder = cleanerBuilder . withCleanUpDelayInSeconds (cleanUpDelayInSeconds );
347345 return this ;
348346 }
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- }
356347 }
357348
358349 public static class MicrometerMetricsBuilder {
359350 protected final MeterRegistry registry ;
360- private boolean collectingPerResourceMetrics = true ;
351+ protected CleanerBuilder cleanerBuilder ;
352+ protected boolean collectingPerResourceMetrics = true ;
361353
362354 private MicrometerMetricsBuilder (MeterRegistry registry ) {
363355 this .registry = registry ;
356+ this .cleanerBuilder = new CleanerBuilder (registry );
364357 }
365358
366359 /** Configures the instance to collect metrics on a per-resource basis. */
367360 @ SuppressWarnings ("unused" )
368361 public PerResourceCollectingMicrometerMetricsBuilder collectingMetricsPerResource () {
369- collectingPerResourceMetrics = true ;
370362 return new PerResourceCollectingMicrometerMetricsBuilder (registry );
371363 }
372364
@@ -381,11 +373,79 @@ public MicrometerMetricsBuilder notCollectingMetricsPerResource() {
381373 }
382374
383375 public MicrometerMetrics build () {
384- return new MicrometerMetrics (registry , Cleaner .NOOP , collectingPerResourceMetrics );
376+ return new MicrometerMetrics (registry , cleanerBuilder .build (), collectingPerResourceMetrics );
377+ }
378+ }
379+
380+ public static class CleanerBuilder {
381+
382+ private final MeterRegistry registry ;
383+ private CleanerType cleanerType = CleanerType .NOOP ;
384+ private int cleaningThreadsNumber ;
385+ private int cleanUpDelayInSeconds ;
386+
387+ public CleanerBuilder (MeterRegistry registry ) {
388+ this .registry = registry ;
389+ }
390+
391+ /**
392+ * @param cleanerType the type of cleaner to use, defaults to {@link CleanerType#NOOP} if not
393+ * specified
394+ */
395+ public CleanerBuilder withCleanerType (CleanerType cleanerType ) {
396+ this .cleanerType = cleanerType ;
397+ return this ;
398+ }
399+
400+ /**
401+ * @param cleaningThreadsNumber the maximal number of threads that can be assigned to the
402+ * removal of {@link Meter}s associated with deleted resources, defaults to 1 if not
403+ * specified or if the provided number is lesser or equal to 0
404+ * @throws IllegalStateException if the cleaner type is not {@link CleanerType#DELAYED}
405+ */
406+ public CleanerBuilder withCleaningThreadNumber (int cleaningThreadsNumber ) {
407+ if (cleanerType != CleanerType .DELAYED ) {
408+ throw new IllegalStateException (
409+ "Cleaning threads can only be configured when using the DELAYED cleaner type" );
410+ }
411+ this .cleaningThreadsNumber = cleaningThreadsNumber <= 0 ? 1 : cleaningThreadsNumber ;
412+ return this ;
413+ }
414+
415+ /**
416+ * @param cleanUpDelayInSeconds the number of seconds to wait before {@link Meter}s are removed
417+ * for deleted resources, defaults to 1 (meaning meters will be removed one second after the
418+ * associated resource is deleted) if not specified or if the provided number is lesser than
419+ * 0. Threading and the general interaction model of interacting with the API server means
420+ * that it's not possible to ensure that meters are immediately deleted in all cases so a
421+ * minimal delay of one second is always enforced
422+ * @throws IllegalStateException if the cleaner type is not {@link CleanerType#DELAYED}
423+ */
424+ public CleanerBuilder withCleanUpDelayInSeconds (int cleanUpDelayInSeconds ) {
425+ if (cleanerType != CleanerType .DELAYED ) {
426+ throw new IllegalStateException (
427+ "Clean up delay can only be configured when using the DELAYED cleaner type" );
428+ }
429+ this .cleanUpDelayInSeconds = Math .max (cleanUpDelayInSeconds , 1 );
430+ return this ;
431+ }
432+
433+ public Cleaner build () {
434+ return switch (cleanerType ) {
435+ case NOOP -> Cleaner .NOOP ;
436+ case DEFAULT -> new DefaultCleaner (registry );
437+ case DELAYED -> new DelayedCleaner (registry , cleanUpDelayInSeconds , cleaningThreadsNumber );
438+ };
385439 }
386440 }
387441
388- interface Cleaner {
442+ public enum CleanerType {
443+ NOOP ,
444+ DEFAULT ,
445+ DELAYED
446+ }
447+
448+ public interface Cleaner {
389449 Cleaner NOOP = new Cleaner () {};
390450
391451 default void removeMetersFor (ResourceID resourceID ) {}
0 commit comments