diff --git a/micrometer-core/src/main/java/io/micrometer/core/instrument/logging/LoggingMeterRegistry.java b/micrometer-core/src/main/java/io/micrometer/core/instrument/logging/LoggingMeterRegistry.java index 5b86d276d8..d275472d90 100644 --- a/micrometer-core/src/main/java/io/micrometer/core/instrument/logging/LoggingMeterRegistry.java +++ b/micrometer-core/src/main/java/io/micrometer/core/instrument/logging/LoggingMeterRegistry.java @@ -30,6 +30,7 @@ import io.micrometer.core.instrument.step.StepTimer; import io.micrometer.core.instrument.util.NamedThreadFactory; import io.micrometer.core.instrument.util.TimeUtils; +import io.micrometer.core.lang.Nullable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -37,6 +38,7 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.StreamSupport; import static io.micrometer.core.instrument.util.DoubleFormat.decimalOrNan; @@ -52,19 +54,24 @@ public class LoggingMeterRegistry extends StepMeterRegistry { private final LoggingRegistryConfig config; private final Consumer loggingSink; + private final Function meterIdPrinter; public LoggingMeterRegistry() { this(LoggingRegistryConfig.DEFAULT, Clock.SYSTEM); } public LoggingMeterRegistry(LoggingRegistryConfig config, Clock clock) { - this(config, clock, new NamedThreadFactory("logging-metrics-publisher"), defaultLoggingSink()); + this(config, clock, new NamedThreadFactory("logging-metrics-publisher"), defaultLoggingSink(), null); } - private LoggingMeterRegistry(LoggingRegistryConfig config, Clock clock, ThreadFactory threadFactory, Consumer loggingSink) { + private LoggingMeterRegistry(LoggingRegistryConfig config, Clock clock, ThreadFactory threadFactory, Consumer loggingSink, @Nullable Function meterIdPrinter) { super(config, clock); this.config = config; this.loggingSink = loggingSink; + if (meterIdPrinter == null) { + meterIdPrinter = defaultMeterIdPrinter(); + } + this.meterIdPrinter = meterIdPrinter; config().namingConvention(NamingConvention.dot); start(threadFactory); } @@ -86,6 +93,12 @@ private static Consumer defaultLoggingSink() { } } + private Function defaultMeterIdPrinter() { + return (meter) -> getConventionName(meter.getId()) + getConventionTags(meter.getId()).stream() + .map(t -> t.getKey() + "=" + t.getValue()) + .collect(joining(",", "{", "}")); + } + @Override public void start(ThreadFactory threadFactory) { if (config.enabled()) { @@ -200,9 +213,7 @@ class Printer { } String id() { - return getConventionName(meter.getId()) + getConventionTags(meter.getId()).stream() - .map(t -> t.getKey() + "=" + t.getValue()) - .collect(joining(",", "{", "}")); + return meterIdPrinter.apply(meter); } String time(double time) { @@ -254,6 +265,8 @@ public static class Builder { private Clock clock = Clock.SYSTEM; private ThreadFactory threadFactory = new NamedThreadFactory("logging-metrics-publisher"); private Consumer loggingSink = defaultLoggingSink(); + @Nullable + private Function meterIdPrinter = null; Builder(LoggingRegistryConfig config) { this.config = config; @@ -274,8 +287,13 @@ public Builder loggingSink(Consumer loggingSink) { return this; } + public Builder meterIdPrinter(Function meterIdPrinter) { + this.meterIdPrinter = meterIdPrinter; + return this; + } + public LoggingMeterRegistry build() { - return new LoggingMeterRegistry(config, clock, threadFactory, loggingSink); + return new LoggingMeterRegistry(config, clock, threadFactory, loggingSink, meterIdPrinter); } } } diff --git a/micrometer-core/src/test/java/io/micrometer/core/instrument/logging/LoggingMeterRegistryTest.java b/micrometer-core/src/test/java/io/micrometer/core/instrument/logging/LoggingMeterRegistryTest.java index 1b7cb4977a..1d42eb1cb2 100644 --- a/micrometer-core/src/test/java/io/micrometer/core/instrument/logging/LoggingMeterRegistryTest.java +++ b/micrometer-core/src/test/java/io/micrometer/core/instrument/logging/LoggingMeterRegistryTest.java @@ -15,11 +15,7 @@ */ package io.micrometer.core.instrument.logging; -import io.micrometer.core.instrument.DistributionSummary; -import io.micrometer.core.instrument.Gauge; -import io.micrometer.core.instrument.Measurement; -import io.micrometer.core.instrument.Meter; -import io.micrometer.core.instrument.Statistic; +import io.micrometer.core.instrument.*; import io.micrometer.core.instrument.binder.BaseUnits; import org.junit.jupiter.api.Test; @@ -37,6 +33,27 @@ class LoggingMeterRegistryTest { private final LoggingMeterRegistry registry = new LoggingMeterRegistry(); + @Test + void defaultMeterIdPrinter() { + LoggingMeterRegistry registry = LoggingMeterRegistry.builder(LoggingRegistryConfig.DEFAULT) + .build(); + Counter counter = registry.counter("my.gauage", "tag-1", "tag-2"); + LoggingMeterRegistry.Printer printer = registry.new Printer(counter); + + assertThat(printer.id()).isEqualTo("my.gauage{tag-1=tag-2}"); + } + + @Test + void customMeterIdPrinter() { + LoggingMeterRegistry registry = LoggingMeterRegistry.builder(LoggingRegistryConfig.DEFAULT) + .meterIdPrinter(meter -> meter.getId().getName()) + .build(); + Counter counter = registry.counter("my.gauage", "tag-1", "tag-2"); + LoggingMeterRegistry.Printer printer = registry.new Printer(counter); + + assertThat(printer.id()).isEqualTo("my.gauage"); + } + @Test void humanReadableByteCount() { LoggingMeterRegistry.Printer printer = registry.new Printer(DistributionSummary.builder("my.summary")