Skip to content

Commit 0ae8693

Browse files
committed
Merge branch '3.5.x'
Closes gh-48057
2 parents 756a640 + 049c6d5 commit 0ae8693

File tree

4 files changed

+61
-1
lines changed

4 files changed

+61
-1
lines changed

module/spring-boot-cache/src/main/java/org/springframework/boot/cache/autoconfigure/metrics/CacheMeterBinderProvidersConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.cache2k.extra.spring.SpringCache2kCache;
2525

2626
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
27+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2728
import org.springframework.boot.cache.metrics.Cache2kCacheMeterBinderProvider;
2829
import org.springframework.boot.cache.metrics.CacheMeterBinderProvider;
2930
import org.springframework.boot.cache.metrics.CaffeineCacheMeterBinderProvider;
@@ -80,6 +81,7 @@ HazelcastCacheMeterBinderProvider hazelcastCacheMeterBinderProvider() {
8081

8182
@Configuration(proxyBeanMethods = false)
8283
@ConditionalOnClass({ JCacheCache.class, javax.cache.CacheManager.class })
84+
@ConditionalOnMissingBean(JCacheCacheMeterBinderProvider.class)
8385
static class JCacheCacheMeterBinderProviderConfiguration {
8486

8587
@Bean

module/spring-boot-cache/src/main/java/org/springframework/boot/cache/metrics/JCacheCacheMeterBinderProvider.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.cache.metrics;
1818

19+
import io.micrometer.core.instrument.FunctionCounter;
20+
import io.micrometer.core.instrument.Gauge;
1921
import io.micrometer.core.instrument.Tag;
2022
import io.micrometer.core.instrument.binder.MeterBinder;
2123
import io.micrometer.core.instrument.binder.cache.JCacheMetrics;
@@ -30,9 +32,33 @@
3032
*/
3133
public class JCacheCacheMeterBinderProvider implements CacheMeterBinderProvider<JCacheCache> {
3234

35+
private final boolean registerCacheRemovalsAsFunctionCounter;
36+
37+
/**
38+
* Creates a {@code JCacheCacheMeterBinderProvider} that registers cache removals as a
39+
* {@link Gauge}.
40+
*/
41+
public JCacheCacheMeterBinderProvider() {
42+
this(false);
43+
}
44+
45+
/**
46+
* Creates a {@code JCacheCacheMeterBinderProvider} that registers cache removals with
47+
* a meter type that depends on the value of
48+
* {@code registerCacheRemovalsAsFunctionCounter}. When {@code false}, cache removals
49+
* are registered as a {@link Gauge}. When {@code true}, cache removals are registered
50+
* as a {@link FunctionCounter}.
51+
* @param registerCacheRemovalsAsFunctionCounter whether to register removals as a
52+
* gauge or a function counter
53+
* @since 3.4.12
54+
*/
55+
public JCacheCacheMeterBinderProvider(boolean registerCacheRemovalsAsFunctionCounter) {
56+
this.registerCacheRemovalsAsFunctionCounter = registerCacheRemovalsAsFunctionCounter;
57+
}
58+
3359
@Override
3460
public MeterBinder getMeterBinder(JCacheCache cache, Iterable<Tag> tags) {
35-
return new JCacheMetrics<>(cache.getNativeCache(), tags);
61+
return new JCacheMetrics<>(cache.getNativeCache(), tags, this.registerCacheRemovalsAsFunctionCounter);
3662
}
3763

3864
}

module/spring-boot-cache/src/test/java/org/springframework/boot/cache/autoconfigure/metrics/CacheMetricsAutoConfigurationTests.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import org.springframework.boot.autoconfigure.AutoConfigurations;
2828
import org.springframework.boot.cache.autoconfigure.CacheAutoConfiguration;
29+
import org.springframework.boot.cache.metrics.JCacheCacheMeterBinderProvider;
2930
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3031
import org.springframework.cache.CacheManager;
3132
import org.springframework.cache.annotation.CachingConfigurer;
@@ -114,6 +115,23 @@ void customCacheManagersAreInstrumented() {
114115
});
115116
}
116117

118+
@Test
119+
void jcacheCacheMeterBinderProviderIsAutoConfigured() {
120+
this.contextRunner.withPropertyValues("spring.cache.type=simple", "spring.cache.cache-names=cache1,cache2")
121+
.run((context) -> assertThat(context).hasSingleBean(JCacheCacheMeterBinderProvider.class)
122+
.hasBean("jCacheCacheMeterBinderProvider"));
123+
}
124+
125+
@Test
126+
void jcacheCacheMeterBinderProviderBacksOff() {
127+
this.contextRunner.withPropertyValues("spring.cache.type=simple", "spring.cache.cache-names=cache1,cache2")
128+
.withBean("customProvider", JCacheCacheMeterBinderProvider.class,
129+
() -> new JCacheCacheMeterBinderProvider(true))
130+
.run((context) -> assertThat(context).hasSingleBean(JCacheCacheMeterBinderProvider.class)
131+
.hasBean("customProvider")
132+
.doesNotHaveBean("jCacheCacheMeterBinderProvider"));
133+
}
134+
117135
@Configuration(proxyBeanMethods = false)
118136
static class CustomCacheManagersConfiguration implements CachingConfigurer {
119137

module/spring-boot-cache/src/test/java/org/springframework/boot/cache/metrics/JCacheCacheMeterBinderProviderTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,20 @@ void jCacheCacheProvider() throws URISyntaxException {
5454
JCacheCache cache = new JCacheCache(this.nativeCache);
5555
MeterBinder meterBinder = new JCacheCacheMeterBinderProvider().getMeterBinder(cache, Collections.emptyList());
5656
assertThat(meterBinder).isInstanceOf(JCacheMetrics.class);
57+
assertThat(meterBinder).extracting("registerCacheRemovalsAsFunctionCounter").isEqualTo(false);
58+
}
59+
60+
@Test
61+
void jCacheCacheProviderRegisteringRemovalsAsAFunctionCounter() throws URISyntaxException {
62+
javax.cache.CacheManager cacheManager = mock(javax.cache.CacheManager.class);
63+
given(cacheManager.getURI()).willReturn(new URI("/test"));
64+
given(this.nativeCache.getCacheManager()).willReturn(cacheManager);
65+
given(this.nativeCache.getName()).willReturn("test");
66+
JCacheCache cache = new JCacheCache(this.nativeCache);
67+
MeterBinder meterBinder = new JCacheCacheMeterBinderProvider(true).getMeterBinder(cache,
68+
Collections.emptyList());
69+
assertThat(meterBinder).isInstanceOf(JCacheMetrics.class);
70+
assertThat(meterBinder).extracting("registerCacheRemovalsAsFunctionCounter").isEqualTo(true);
5771
}
5872

5973
}

0 commit comments

Comments
 (0)