Emit metric to track number of put failures Emit cache/chroniclemap/store_put_failures_<cache> metric when failing to put an entry into chronicle-map. Bug: Issue 15594 Change-Id: I1af1e72e32024234f38a5ec51e47e3fd07438312
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapStore.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapStore.java index 1f829bb..bd1d730 100644 --- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapStore.java +++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapStore.java
@@ -15,6 +15,7 @@ package com.googlesource.gerrit.modules.cache.chroniclemap; import com.google.common.flogger.FluentLogger; +import com.google.gerrit.metrics.Counter0; import com.google.gerrit.metrics.Description; import com.google.gerrit.metrics.MetricMaker; import java.io.File; @@ -40,6 +41,7 @@ private final ChronicleMap<KeyWrapper<K>, TimedValue<V>> store; private final ChronicleMapCacheConfig config; + private final ChronicleMapStoreMetrics metrics; ChronicleMapStore( ChronicleMap<KeyWrapper<K>, TimedValue<V>> store, @@ -48,8 +50,7 @@ this.store = store; this.config = config; - - ChronicleMapStoreMetrics metrics = new ChronicleMapStoreMetrics(metricMaker); + this.metrics = new ChronicleMapStoreMetrics(store.name(), metricMaker); metrics.registerCallBackMetrics(this); } @@ -65,6 +66,7 @@ try { store.put(wrappedKey, timedVal); } catch (IllegalArgumentException | IllegalStateException e) { + metrics.incrementPutFailures(); logger.atWarning().withCause(e).log( "[cache %s] Caught exception when inserting entry '%s' in chronicle-map", store.name(), wrappedKey.getValue()); @@ -328,16 +330,31 @@ } private static class ChronicleMapStoreMetrics { - + private final String sanitizedName; private final MetricMaker metricMaker; + private final String name; + private final Counter0 storePutFailures; - ChronicleMapStoreMetrics(MetricMaker metricMaker) { + ChronicleMapStoreMetrics(String name, MetricMaker metricMaker) { + this.name = name; + this.sanitizedName = metricMaker.sanitizeMetricName(name); this.metricMaker = metricMaker; + + this.storePutFailures = + metricMaker.newCounter( + "cache/chroniclemap/store_put_failures_" + sanitizedName, + new Description( + "The number of errors caught when inserting entries in chronicle-map store: " + + name) + .setCumulative() + .setUnit("errors")); + } + + void incrementPutFailures() { + storePutFailures.increment(); } <K, V> void registerCallBackMetrics(ChronicleMapStore<K, V> store) { - String name = store.name(); - String sanitizedName = metricMaker.sanitizeMetricName(name); String PERCENTAGE_FREE_SPACE_METRIC = "cache/chroniclemap/percentage_free_space_" + sanitizedName; String REMAINING_AUTORESIZES_METRIC =
diff --git a/src/main/resources/Documentation/metrics.md b/src/main/resources/Documentation/metrics.md index 013a6c8..2928708 100644 --- a/src/main/resources/Documentation/metrics.md +++ b/src/main/resources/Documentation/metrics.md
@@ -24,4 +24,7 @@ : Constant number of hot keys for the cache that can be kept in memory. * cache/chroniclemap/hot_keys_size_<cache-name> - : The number of hot keys for the cache that are currently in memory. \ No newline at end of file + : The number of hot keys for the cache that are currently in memory. + +* "cache/chroniclemap/store_put_failures_<cache-name> + : The number of errors caught when inserting entries in chronicle-map store \ No newline at end of file
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 a3a75b6..0041c53 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
@@ -17,6 +17,7 @@ import static com.google.common.truth.Truth.assertWithMessage; import static com.google.gerrit.testing.GerritJUnit.assertThrows; +import com.codahale.metrics.Counter; import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; import com.google.gerrit.acceptance.AbstractDaemonTest; @@ -368,12 +369,14 @@ gerritConfig.setInt("cache", testCacheName, "avgValueSize", uuidSize / 2); gerritConfig.save(); - ChronicleMapCacheImpl<String, String> cache = newCacheWithoutLoader(); + ChronicleMapCacheImpl<String, String> cache = newCacheWithMetrics(testCacheName, value); cache.put(key, value); assertThat(cache.getStore().size()).isEqualTo(0); assertThat(cache.getIfPresent(key)).isNull(); + assertThat(getCounter("cache/chroniclemap/store_put_failures_" + testCacheName).getCount()) + .isEqualTo(1L); } @Test @@ -395,6 +398,8 @@ assertThat(cache.getStore().size()).isEqualTo(2); assertThat(cache.getIfPresent(key)).isNull(); + assertThat(getCounter("cache/chroniclemap/store_put_failures_" + testCacheName).getCount()) + .isEqualTo(1L); } @Test @@ -643,4 +648,10 @@ assertWithMessage(name).that(gauge).isNotNull(); return gauge; } + + private Counter getCounter(String name) { + Counter counter = (Counter) metricRegistry.getMetrics().get(name); + assertWithMessage(name).that(counter).isNotNull(); + return counter; + } }