package org.stagemonitor.ehcache;
import com.codahale.metrics.Meter;
import net.sf.ehcache.statistics.CacheUsageListener;
import org.stagemonitor.core.metrics.metrics2.Metric2Registry;
import org.stagemonitor.core.metrics.metrics2.MetricName;
import java.util.concurrent.TimeUnit;
import static com.codahale.metrics.RatioGauge.Ratio;
import static org.stagemonitor.core.metrics.metrics2.MetricName.name;
public class StagemonitorCacheUsageListener implements CacheUsageListener {
private final Metric2Registry registry;
private final boolean timeGet;
private final MetricName allCacheHitsMetricName;
private final MetricName allCacheMissesMetricName;
private final MetricName getMetricName;
private final MetricName deleteEvictionMetricName;
private final MetricName deleteExpireMetricName;
private final MetricName deleteRemovedMetricName;
public StagemonitorCacheUsageListener(String cacheName, Metric2Registry registry, boolean timeGet) {
this.registry = registry;
this.timeGet = timeGet;
allCacheHitsMetricName = name("cache_hits").tag("cache_name", cacheName).tier("All").build();
allCacheMissesMetricName = name("cache_misses").tag("cache_name", cacheName).tier("All").build();
getMetricName = name("cache_get").tag("cache_name", cacheName).tier("All").build();
deleteEvictionMetricName = name("cache_delete").tag("cache_name", cacheName).tag("reason", "eviction").tier("All").build();
deleteExpireMetricName = name("cache_delete").tag("cache_name", cacheName).tag("reason", "expire").tier("All").build();
deleteRemovedMetricName = name("cache_delete").tag("cache_name", cacheName).tag("reason", "remove").tier("All").build();
}
@Override
public void notifyStatisticsEnabledChanged(boolean enableStatistics) {
}
@Override
public void notifyStatisticsCleared() {
}
@Override
public void notifyCacheHitInMemory() {
notifyAllCacheHits();
}
@Override
public void notifyCacheHitOffHeap() {
notifyAllCacheHits();
}
@Override
public void notifyCacheHitOnDisk() {
notifyAllCacheHits();
}
@Override
public void notifyCacheElementPut() {
}
@Override
public void notifyCacheElementUpdated() {
}
@Override
public void notifyCacheMissedWithNotFound() {
notifyAllCacheMisses();
}
@Override
public void notifyCacheMissedWithExpired() {
notifyAllCacheMisses();
}
private void notifyAllCacheHits() {
registry.meter(allCacheHitsMetricName).mark();
}
private void notifyAllCacheMisses() {
registry.meter(allCacheMissesMetricName).mark();
}
public Ratio getHitRatio1Min() {
final Meter hitRate = registry.meter(allCacheHitsMetricName);
final Meter missRate = registry.meter(allCacheMissesMetricName);
final double oneMinuteHitRate = hitRate.getOneMinuteRate();
return Ratio.of(oneMinuteHitRate * 100.0, oneMinuteHitRate + missRate.getOneMinuteRate());
}
@Override
public void notifyCacheMissInMemory() {
notifyAllCacheMisses();
}
@Override
public void notifyCacheMissOffHeap() {
notifyAllCacheMisses();
}
@Override
public void notifyCacheMissOnDisk() {
notifyAllCacheMisses();
}
@Override
@Deprecated
public void notifyTimeTakenForGet(long millis) {
}
@Override
public void notifyGetTimeNanos(long nanos) {
if (timeGet) {
registry.timer(getMetricName).update(nanos, TimeUnit.NANOSECONDS);
} else {
registry.meter(getMetricName).mark();
}
}
@Override
public void notifyCacheElementEvicted() {
registry.meter(deleteEvictionMetricName).mark();
}
@Override
public void notifyCacheElementExpired() {
registry.meter(deleteExpireMetricName).mark();
}
@Override
public void notifyCacheElementRemoved() {
registry.meter(deleteRemovedMetricName).mark();
}
@Override
public void notifyRemoveAll() {
}
@Override
public void notifyStatisticsAccuracyChanged(int statisticsAccuracy) {
}
@Override
public void dispose() {
}
@Override
public void notifyCacheSearch(long executeTime) {
}
@Override
public void notifyXaCommit() {
}
@Override
public void notifyXaRollback() {
}
}