public long requests() { return stats.requestCount(); }
/** * Returns the ratio of cache requests which were hits. This is defined as * {@code hitCount / requestCount}, or {@code 1.0} when {@code requestCount == 0}. Note that * {@code hitRate + missRate =~ 1.0}. * * @return the ratio of cache requests which were hits */ @NonNegative public double hitRate() { long requestCount = requestCount(); return (requestCount == 0) ? 1.0 : (double) hitCount / requestCount; }
/** * Returns the ratio of cache requests which were misses. This is defined as * {@code missCount / requestCount}, or {@code 0.0} when {@code requestCount == 0}. * Note that {@code hitRate + missRate =~ 1.0}. Cache misses include all requests which * weren't cache hits, including requests which resulted in either successful or failed loading * attempts, and requests which waited for other threads to finish loading. It is thus the case * that {@code missCount >= loadSuccessCount + loadFailureCount}. Multiple * concurrent misses for the same key will result in a single load operation. * * @return the ratio of cache requests which were misses */ @NonNegative public double missRate() { long requestCount = requestCount(); return (requestCount == 0) ? 0.0 : (double) missCount / requestCount; }
private static void checkStats(CacheStats stats, long requestCount, long hitCount, double hitRate, long missCount, double missRate, long loadSuccessCount, long loadFailureCount, double loadExceptionRate, long loadCount, long totalLoadTime, double averageLoadPenalty, long evictionCount, long evictionWeight) { assertThat(stats.requestCount(), is(requestCount)); assertThat(stats.hitCount(), is(hitCount)); assertThat(stats.hitRate(), is(hitRate)); assertThat(stats.missCount(), is(missCount)); assertThat(stats.missRate(), is(missRate)); assertThat(stats.loadSuccessCount(), is(loadSuccessCount)); assertThat(stats.loadFailureCount(), is(loadFailureCount)); assertThat(stats.loadFailureRate(), is(loadExceptionRate)); assertThat(stats.totalLoadTime(), is(totalLoadTime)); assertThat(stats.averageLoadPenalty(), is(averageLoadPenalty)); assertThat(stats.evictionCount(), is(evictionCount)); assertThat(stats.evictionWeight(), is(evictionWeight)); }
@Override public void doMonitor(ServiceEmitter emitter) { final CacheStats oldStats = priorStats.get(); final CacheStats newStats = cache.stats(); final CacheStats deltaStats = newStats.minus(oldStats); final ServiceMetricEvent.Builder builder = ServiceMetricEvent.builder(); emitter.emit(builder.build("query/cache/caffeine/delta/requests", deltaStats.requestCount())); emitter.emit(builder.build("query/cache/caffeine/total/requests", newStats.requestCount())); emitter.emit(builder.build("query/cache/caffeine/delta/loadTime", deltaStats.totalLoadTime())); emitter.emit(builder.build("query/cache/caffeine/total/loadTime", newStats.totalLoadTime())); emitter.emit(builder.build("query/cache/caffeine/delta/evictionBytes", deltaStats.evictionWeight())); emitter.emit(builder.build("query/cache/caffeine/total/evictionBytes", newStats.evictionWeight())); if (!priorStats.compareAndSet(oldStats, newStats)) { // ISE for stack trace log.warn( new IllegalStateException("Multiple monitors"), "Multiple monitors on the same cache causing race conditions and unreliable stats reporting" ); } }
@Override public long requestCount() { return stats.requestCount(); } };
/** * Returns the ratio of cache requests which were hits. This is defined as * {@code hitCount / requestCount}, or {@code 1.0} when {@code requestCount == 0}. Note that * {@code hitRate + missRate =~ 1.0}. * * @return the ratio of cache requests which were hits */ @Nonnegative public double hitRate() { long requestCount = requestCount(); return (requestCount == 0) ? 1.0 : (double) hitCount / requestCount; }
/** * Returns the ratio of cache requests which were misses. This is defined as * {@code missCount / requestCount}, or {@code 0.0} when {@code requestCount == 0}. * Note that {@code hitRate + missRate =~ 1.0}. Cache misses include all requests which * weren't cache hits, including requests which resulted in either successful or failed loading * attempts, and requests which waited for other threads to finish loading. It is thus the case * that {@code missCount >= loadSuccessCount + loadFailureCount}. Multiple * concurrent misses for the same key will result in a single load operation. * * @return the ratio of cache requests which were misses */ @Nonnegative public double missRate() { long requestCount = requestCount(); return (requestCount == 0) ? 0.0 : (double) missCount / requestCount; }
public void testEmpty() { CacheStats stats = new CacheStats(0, 0, 0, 0, 0, 0, 0); assertEquals(0, stats.requestCount()); assertEquals(0, stats.hitCount()); assertEquals(1.0, stats.hitRate()); assertEquals(0, stats.missCount()); assertEquals(0.0, stats.missRate()); assertEquals(0, stats.loadSuccessCount()); assertEquals(0, stats.loadFailureCount()); assertEquals(0.0, stats.loadFailureRate()); assertEquals(0, stats.loadCount()); assertEquals(0, stats.totalLoadTime()); assertEquals(0.0, stats.averageLoadPenalty()); assertEquals(0, stats.evictionCount()); }
public void testSingle() { CacheStats stats = new CacheStats(11, 13, 17, 19, 23, 27, 54); assertEquals(24, stats.requestCount()); assertEquals(11, stats.hitCount()); assertEquals(11.0/24, stats.hitRate()); assertEquals(13, stats.missCount()); assertEquals(13.0/24, stats.missRate()); assertEquals(17, stats.loadSuccessCount()); assertEquals(19, stats.loadFailureCount()); assertEquals(19.0/36, stats.loadFailureRate()); assertEquals(17 + 19, stats.loadCount()); assertEquals(23, stats.totalLoadTime()); assertEquals(23.0/(17 + 19), stats.averageLoadPenalty()); assertEquals(27, stats.evictionCount()); assertEquals(54, stats.evictionWeight()); }
public void testPlus() { CacheStats one = new CacheStats(11, 13, 15, 13, 11, 9, 18); CacheStats two = new CacheStats(53, 47, 41, 39, 37, 35, 70); CacheStats sum = two.plus(one); assertEquals(124, sum.requestCount()); assertEquals(64, sum.hitCount()); assertEquals(64.0/124, sum.hitRate()); assertEquals(60, sum.missCount()); assertEquals(60.0/124, sum.missRate()); assertEquals(56, sum.loadSuccessCount()); assertEquals(52, sum.loadFailureCount()); assertEquals(52.0/108, sum.loadFailureRate()); assertEquals(56 + 52, sum.loadCount()); assertEquals(48, sum.totalLoadTime()); assertEquals(48.0/(56 + 52), sum.averageLoadPenalty()); assertEquals(44, sum.evictionCount()); assertEquals(88, sum.evictionWeight()); assertEquals(sum, one.plus(two)); } }
public void testMinus() { CacheStats one = new CacheStats(11, 13, 17, 19, 23, 27, 54); CacheStats two = new CacheStats(53, 47, 43, 41, 37, 31, 62); CacheStats diff = two.minus(one); assertEquals(76, diff.requestCount()); assertEquals(42, diff.hitCount()); assertEquals(42.0/76, diff.hitRate()); assertEquals(34, diff.missCount()); assertEquals(34.0/76, diff.missRate()); assertEquals(26, diff.loadSuccessCount()); assertEquals(22, diff.loadFailureCount()); assertEquals(22.0/48, diff.loadFailureRate()); assertEquals(26 + 22, diff.loadCount()); assertEquals(14, diff.totalLoadTime()); assertEquals(14.0/(26 + 22), diff.averageLoadPenalty()); assertEquals(4, diff.evictionCount()); assertEquals(8, diff.evictionWeight()); assertEquals(new CacheStats(0, 0, 0, 0, 0, 0, 0), one.minus(two)); }
cacheRequestsTotal.addMetric(cacheName, stats.requestCount()); cacheEvictionTotal.addMetric(cacheName, stats.evictionCount()); cacheSize.addMetric(cacheName, c.getValue().estimatedSize());
/** * The cache should continue to hit, even if variables not used in the cached expression change. */ @Test public void testUnrelatedVariableChange() { // expect miss Object result = execute("TO_UPPER(name)", contextWithCache); assertEquals("BLAH", result); assertEquals(1, cache.stats().requestCount()); assertEquals(1, cache.stats().missCount()); assertEquals(0, cache.stats().hitCount()); // add an irrelevant variable that is not used in the expression fields.put("unrelated_var_1", "true"); fields.put("unrelated_var_2", 22); // still expect a hit result = execute("TO_UPPER(name)", contextWithCache); assertEquals("BLAH", result); assertEquals(2, cache.stats().requestCount()); assertEquals(1, cache.stats().missCount()); assertEquals(1, cache.stats().hitCount()); }
/** * Running the same expression multiple times should hit the cache. */ @Test public void testWithCache() { Object result = execute("TO_UPPER(name)", contextWithCache); assertEquals("BLAH", result); assertEquals(1, cache.stats().requestCount()); assertEquals(1, cache.stats().missCount()); assertEquals(0, cache.stats().hitCount()); result = execute("TO_UPPER(name)", contextWithCache); assertEquals("BLAH", result); assertEquals(2, cache.stats().requestCount()); assertEquals(1, cache.stats().missCount()); assertEquals(1, cache.stats().hitCount()); result = execute("TO_UPPER(name)", contextWithCache); assertEquals("BLAH", result); assertEquals(3, cache.stats().requestCount()); assertEquals(1, cache.stats().missCount()); assertEquals(2, cache.stats().hitCount()); }
@Override public void serialize(CacheStats value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeStartObject(); gen.writeNumberField("requestCount", value.requestCount()); gen.writeNumberField("hitCount", value.hitCount()); gen.writeNumberField("hitRate", value.hitRate()); gen.writeNumberField("missCount", value.missCount()); gen.writeNumberField("missRate", value.missRate()); gen.writeNumberField("loadCount", value.loadCount()); gen.writeNumberField("loadSuccessCount", value.loadSuccessCount()); gen.writeNumberField("loadFailureCount", value.loadFailureCount()); gen.writeNumberField("loadFailureRate", value.loadFailureRate()); gen.writeNumberField("totalLoadTime", value.totalLoadTime()); gen.writeNumberField("averageLoadPenalty", value.averageLoadPenalty()); gen.writeNumberField("evictionCount", value.evictionCount()); gen.writeNumberField("evictionWeight", value.evictionWeight()); gen.writeEndObject(); } }
@Override public void serialize(CacheStats value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeStartObject(); gen.writeNumberField("requestCount", value.requestCount()); gen.writeNumberField("hitCount", value.hitCount()); gen.writeNumberField("hitRate", value.hitRate()); gen.writeNumberField("missCount", value.missCount()); gen.writeNumberField("missRate", value.missRate()); gen.writeNumberField("loadCount", value.loadCount()); gen.writeNumberField("loadSuccessCount", value.loadSuccessCount()); gen.writeNumberField("loadFailureCount", value.loadFailureCount()); gen.writeNumberField("loadFailureRate", value.loadFailureRate()); gen.writeNumberField("totalLoadTime", value.totalLoadTime()); gen.writeNumberField("averageLoadPenalty", value.averageLoadPenalty()); gen.writeNumberField("evictionCount", value.evictionCount()); gen.writeNumberField("evictionWeight", value.evictionWeight()); gen.writeEndObject(); } }
@Override public void doMonitor(ServiceEmitter emitter) { final CacheStats oldStats = priorStats.get(); final CacheStats newStats = cache.stats(); final CacheStats deltaStats = newStats.minus(oldStats); final ServiceMetricEvent.Builder builder = ServiceMetricEvent.builder(); emitter.emit(builder.build("query/cache/caffeine/delta/requests", deltaStats.requestCount())); emitter.emit(builder.build("query/cache/caffeine/total/requests", newStats.requestCount())); emitter.emit(builder.build("query/cache/caffeine/delta/loadTime", deltaStats.totalLoadTime())); emitter.emit(builder.build("query/cache/caffeine/total/loadTime", newStats.totalLoadTime())); emitter.emit(builder.build("query/cache/caffeine/delta/evictionBytes", deltaStats.evictionWeight())); emitter.emit(builder.build("query/cache/caffeine/total/evictionBytes", newStats.evictionWeight())); if (!priorStats.compareAndSet(oldStats, newStats)) { // ISE for stack trace log.warn( new IllegalStateException("Multiple monitors"), "Multiple monitors on the same cache causing race conditions and unreliable stats reporting" ); } }
@Override public void doMonitor(ServiceEmitter emitter) { final CacheStats oldStats = priorStats.get(); final CacheStats newStats = cache.stats(); final CacheStats deltaStats = newStats.minus(oldStats); final ServiceMetricEvent.Builder builder = ServiceMetricEvent.builder(); emitter.emit(builder.build("query/cache/caffeine/delta/requests", deltaStats.requestCount())); emitter.emit(builder.build("query/cache/caffeine/total/requests", newStats.requestCount())); emitter.emit(builder.build("query/cache/caffeine/delta/loadTime", deltaStats.totalLoadTime())); emitter.emit(builder.build("query/cache/caffeine/total/loadTime", newStats.totalLoadTime())); emitter.emit(builder.build("query/cache/caffeine/delta/evictionBytes", deltaStats.evictionWeight())); emitter.emit(builder.build("query/cache/caffeine/total/evictionBytes", newStats.evictionWeight())); if (!priorStats.compareAndSet(oldStats, newStats)) { // ISE for stack trace log.warn( new IllegalStateException("Multiple monitors"), "Multiple monitors on the same cache causing race conditions and unreliable stats reporting" ); } }
public void printCacheStat(String name, Cache<?,?> cache){ CacheStats s = cache.stats(); System.out.printf( "%35s: %6d (EV) %6d (HC) %5.1f (HR) %6d (LC) %6d (LFC) %5.1f (LFR) %6d (LSC) %6d (MC) %5.1f (MR) %6d (RC) %10.1f (ALP) \n", //"%35s: %12.0f (ALP) %f (HR) %d (RC)\n", name, s.evictionCount(), s.hitCount(), s.hitRate(), s.loadCount(), s.loadFailureCount(), s.loadFailureRate(), s.loadSuccessCount(), s.missCount(), s.missRate(), s.requestCount(), s.averageLoadPenalty()); }