From 89956379c637edec46fd1b5aaddf09b2a95b847c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20St=C3=A4ber?= Date: Sat, 7 Aug 2021 00:00:34 +0200 Subject: [PATCH] Prevent name conflicts and rename jvm_classes_loaded MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fabian Stäber --- .../io/prometheus/client/CollectorRegistry.java | 15 ++++++++++++++- .../client/hotspot/ClassLoadingExports.java | 4 ++-- .../client/hotspot/ClassLoadingExportsTest.java | 4 ++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/simpleclient/src/main/java/io/prometheus/client/CollectorRegistry.java b/simpleclient/src/main/java/io/prometheus/client/CollectorRegistry.java index 55d33287d..0d37cca27 100644 --- a/simpleclient/src/main/java/io/prometheus/client/CollectorRegistry.java +++ b/simpleclient/src/main/java/io/prometheus/client/CollectorRegistry.java @@ -48,10 +48,13 @@ public CollectorRegistry(boolean autoDescribe) { */ public void register(Collector m) { List names = collectorNames(m); + assertNoDuplicateNames(m, names); synchronized (namesCollectorsLock) { for (String name : names) { if (namesToCollectors.containsKey(name)) { - throw new IllegalArgumentException("Collector already registered that provides name: " + name); + throw new IllegalArgumentException("Failed to register Collector of type " + m.getClass().getSimpleName() + + ": " + name + " is already in use by another Collector of type " + + namesToCollectors.get(name).getClass().getSimpleName()); } } for (String name : names) { @@ -61,6 +64,16 @@ public void register(Collector m) { } } + private void assertNoDuplicateNames(Collector m, List names) { + Set uniqueNames = new HashSet(); + for (String name : names) { + if (!uniqueNames.add(name)) { + throw new IllegalArgumentException("Failed to register Collector of type " + m.getClass().getSimpleName() + + ": The Collector exposes the same name multiple times: " + name); + } + } + } + /** * Unregister a Collector. */ diff --git a/simpleclient_hotspot/src/main/java/io/prometheus/client/hotspot/ClassLoadingExports.java b/simpleclient_hotspot/src/main/java/io/prometheus/client/hotspot/ClassLoadingExports.java index 65f86cfba..feeffe11f 100644 --- a/simpleclient_hotspot/src/main/java/io/prometheus/client/hotspot/ClassLoadingExports.java +++ b/simpleclient_hotspot/src/main/java/io/prometheus/client/hotspot/ClassLoadingExports.java @@ -20,7 +20,7 @@ * * Example metrics being exported: *
- *   jvm_classes_loaded{} 1000
+ *   jvm_classes_currently_loaded{} 1000
  *   jvm_classes_loaded_total{} 2000
  *   jvm_classes_unloaded_total{} 500
  * 
@@ -38,7 +38,7 @@ public ClassLoadingExports(ClassLoadingMXBean clBean) { void addClassLoadingMetrics(List sampleFamilies) { sampleFamilies.add(new GaugeMetricFamily( - "jvm_classes_loaded", + "jvm_classes_currently_loaded", "The number of classes that are currently loaded in the JVM", clBean.getLoadedClassCount())); sampleFamilies.add(new CounterMetricFamily( diff --git a/simpleclient_hotspot/src/test/java/io/prometheus/client/hotspot/ClassLoadingExportsTest.java b/simpleclient_hotspot/src/test/java/io/prometheus/client/hotspot/ClassLoadingExportsTest.java index 62370dc67..b407e00d3 100644 --- a/simpleclient_hotspot/src/test/java/io/prometheus/client/hotspot/ClassLoadingExportsTest.java +++ b/simpleclient_hotspot/src/test/java/io/prometheus/client/hotspot/ClassLoadingExportsTest.java @@ -13,7 +13,7 @@ public class ClassLoadingExportsTest { private ClassLoadingMXBean mockClassLoadingsBean = Mockito.mock(ClassLoadingMXBean.class); - private CollectorRegistry registry = new CollectorRegistry(); + private CollectorRegistry registry = new CollectorRegistry(true); private ClassLoadingExports collectorUnderTest; private static final String[] EMPTY_LABEL = new String[0]; @@ -31,7 +31,7 @@ public void testClassLoading() { assertEquals( 1000, registry.getSampleValue( - "jvm_classes_loaded", EMPTY_LABEL, EMPTY_LABEL), + "jvm_classes_currently_loaded", EMPTY_LABEL, EMPTY_LABEL), .0000001); assertEquals( 2000L,