Fix 'invalid metric name' error
MetricMaker only allows certain characters to be used when registering a
new metric name, raising an 'IllegalArgumentException' when the provided
metric contains invalid characters.
This in turns prevents the chronicle-map cache from being created.
Sanitize the name of the cache before registering the new metric, so
that invalid characters are replaced by '_'.
Bug: Issue 14098
Change-Id: Id62a0755245179c8d27f67a4a4c99b5f32bbeb72
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 e85e553..311445b 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
@@ -118,10 +118,13 @@
<K, V> void registerCallBackMetrics(
String name, ChronicleMap<K, TimedValue<V>> store, InMemoryLRU<K> hotEntries) {
- String PERCENTAGE_FREE_SPACE_METRIC = "cache/chroniclemap/percentage_free_space_" + name;
- String REMAINING_AUTORESIZES_METRIC = "cache/chroniclemap/remaining_autoresizes_" + name;
- String HOT_KEYS_CAPACITY_METRIC = "cache/chroniclemap/hot_keys_capacity_" + name;
- String HOT_KEYS_SIZE_METRIC = "cache/chroniclemap/hot_keys_size_" + name;
+ 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 HOT_KEYS_CAPACITY_METRIC = "cache/chroniclemap/hot_keys_capacity_" + sanitizedName;
+ String HOT_KEYS_SIZE_METRIC = "cache/chroniclemap/hot_keys_size_" + sanitizedName;
metricMaker.newCallbackMetric(
PERCENTAGE_FREE_SPACE_METRIC,
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 f8ef939..e8c1f4a 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
@@ -469,6 +469,23 @@
() -> (int) getMetric(hotKeysSizeMetricName).getValue() == 0, METRIC_TRIGGER_TIMEOUT);
}
+ @Test
+ public void shouldSanitizeUnwantedCharsInMetricNames() throws Exception {
+ String cacheName = "very+confusing.cache#name";
+ String sanitized = "very_confusing_cache_name";
+ String hotKeySizeMetricName = "cache/chroniclemap/hot_keys_size_" + sanitized;
+ String percentageFreeMetricName = "cache/chroniclemap/percentage_free_space_" + sanitized;
+ String autoResizeMetricName = "cache/chroniclemap/remaining_autoresizes_" + sanitized;
+ String hotKeyCapacityMetricName = "cache/chroniclemap/hot_keys_capacity_" + sanitized;
+
+ newCacheWithMetrics(cacheName);
+
+ getMetric(hotKeySizeMetricName);
+ getMetric(percentageFreeMetricName);
+ getMetric(autoResizeMetricName);
+ getMetric(hotKeyCapacityMetricName);
+ }
+
private int valueSize(String value) {
final TimedValueMarshaller<String> marshaller =
new TimedValueMarshaller<>(StringCacheSerializer.INSTANCE);