Expose remaining auto resizes free metric
Expose the number of times the cache can automatically expand its
capacity.
Feature: Issue 13940
Change-Id: Id0ca170b1c3e80fbf875fd6d1b8fb76974a72c88
diff --git a/metrics.md b/metrics.md
index aeb6679..85e2745 100644
--- a/metrics.md
+++ b/metrics.md
@@ -9,4 +9,10 @@
: the amount of free space left in the cache as a percentage.
See the [official documentation](https://javadoc.io/static/net.openhft/chronicle-map/3.20.83/net/openhft/chronicle/map/ChronicleMap.html#percentageFreeSpace--)
+ for more information.
+
+* cache/chroniclemap/remaining_autoresizes_<cache-name>
+ : the number of times the cache can automatically expand its capacity.
+
+ 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.
\ No newline at end of file
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 a7a5589..6b95702 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
@@ -122,6 +122,7 @@
<K, V> void registerCallBackMetrics(String name, ChronicleMap<K, TimedValue<V>> store) {
String PERCENTAGE_FREE_SPACE_METRIC = "cache/chroniclemap/percentage_free_space_" + name;
+ String REMAINING_AUTORESIZES_METRIC = "cache/chroniclemap/remaining_autoresizes_" + name;
metricMaker.newCallbackMetric(
PERCENTAGE_FREE_SPACE_METRIC,
@@ -129,6 +130,14 @@
new Description(
String.format("The amount of free space in the %s cache as a percentage", name)),
() -> (long) store.percentageFreeSpace());
+
+ metricMaker.newCallbackMetric(
+ REMAINING_AUTORESIZES_METRIC,
+ Integer.class,
+ new Description(
+ String.format(
+ "The number of times the %s cache can automatically expand its capacity", name)),
+ store::remainingAutoResizes);
}
}
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 e8f8e7d..459e2f2 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
@@ -370,6 +370,27 @@
() -> (long) getMetric(freeSpaceMetricName).getValue() < 100, Duration.ofSeconds(2));
}
+ @Test
+ public void shouldTriggerRemainingAutoResizeMetric() throws Exception {
+ String cachedValue = UUID.randomUUID().toString();
+ String autoResizeMetricName = "cache/chroniclemap/remaining_autoresizes_" + cachedValue;
+ gerritConfig.setInt("cache", cachedValue, "maxEntries", 2);
+ gerritConfig.setInt("cache", cachedValue, "avgKeySize", cachedValue.getBytes().length);
+ gerritConfig.setInt("cache", cachedValue, "avgValueSize", valueSize(cachedValue));
+ gerritConfig.save();
+
+ ChronicleMapCacheImpl<String, String> cache = newCacheWithMetrics(cachedValue);
+
+ assertThat(getMetric(autoResizeMetricName).getValue()).isEqualTo(1);
+
+ cache.put(cachedValue + "1", cachedValue);
+ cache.put(cachedValue + "2", cachedValue);
+ cache.put(cachedValue + "3", cachedValue);
+
+ WaitUtil.waitUntil(
+ () -> (int) getMetric(autoResizeMetricName).getValue() == 0, Duration.ofSeconds(2));
+ }
+
private int valueSize(String value) {
final TimedValueMarshaller<String> marshaller =
new TimedValueMarshaller<>(StringCacheSerializer.INSTANCE);