com.github.benmanes.caffeine.cache.stats.StatsCounter Maven / Gradle / Ivy
/*
* Copyright 2014 Ben Manes. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.github.benmanes.caffeine.cache.stats;
import java.util.Map;
import org.checkerframework.checker.index.qual.NonNegative;
import org.checkerframework.checker.nullness.qual.NonNull;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.RemovalCause;
/**
* Accumulates statistics during the operation of a {@link Cache} for presentation by
* {@link Cache#stats}. This is solely intended for consumption by {@code Cache} implementors.
*
* @author [email protected] (Ben Manes)
*/
public interface StatsCounter {
/**
* Records cache hits. This should be called when a cache request returns a cached value.
*
* @param count the number of hits to record
*/
void recordHits(@NonNegative int count);
/**
* Records cache misses. This should be called when a cache request returns a value that was not
* found in the cache. This method should be called by the loading thread, as well as by threads
* blocking on the load. Multiple concurrent calls to {@link Cache} lookup methods with the same
* key on an absent value should result in a single call to either {@code recordLoadSuccess} or
* {@code recordLoadFailure} and multiple calls to this method, despite all being served by the
* results of a single load operation.
*
* @param count the number of misses to record
*/
void recordMisses(@NonNegative int count);
/**
* Records the successful load of a new entry. This method should be called when a cache request
* causes an entry to be loaded (such as by {@link Cache#get} or {@link Map#computeIfAbsent}) and
* the loading completes successfully. In contrast to {@link #recordMisses}, this method should
* only be called by the loading thread.
*
* @param loadTime the number of nanoseconds the cache spent computing or retrieving the new value
*/
void recordLoadSuccess(@NonNegative long loadTime);
/**
* Records the failed load of a new entry. This method should be called when a cache request
* causes an entry to be loaded (such as by {@link Cache#get} or {@link Map#computeIfAbsent}), but
* an exception is thrown while loading the entry or the loading function returns null. In
* contrast to {@link #recordMisses}, this method should only be called by the loading thread.
*
* @param loadTime the number of nanoseconds the cache spent computing or retrieving the new value
* prior to discovering the value doesn't exist or an exception being thrown
*/
void recordLoadFailure(@NonNegative long loadTime);
/**
* Records the eviction of an entry from the cache. This should only been called when an entry is
* evicted due to the cache's eviction strategy, and not as a result of manual
* {@link Cache#invalidate invalidations}.
*
* @deprecated Use {@link StatsCounter#recordEviction(int, RemovalCause)} instead. This method is
* scheduled for removal in version 3.0.0.
*/
@Deprecated
void recordEviction();
/**
* Records the eviction of an entry from the cache. This should only been called when an entry is
* evicted due to the cache's eviction strategy, and not as a result of manual
* {@link Cache#invalidate invalidations}.
*
* @param weight the weight of the evicted entry
* @deprecated Use {@link StatsCounter#recordEviction(int, RemovalCause)} instead. This method is
* scheduled for removal in version 3.0.0.
*/
@Deprecated
default void recordEviction(@NonNegative int weight) {
recordEviction();
}
/**
* Records the eviction of an entry from the cache. This should only been called when an entry is
* evicted due to the cache's eviction strategy, and not as a result of manual
* {@link Cache#invalidate invalidations}.
*
* @param weight the weight of the evicted entry
* @param cause the reason for which the entry was removed
*/
default void recordEviction(@NonNegative int weight, RemovalCause cause) {
// This method will be abstract in version 3.0.0
recordEviction(weight);
}
/**
* Returns a snapshot of this counter's values. Note that this may be an inconsistent view, as it
* may be interleaved with update operations.
*
* Note: the values of the metrics are undefined in case of overflow (though it is
* guaranteed not to throw an exception). If you require specific handling, we recommend
* implementing your own stats collector.
*
* @return a snapshot of this counter's values
*/
@NonNull
CacheStats snapshot();
/**
* Returns an accumulator that does not record any cache events.
*
* @return an accumulator that does not record metrics
*/
static @NonNull StatsCounter disabledStatsCounter() {
return DisabledStatsCounter.INSTANCE;
}
/**
* Returns an accumulator that suppresses and logs any exception thrown by the delegate
* {@code statsCounter}.
*
* @param statsCounter the accumulator to delegate to
* @return an accumulator that suppresses and logs any exception thrown by the delegate
*/
static @NonNull StatsCounter guardedStatsCounter(@NonNull StatsCounter statsCounter) {
return (statsCounter instanceof GuardedStatsCounter)
? statsCounter
: new GuardedStatsCounter(statsCounter);
}
}