From 66368f4d2e60f68161c0df2e69b0af905143d414 Mon Sep 17 00:00:00 2001 From: Tommy Ludwig <8924140+shakuzen@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:15:25 +0900 Subject: [PATCH] Log warning and do nothing on double binding to same registry --- .../binder/logging/Log4j2Metrics.java | 8 ++++++ .../binder/logging/Log4j2MetricsTest.java | 27 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/Log4j2Metrics.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/Log4j2Metrics.java index 355c6452e0..0fa8aaa88c 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/Log4j2Metrics.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/binder/logging/Log4j2Metrics.java @@ -17,6 +17,8 @@ import io.micrometer.common.lang.NonNullApi; import io.micrometer.common.lang.NonNullFields; +import io.micrometer.common.util.internal.logging.InternalLogger; +import io.micrometer.common.util.internal.logging.InternalLoggerFactory; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Tag; @@ -60,6 +62,8 @@ public class Log4j2Metrics implements MeterBinder, AutoCloseable { private static final String METER_DESCRIPTION = "Number of log events"; + private static final InternalLogger logger = InternalLoggerFactory.getInstance(Log4j2Metrics.class); + private final Iterable tags; private final LoggerContext loggerContext; @@ -83,6 +87,10 @@ public Log4j2Metrics(Iterable tags, LoggerContext loggerContext) { @Override public void bindTo(MeterRegistry registry) { + if (metricsFilters.containsKey(registry)) { + logger.warn("This Log4j2Metrics instance has already been bound to the registry {}", registry); + return; + } Configuration configuration = loggerContext.getConfiguration(); registerMetricsFilter(configuration, registry); loggerContext.updateLoggers(configuration); diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/logging/Log4j2MetricsTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/logging/Log4j2MetricsTest.java index 69c29f4b7e..e4987fabbb 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/logging/Log4j2MetricsTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/binder/logging/Log4j2MetricsTest.java @@ -341,4 +341,31 @@ void shouldNotRebindMetricsIfBinderIsClosed() { assertThat(registry.get("log4j2.events").tags("level", "error").counter().count()).isEqualTo(1); } + @Test + void bindingTwiceToSameRegistry_doesNotDoubleCount() { + LoggerContext context = new LoggerContext("test"); + Logger logger = context.getLogger("com.test"); + + try (Log4j2Metrics metrics = new Log4j2Metrics(emptyList(), context)) { + // binding twice + metrics.bindTo(registry); + metrics.bindTo(registry); + + logger.error("first"); + + assertThat(registry.get("log4j2.events").tags("level", "error").counter().count()).isEqualTo(1); + + context.reconfigure(); + + logger.error("second"); + assertThat(registry.get("log4j2.events").tags("level", "error").counter().count()).isEqualTo(2); + } + + // no additional events should be counted now + context.reconfigure(); + + logger.error("third"); + assertThat(registry.get("log4j2.events").tags("level", "error").counter().count()).isEqualTo(2); + } + }