Merge branch '1.5.x'
This commit is contained in:
		
						commit
						a1adcd9919
					
				| 
						 | 
				
			
			@ -26,7 +26,9 @@ import org.springframework.boot.actuate.cache.CacheStatisticsProvider;
 | 
			
		|||
import org.springframework.boot.actuate.metrics.Metric;
 | 
			
		||||
import org.springframework.cache.Cache;
 | 
			
		||||
import org.springframework.cache.CacheManager;
 | 
			
		||||
import org.springframework.cache.transaction.TransactionAwareCacheDecorator;
 | 
			
		||||
import org.springframework.core.ResolvableType;
 | 
			
		||||
import org.springframework.util.ClassUtils;
 | 
			
		||||
import org.springframework.util.LinkedMultiValueMap;
 | 
			
		||||
import org.springframework.util.MultiValueMap;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -78,7 +80,7 @@ public class CachePublicMetrics implements PublicMetrics {
 | 
			
		|||
			List<CacheManagerBean> cacheManagerBeans) {
 | 
			
		||||
		for (CacheManagerBean cacheManagerBean : cacheManagerBeans) {
 | 
			
		||||
			CacheManager cacheManager = cacheManagerBean.getCacheManager();
 | 
			
		||||
			Cache cache = cacheManager.getCache(cacheName);
 | 
			
		||||
			Cache cache = unwrapIfNecessary(cacheManager.getCache(cacheName));
 | 
			
		||||
			CacheStatistics statistics = getCacheStatistics(cache, cacheManager);
 | 
			
		||||
			if (statistics != null) {
 | 
			
		||||
				String prefix = cacheName;
 | 
			
		||||
| 
						 | 
				
			
			@ -91,6 +93,14 @@ public class CachePublicMetrics implements PublicMetrics {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Cache unwrapIfNecessary(Cache cache) {
 | 
			
		||||
		if (ClassUtils.isPresent("org.springframework.cache.transaction.TransactionAwareCacheDecorator",
 | 
			
		||||
				getClass().getClassLoader())) {
 | 
			
		||||
			return TransactionAwareCacheDecoratorHandler.unwrapIfNecessary(cache);
 | 
			
		||||
		}
 | 
			
		||||
		return cache;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@SuppressWarnings({ "rawtypes", "unchecked" })
 | 
			
		||||
	private CacheStatistics getCacheStatistics(Cache cache, CacheManager cacheManager) {
 | 
			
		||||
		if (this.statisticsProviders != null) {
 | 
			
		||||
| 
						 | 
				
			
			@ -131,4 +141,19 @@ public class CachePublicMetrics implements PublicMetrics {
 | 
			
		|||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static class TransactionAwareCacheDecoratorHandler {
 | 
			
		||||
 | 
			
		||||
		private static Cache unwrapIfNecessary(Cache cache) {
 | 
			
		||||
			try {
 | 
			
		||||
				if (cache instanceof TransactionAwareCacheDecorator) {
 | 
			
		||||
					return ((TransactionAwareCacheDecorator) cache).getTargetCache();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			catch (NoClassDefFoundError ex) {
 | 
			
		||||
				// Ignore
 | 
			
		||||
			}
 | 
			
		||||
			return cache;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,7 @@ package org.springframework.boot.actuate.endpoint;
 | 
			
		|||
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.Collections;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +30,10 @@ import org.springframework.boot.actuate.cache.CaffeineCacheStatisticsProvider;
 | 
			
		|||
import org.springframework.boot.actuate.cache.ConcurrentMapCacheStatisticsProvider;
 | 
			
		||||
import org.springframework.boot.actuate.metrics.Metric;
 | 
			
		||||
import org.springframework.cache.CacheManager;
 | 
			
		||||
import org.springframework.cache.concurrent.ConcurrentMapCache;
 | 
			
		||||
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
 | 
			
		||||
import org.springframework.cache.support.SimpleCacheManager;
 | 
			
		||||
import org.springframework.cache.transaction.TransactionAwareCacheDecorator;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
import static org.assertj.core.api.Assertions.entry;
 | 
			
		||||
| 
						 | 
				
			
			@ -78,6 +82,19 @@ public class CachePublicMetricsTests {
 | 
			
		|||
				entry("cache.anotherCacheManager_foo.size", 0L));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void cacheMetricsWithTransactionAwareCacheDecorator() {
 | 
			
		||||
		SimpleCacheManager cacheManager = new SimpleCacheManager();
 | 
			
		||||
		cacheManager.setCaches(Collections.singletonList(
 | 
			
		||||
				new TransactionAwareCacheDecorator(new ConcurrentMapCache("foo"))));
 | 
			
		||||
		cacheManager.afterPropertiesSet();
 | 
			
		||||
		this.cacheManagers.put("cacheManager", cacheManager);
 | 
			
		||||
		CachePublicMetrics cpm = new CachePublicMetrics(this.cacheManagers,
 | 
			
		||||
				providers(new ConcurrentMapCacheStatisticsProvider()));
 | 
			
		||||
		Map<String, Number> metrics = metrics(cpm);
 | 
			
		||||
		assertThat(metrics).containsOnly(entry("cache.foo.size", 0L));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private Map<String, Number> metrics(CachePublicMetrics cpm) {
 | 
			
		||||
		Collection<Metric<?>> metrics = cpm.metrics();
 | 
			
		||||
		assertThat(metrics).isNotNull();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue