package io.prometheus.client.guava.cache; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import io.prometheus.client.CollectorRegistry; import org.junit.Test; import java.util.Arrays; import static org.assertj.core.api.Java6Assertions.assertThat; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class CacheMetricsCollectorTest { @Test public void cacheExposesMetricsForHitMissAndEviction() throws Exception { Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(2).recordStats().build(); CollectorRegistry registry = new CollectorRegistry(); CacheMetricsCollector collector = new CacheMetricsCollector().register(registry); collector.addCache("users", cache); cache.getIfPresent("user1"); cache.getIfPresent("user1"); cache.put("user1", "First User"); cache.getIfPresent("user1"); // Add to cache to trigger eviction. cache.put("user2", "Second User"); cache.put("user3", "Third User"); cache.put("user4", "Fourth User"); assertMetric(registry, "guava_cache_hit_total", "users", 1.0); assertMetric(registry, "guava_cache_miss_total", "users", 2.0); assertMetric(registry, "guava_cache_requests_total", "users", 3.0); assertMetric(registry, "guava_cache_eviction_total", "users", 2.0); } @SuppressWarnings("unchecked") @Test public void loadingCacheExposesMetricsForLoadsAndExceptions() throws Exception { CacheLoader<String, String> loader = mock(CacheLoader.class); when(loader.load(anyString())) .thenReturn("First User") .thenThrow(new RuntimeException("Seconds time fails")) .thenReturn("Third User"); LoadingCache<String, String> cache = CacheBuilder.newBuilder().recordStats().build(loader); CollectorRegistry registry = new CollectorRegistry(); CacheMetricsCollector collector = new CacheMetricsCollector().register(registry); collector.addCache("loadingusers", cache); cache.get("user1"); cache.get("user1"); try{ cache.get("user2"); } catch (Exception e) { // ignoring. } cache.get("user3"); assertMetric(registry, "guava_cache_hit_total", "loadingusers", 1.0); assertMetric(registry, "guava_cache_miss_total", "loadingusers", 3.0); assertMetric(registry, "guava_cache_load_failure_total", "loadingusers", 1.0); assertMetric(registry, "guava_cache_loads_total", "loadingusers", 3.0); assertMetric(registry, "guava_cache_load_duration_seconds_count", "loadingusers", 3.0); assertMetricGreatThan(registry, "guava_cache_load_duration_seconds_sum", "loadingusers", 0.0); } private void assertMetric(CollectorRegistry registry, String name, String cacheName, double value) { assertThat(registry.getSampleValue(name, new String[]{"cache"}, new String[]{cacheName})).isEqualTo(value); } private void assertMetricGreatThan(CollectorRegistry registry, String name, String cacheName, double value) { assertThat(registry.getSampleValue(name, new String[]{"cache"}, new String[]{cacheName})).isGreaterThan(value); } }