diff --git a/implementations/micrometer-registry-prometheus/src/main/java/io/micrometer/prometheus/PrometheusMeterRegistry.java b/implementations/micrometer-registry-prometheus/src/main/java/io/micrometer/prometheus/PrometheusMeterRegistry.java index 08114dc903..2a8bd71c94 100644 --- a/implementations/micrometer-registry-prometheus/src/main/java/io/micrometer/prometheus/PrometheusMeterRegistry.java +++ b/implementations/micrometer-registry-prometheus/src/main/java/io/micrometer/prometheus/PrometheusMeterRegistry.java @@ -420,7 +420,7 @@ private void applyToCollector(Meter.Id id, Consumer consume " set of tag keys. There is already an existing meter named '" + id.getName() + "' containing tag keys [" + String.join(", ", collectorMap.get(getConventionName(id)).getTagKeys()) + "]. The meter you are attempting to register" + " has keys [" + getConventionTags(id).stream().map(Tag::getKey).collect(joining(", ")) + "]."); - return null; + return existingCollector; }); } diff --git a/implementations/micrometer-registry-prometheus/src/test/java/io/micrometer/prometheus/PrometheusMeterRegistryTest.java b/implementations/micrometer-registry-prometheus/src/test/java/io/micrometer/prometheus/PrometheusMeterRegistryTest.java index e4c3912a71..e36419f415 100644 --- a/implementations/micrometer-registry-prometheus/src/test/java/io/micrometer/prometheus/PrometheusMeterRegistryTest.java +++ b/implementations/micrometer-registry-prometheus/src/test/java/io/micrometer/prometheus/PrometheusMeterRegistryTest.java @@ -63,6 +63,14 @@ void before() { registry.config().namingConvention(new PrometheusDurationNamingConvention()); } + @Test + void metersWithSameNameAndDifferentTagsContinueSilently() { + String meterName = "my.counter"; + registry.counter(meterName, "k1", "v1"); + registry.counter(meterName, "k2", "v2"); + registry.counter(meterName, "k3", "v3"); + } + @Test void meterRegistrationFailedListenerCalledOnSameNameDifferentTags() throws InterruptedException { CountDownLatch failedLatch = new CountDownLatch(1); @@ -75,10 +83,13 @@ void meterRegistrationFailedListenerCalledOnSameNameDifferentTags() throws Inter assertThatThrownBy(() -> registry .throwExceptionOnRegistrationFailure() .counter("my.counter", "k1", "v1") - ).isInstanceOf(IllegalArgumentException.class); + ) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("Prometheus requires that all meters with the same name have the same set of tag keys."); assertThatThrownBy(() -> registry.counter("my.counter", "k2", "v2")) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class) + .hasMessageStartingWith("Prometheus requires that all meters with the same name have the same set of tag keys."); } @Test