package de.otto.edison.cache.configuration;
import org.springframework.boot.actuate.cache.CacheStatistics;
import org.springframework.boot.actuate.metrics.Metric;
import org.springframework.cache.caffeine.CaffeineCache;
import java.util.ArrayList;
import java.util.Collection;
/**
* CacheStatistics for Caffeine caches.
*/
class CaffeineCacheStatistics implements CacheStatistics {
private final long size;
private final long requestCount;
private double hitRatio;
private double missRatio;
private long hitCount;
private long missCount;
private long evictionCount;
private long loadCount;
public CaffeineCacheStatistics(final CaffeineCache cache) {
size = cache.getNativeCache().estimatedSize();
final com.github.benmanes.caffeine.cache.stats.CacheStats caffeineStats = cache.getNativeCache().stats();
requestCount = caffeineStats.requestCount();
if (requestCount > 0) {
hitRatio = caffeineStats.hitRate();
missRatio = caffeineStats.missRate();
loadCount = caffeineStats.loadCount();
evictionCount = caffeineStats.evictionCount();
hitCount = caffeineStats.hitCount();
missCount = caffeineStats.missCount();
}
}
@Override
public Collection<Metric<?>> toMetrics(final String prefix) {
Collection<Metric<?>> result = new ArrayList<>();
addMetric(result, prefix + "size", size);
addMetric(result, prefix + "eviction.count", evictionCount);
addMetric(result, prefix + "load.count", loadCount);
addMetric(result, prefix + "request.count", requestCount);
addMetric(result, prefix + "hit.count", hitCount);
addMetric(result, prefix + "hit.ratio", hitRatio);
addMetric(result, prefix + "miss.count", missCount);
addMetric(result, prefix + "miss.ratio", missRatio);
return result;
}
@Override
public Long getSize() {
return this.size;
}
@Override
public Double getHitRatio() {
return this.hitRatio;
}
@Override
public Double getMissRatio() {
return this.missRatio;
}
private <T extends Number> void addMetric(Collection<Metric<?>> metrics, String name, T value) {
if (value != null) {
metrics.add(new Metric<T>(name, value));
}
}
}