Expose max auto resizes metric Currently, only the number of auto resizes is exposed as a metric. When this value reaches 0 it is no longer possible to expand the cache. However, it is not possible to know the maximum number of auto-resizes that the cache could go through. Expose the maximum number of auto-resizes as a metric, so that can be used together with the remaining auto-resizes to evaluate the overall utilization of the cache. Bug: Issue 15458 Change-Id: Ie81684950a28f3e2420bddfcaa10b7db218d00fb
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheImpl.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheImpl.java index 04ef4d7..76ae8a4 100644 --- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheImpl.java +++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheImpl.java
@@ -66,7 +66,7 @@ this.mem = memLoader.asInMemoryCacheBypass(); ChronicleMapStorageMetrics metrics = new ChronicleMapStorageMetrics(new DisabledMetricMaker()); - metrics.registerCallBackMetrics(def.name(), store, hotEntries); + metrics.registerCallBackMetrics(def.name(), this); } ChronicleMapCacheImpl( @@ -87,7 +87,7 @@ this.store = store; ChronicleMapStorageMetrics metrics = new ChronicleMapStorageMetrics(metricMaker); - metrics.registerCallBackMetrics(def.name(), store, hotEntries); + metrics.registerCallBackMetrics(def.name(), this); } @SuppressWarnings({"unchecked", "cast", "rawtypes"}) @@ -153,13 +153,13 @@ this.metricMaker = metricMaker; } - <K, V> void registerCallBackMetrics( - String name, ChronicleMap<KeyWrapper<K>, TimedValue<V>> store, InMemoryLRU<K> hotEntries) { + <K, V> void registerCallBackMetrics(String name, ChronicleMapCacheImpl<K, V> cache) { String sanitizedName = metricMaker.sanitizeMetricName(name); String PERCENTAGE_FREE_SPACE_METRIC = "cache/chroniclemap/percentage_free_space_" + sanitizedName; String REMAINING_AUTORESIZES_METRIC = "cache/chroniclemap/remaining_autoresizes_" + sanitizedName; + String MAX_AUTORESIZES_METRIC = "cache/chroniclemap/max_autoresizes_" + sanitizedName; String HOT_KEYS_CAPACITY_METRIC = "cache/chroniclemap/hot_keys_capacity_" + sanitizedName; String HOT_KEYS_SIZE_METRIC = "cache/chroniclemap/hot_keys_size_" + sanitizedName; @@ -168,7 +168,7 @@ Long.class, new Description( String.format("The amount of free space in the %s cache as a percentage", name)), - () -> (long) store.percentageFreeSpace()); + () -> (long) cache.store.percentageFreeSpace()); metricMaker.newCallbackMetric( REMAINING_AUTORESIZES_METRIC, @@ -176,11 +176,11 @@ new Description( String.format( "The number of times the %s cache can automatically expand its capacity", name)), - store::remainingAutoResizes); + cache.store::remainingAutoResizes); metricMaker.newConstantMetric( HOT_KEYS_CAPACITY_METRIC, - hotEntries.getCapacity(), + cache.hotEntries.getCapacity(), new Description( String.format( "The number of hot cache keys for %s cache that can be kept in memory", name))); @@ -191,7 +191,15 @@ new Description( String.format( "The number of hot cache keys for %s cache that are currently in memory", name)), - hotEntries::size); + cache.hotEntries::size); + + metricMaker.newConstantMetric( + MAX_AUTORESIZES_METRIC, + cache.maxAutoResizes(), + new Description( + String.format( + "The maximum number of times the %s cache can automatically expand its capacity", + name))); } } @@ -415,9 +423,13 @@ * (`getExtraTiersInUse`) shows the overall percentage. */ VanillaChronicleMap vanillaStore = (VanillaChronicleMap) store; - double maxResizes = config.getMaxBloatFactor() * vanillaStore.actualSegments; long usedResizes = vanillaStore.globalMutableState().getExtraTiersInUse(); - return usedResizes * 100 / maxResizes; + return usedResizes * 100 / maxAutoResizes(); + } + + @SuppressWarnings("rawtypes") + public double maxAutoResizes() { + return config.getMaxBloatFactor() * ((VanillaChronicleMap) store).actualSegments; } public String name() {
diff --git a/src/main/resources/Documentation/metrics.md b/src/main/resources/Documentation/metrics.md index 8e176ef..013a6c8 100644 --- a/src/main/resources/Documentation/metrics.md +++ b/src/main/resources/Documentation/metrics.md
@@ -17,6 +17,9 @@ See the [official documentation](https://javadoc.io/static/net.openhft/chronicle-map/3.20.83/net/openhft/chronicle/map/ChronicleMap.html#remainingAutoResizes--) for more information. +* cache/chroniclemap/max_autoresizes_<cache-name> + : The maximum number of times the cache can automatically expand its capacity. + * cache/chroniclemap/hot_keys_capacity_<cache-name> : Constant number of hot keys for the cache that can be kept in memory.
diff --git a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheTest.java b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheTest.java index 91ddbe3..6cc4c05 100644 --- a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheTest.java +++ b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheTest.java
@@ -403,6 +403,21 @@ } @Test + public void shouldTriggerMaxAutoResizeMetric() throws Exception { + String cachedValue = UUID.randomUUID().toString(); + String maxAutoResizeMetricName = "cache/chroniclemap/max_autoresizes_" + testCacheName; + gerritConfig.setInt("cache", testCacheName, "maxEntries", 2); + gerritConfig.setInt("cache", testCacheName, "avgKeySize", cachedValue.getBytes().length); + gerritConfig.setInt("cache", testCacheName, "avgValueSize", valueSize(cachedValue)); + gerritConfig.setInt("cache", testCacheName, "maxBloatFactor", 3); + gerritConfig.save(); + + newCacheWithMetrics(testCacheName, cachedValue); + + assertThat(getMetric(maxAutoResizeMetricName).getValue()).isEqualTo(3); + } + + @Test public void shouldTriggerHotKeysCapacityCacheMetric() throws Exception { String cachedValue = UUID.randomUUID().toString(); int percentageHotKeys = 60; @@ -487,6 +502,7 @@ String hotKeySizeMetricName = "cache/chroniclemap/hot_keys_size_" + sanitized; String percentageFreeMetricName = "cache/chroniclemap/percentage_free_space_" + sanitized; String autoResizeMetricName = "cache/chroniclemap/remaining_autoresizes_" + sanitized; + String maxAutoResizeMetricName = "cache/chroniclemap/max_autoresizes_" + sanitized; String hotKeyCapacityMetricName = "cache/chroniclemap/hot_keys_capacity_" + sanitized; newCacheWithMetrics(cacheName, null); @@ -494,6 +510,7 @@ getMetric(hotKeySizeMetricName); getMetric(percentageFreeMetricName); getMetric(autoResizeMetricName); + getMetric(maxAutoResizeMetricName); getMetric(hotKeyCapacityMetricName); }