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 CacheStats stats() { com.github.benmanes.caffeine.cache.stats.CacheStats stats = cache.stats(); return new CacheStats(stats.hitCount(), stats.missCount(), stats.loadSuccessCount(), stats.loadFailureCount(), stats.totalLoadTime(), stats.evictionCount()); }
@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 org.apache.druid.client.cache.CacheStats getStats() { final CacheStats stats = cache.stats(); final long size = cache .policy().eviction() .map(eviction -> eviction.isWeighted() ? eviction.weightedSize() : OptionalLong.empty()) .orElse(OptionalLong.empty()).orElse(-1); return new org.apache.druid.client.cache.CacheStats( stats.hitCount(), stats.missCount(), cache.estimatedSize(), size, stats.evictionCount(), 0, stats.loadFailureCount() ); }
cacheEvictionWeight.addMetric(cacheName, stats.evictionWeight()); } catch (Exception e) { cacheHitTotal.addMetric(cacheName, stats.hitCount()); cacheMissTotal.addMetric(cacheName, stats.missCount()); cacheRequestsTotal.addMetric(cacheName, stats.requestCount()); cacheEvictionTotal.addMetric(cacheName, stats.evictionCount()); cacheSize.addMetric(cacheName, c.getValue().estimatedSize()); cacheLoadFailure.addMetric(cacheName, stats.loadFailureCount()); cacheLoadTotal.addMetric(cacheName, stats.loadCount()); cacheLoadSummary.addMetric(cacheName, stats.loadCount(), stats.totalLoadTime() / Collector.NANOSECONDS_PER_SECOND);
/** * 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()); }
CaffeineMetrics(MeterRegistry parent, MeterIdPrefix idPrefix) { this.parent = requireNonNull(parent, "parent"); this.idPrefix = requireNonNull(idPrefix, "idPrefix"); final String requests = idPrefix.name("requests"); parent.more().counter(requests, idPrefix.tags("result", "hit"), this, func(HIT_COUNT, ref -> ref.cacheStats.hitCount())); parent.more().counter(requests, idPrefix.tags("result", "miss"), this, func(MISS_COUNT, ref -> ref.cacheStats.missCount())); parent.more().counter(idPrefix.name("evictions"), idPrefix.tags(), this, func(EVICTION_COUNT, ref -> ref.cacheStats.evictionCount())); parent.more().counter(idPrefix.name("evictionWeight"), idPrefix.tags(), this, func(EVICTION_WEIGHT, ref -> ref.cacheStats.evictionWeight())); parent.gauge(idPrefix.name("estimatedSize"), idPrefix.tags(), this, func(null, ref -> ref.estimatedSize)); }
assertThat(stats2.missCount()).isEqualTo(stats1.missCount() + 1); final CacheStats stats3 = cacheStatsSupplier.get(); assertThat(stats3.missCount()).isEqualTo(stats2.missCount() + 1); assertThat(stats5.hitCount()).isEqualTo(stats4.hitCount() + 2); assertThat(stats5.missCount()).isEqualTo(stats4.missCount());
derivedGauge(stats -> stats.hitCount() / (1.0d * stats.requestCount()))); derivedGauge(stats -> stats.missCount() / (1.0d * stats.requestCount()))); derivedGauge(stats -> stats.averageLoadPenalty() / 1000000.0d));
@Override protected void doHealthCheck(Health.Builder builder) throws Exception { CacheStats stats = this.cache.stats(); builder.up().withDetail("evictionCount", stats.evictionCount()); builder.up().withDetail("hitRate", stats.hitRate()); builder.up().withDetail("missRate", stats.missRate()); builder.up().withDetail("hitCount", stats.hitCount()); } }
public long misses() { return stats.missCount(); }
public long hits() { return stats.hitCount(); }
void add(Cache<?, ?> cache, Ticker ticker) { synchronized (cacheRefs) { for (CacheReference ref : cacheRefs) { if (ref.get() == cache) { // Do not aggregate more than once for the same instance. return; } } cacheRefs.add(new CacheReference(cache, ticker)); } if (cache instanceof LoadingCache && hasLoadingCache.compareAndSet(false, true)) { // Add the following meters only for LoadingCache and only once. final String loads = idPrefix.name("loads"); parent.more().counter(loads, idPrefix.tags("result", "success"), this, func(LOAD_SUCCESS_COUNT, ref -> ref.cacheStats.loadSuccessCount())); parent.more().counter(loads, idPrefix.tags("result", "failure"), this, func(LOAD_FAILURE_COUNT, ref -> ref.cacheStats.loadFailureCount())); parent.more().counter(idPrefix.name("loadDuration"), idPrefix.tags(), this, func(TOTAL_LOAD_TIME, ref -> ref.cacheStats.totalLoadTime())); } }
public long evictions() { return stats.evictionCount(); }
public long requests() { return stats.requestCount(); }
public double hitRate() { return stats.hitRate(); }
public long totalLoadTime() { return stats.totalLoadTime(); }
public long errors() { return stats.loadFailureCount(); }
/** * Gets the sum of the weights of evicted entries from the class cache. */ public long getClassCacheEvictionWeight() { return classMap.stats().evictionWeight(); }
public double missRate() { return stats.missRate(); }