From 2e672dc7b283aa40c57cd87c9e0890dfcb98dae0 Mon Sep 17 00:00:00 2001 From: Hakimrabet Date: Wed, 9 Jul 2025 02:14:39 +0330 Subject: [PATCH] allow JCacheMetrics to be customized and support function counter Signed-off-by: Hakimrabet --- .../boot/cache/autoconfigure/CacheProperties.java | 10 ++++++++++ .../CacheMeterBinderProvidersConfiguration.java | 9 +++++++-- .../cache/metrics/JCacheCacheMeterBinderProvider.java | 9 ++++++++- .../metrics/JCacheCacheMeterBinderProviderTests.java | 11 +++++++---- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/autoconfigure/CacheProperties.java b/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/autoconfigure/CacheProperties.java index 3d8b68db7901..d0844747bc7d 100644 --- a/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/autoconfigure/CacheProperties.java +++ b/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/autoconfigure/CacheProperties.java @@ -189,6 +189,8 @@ public static class JCache { */ private String provider; + private boolean registerRemovalsAsFunctionCounter = false; + public String getProvider() { return this.provider; } @@ -205,6 +207,14 @@ public void setConfig(Resource config) { this.config = config; } + public Boolean getRegisterRemovalsAsFunctionCounter() { + return this.registerRemovalsAsFunctionCounter; + } + + public void setRegisterRemovalsAsFunctionCounter(Boolean registerRemovalsAsFunctionCounter) { + this.registerRemovalsAsFunctionCounter = registerRemovalsAsFunctionCounter; + } + } /** diff --git a/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/autoconfigure/metrics/CacheMeterBinderProvidersConfiguration.java b/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/autoconfigure/metrics/CacheMeterBinderProvidersConfiguration.java index 0456a0d29dd0..05875d394b62 100644 --- a/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/autoconfigure/metrics/CacheMeterBinderProvidersConfiguration.java +++ b/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/autoconfigure/metrics/CacheMeterBinderProvidersConfiguration.java @@ -24,6 +24,8 @@ import org.cache2k.extra.spring.SpringCache2kCache; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.cache.autoconfigure.CacheProperties; import org.springframework.boot.cache.metrics.Cache2kCacheMeterBinderProvider; import org.springframework.boot.cache.metrics.CacheMeterBinderProvider; import org.springframework.boot.cache.metrics.CaffeineCacheMeterBinderProvider; @@ -40,6 +42,7 @@ * Configure {@link CacheMeterBinderProvider} beans. * * @author Stephane Nicoll + * @author Alireza Hakimrabet */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass({ MeterBinder.class, CacheMeterBinderProvider.class }) @@ -83,8 +86,10 @@ HazelcastCacheMeterBinderProvider hazelcastCacheMeterBinderProvider() { static class JCacheCacheMeterBinderProviderConfiguration { @Bean - JCacheCacheMeterBinderProvider jCacheCacheMeterBinderProvider() { - return new JCacheCacheMeterBinderProvider(); + @ConditionalOnMissingBean(JCacheCacheMeterBinderProvider.class) + JCacheCacheMeterBinderProvider jCacheCacheMeterBinderProvider(CacheProperties cacheProperties) { + return new JCacheCacheMeterBinderProvider( + cacheProperties.getJcache().getRegisterRemovalsAsFunctionCounter()); } } diff --git a/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/metrics/JCacheCacheMeterBinderProvider.java b/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/metrics/JCacheCacheMeterBinderProvider.java index 7c7988cadf25..88db35fb001a 100644 --- a/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/metrics/JCacheCacheMeterBinderProvider.java +++ b/spring-boot-project/spring-boot-cache/src/main/java/org/springframework/boot/cache/metrics/JCacheCacheMeterBinderProvider.java @@ -26,13 +26,20 @@ * {@link CacheMeterBinderProvider} implementation for JCache. * * @author Stephane Nicoll + * @author Alireza Hakimrabet * @since 4.0.0 */ public class JCacheCacheMeterBinderProvider implements CacheMeterBinderProvider { + private final boolean recordRemovalsAsFunctionCounter; + + public JCacheCacheMeterBinderProvider(boolean recordRemovalsAsFunctionCounter) { + this.recordRemovalsAsFunctionCounter = recordRemovalsAsFunctionCounter; + } + @Override public MeterBinder getMeterBinder(JCacheCache cache, Iterable tags) { - return new JCacheMetrics<>(cache.getNativeCache(), tags); + return new JCacheMetrics<>(cache.getNativeCache(), tags, this.recordRemovalsAsFunctionCounter); } } diff --git a/spring-boot-project/spring-boot-cache/src/test/java/org/springframework/boot/cache/metrics/JCacheCacheMeterBinderProviderTests.java b/spring-boot-project/spring-boot-cache/src/test/java/org/springframework/boot/cache/metrics/JCacheCacheMeterBinderProviderTests.java index d8c4de0ca6c2..83187d1fbd15 100644 --- a/spring-boot-project/spring-boot-cache/src/test/java/org/springframework/boot/cache/metrics/JCacheCacheMeterBinderProviderTests.java +++ b/spring-boot-project/spring-boot-cache/src/test/java/org/springframework/boot/cache/metrics/JCacheCacheMeterBinderProviderTests.java @@ -22,8 +22,9 @@ import io.micrometer.core.instrument.binder.MeterBinder; import io.micrometer.core.instrument.binder.cache.JCacheMetrics; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -44,14 +45,16 @@ class JCacheCacheMeterBinderProviderTests { @Mock private javax.cache.Cache nativeCache; - @Test - void jCacheCacheProvider() throws URISyntaxException { + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void jCacheCacheProvider(boolean recordRemovalsAsFunctionCounter) throws URISyntaxException { javax.cache.CacheManager cacheManager = mock(javax.cache.CacheManager.class); given(cacheManager.getURI()).willReturn(new URI("/test")); given(this.nativeCache.getCacheManager()).willReturn(cacheManager); given(this.nativeCache.getName()).willReturn("test"); JCacheCache cache = new JCacheCache(this.nativeCache); - MeterBinder meterBinder = new JCacheCacheMeterBinderProvider().getMeterBinder(cache, Collections.emptyList()); + MeterBinder meterBinder = new JCacheCacheMeterBinderProvider(recordRemovalsAsFunctionCounter) + .getMeterBinder(cache, Collections.emptyList()); assertThat(meterBinder).isInstanceOf(JCacheMetrics.class); }