diff --git a/metrics/api/src/main/java/io/helidon/metrics/api/MetricsConfigBlueprint.java b/metrics/api/src/main/java/io/helidon/metrics/api/MetricsConfigBlueprint.java index cc7c9bc86aa..d509573150d 100644 --- a/metrics/api/src/main/java/io/helidon/metrics/api/MetricsConfigBlueprint.java +++ b/metrics/api/src/main/java/io/helidon/metrics/api/MetricsConfigBlueprint.java @@ -202,6 +202,7 @@ static List createTags(String pairs) { * * @return metrics configuration */ + @Option.Redundant Config config(); /** diff --git a/metrics/providers/micrometer/pom.xml b/metrics/providers/micrometer/pom.xml index 22e5ea703bf..3bed1d983a3 100644 --- a/metrics/providers/micrometer/pom.xml +++ b/metrics/providers/micrometer/pom.xml @@ -47,6 +47,10 @@ io.micrometer micrometer-registry-prometheus + + io.helidon.config + helidon-config + org.junit.jupiter junit-jupiter-api diff --git a/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MMeterRegistry.java b/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MMeterRegistry.java index 21747e52fa8..2955630a5e7 100644 --- a/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MMeterRegistry.java +++ b/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MMeterRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Oracle and/or its affiliates. + * Copyright (c) 2023, 2024 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -217,6 +217,7 @@ static MMeterRegistry applyMetersProvidersToRegistry(MetricsFactory factory, public void close() { onAddListeners.clear(); onRemoveListeners.clear(); + List.copyOf(meters.values()).forEach(this::remove); meters.clear(); buildersByPromMeterId.clear(); scopeMembership.clear(); @@ -472,7 +473,7 @@ , M extends Meter, B, HB extends MMeter.Builder removedHelidonMeter = meters.remove(removedMeter); if (removedHelidonMeter == null) { - LOGGER.log(Level.WARNING, "No matching neutral meter for implementation meter " + removedMeter); + LOGGER.log(Level.WARNING, "No matching neutral meter for implementation meter " + removedMeter.getId()); } else { recordRemove(removedHelidonMeter); } @@ -586,7 +587,7 @@ but we have no record of that meter being linked to one of ours. This is surpris */ LOGGER.log(Level.WARNING, - "Unexpected discovery of unknown previously-created meter; creating wrapper for " + meter); + "Unexpected discovery of unknown previously-created meter; creating wrapper for " + meter.getId()); result = wrapMeter(id, meter, mBuilder.scope()); recordNewMeter(id, result, meter, effectiveScope); } diff --git a/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MicrometerMetricsFactory.java b/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MicrometerMetricsFactory.java index cd949743164..bed563d9775 100644 --- a/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MicrometerMetricsFactory.java +++ b/metrics/providers/micrometer/src/main/java/io/helidon/metrics/providers/micrometer/MicrometerMetricsFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Oracle and/or its affiliates. + * Copyright (c) 2023, 2024 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,7 +27,7 @@ import io.helidon.common.HelidonServiceLoader; import io.helidon.common.LazyValue; -import io.helidon.common.config.Config; +import io.helidon.config.Config; import io.helidon.metrics.api.Clock; import io.helidon.metrics.api.Counter; import io.helidon.metrics.api.DistributionStatisticsConfig; @@ -56,7 +56,6 @@ */ class MicrometerMetricsFactory implements MetricsFactory { - private final MetricsConfig metricsConfig; private final Collection metersProviders; private final Collection meterRegistries = new ConcurrentLinkedQueue<>(); @@ -74,6 +73,7 @@ class MicrometerMetricsFactory implements MetricsFactory { .next()); private MMeterRegistry globalMeterRegistry; + private MetricsConfig metricsConfig; private MicrometerMetricsFactory(MetricsConfig metricsConfig, Collection metersProviders) { @@ -81,7 +81,7 @@ private MicrometerMetricsFactory(MetricsConfig metricsConfig, this.metersProviders = metersProviders; } - static MicrometerMetricsFactory create(Config rootConfig, + static MicrometerMetricsFactory create(io.helidon.common.config.Config rootConfig, MetricsConfig metricsConfig, Collection metersProviders) { @@ -114,7 +114,7 @@ public MMeterRegistry.Builder meterRegistryBuilder() { @Override public MeterRegistry createMeterRegistry(MetricsConfig metricsConfig) { - return save(MMeterRegistry.builder(Metrics.globalRegistry, this) + return save(metricsConfig, MMeterRegistry.builder(Metrics.globalRegistry, this) .metricsConfig(metricsConfig) .build()); } @@ -124,7 +124,7 @@ public MeterRegistry createMeterRegistry(MetricsConfig metricsConfig) { public MeterRegistry createMeterRegistry(MetricsConfig metricsConfig, Consumer onAddListener, Consumer onRemoveListener) { - return save(MMeterRegistry.builder(Metrics.globalRegistry, + return save(metricsConfig, MMeterRegistry.builder(Metrics.globalRegistry, this) .metricsConfig(metricsConfig) .onMeterAdded(onAddListener) @@ -139,7 +139,7 @@ public MeterRegistry createMeterRegistry(Clock clock, Consumer onAddListener, Consumer onRemoveListener) { - return save(MMeterRegistry.builder(Metrics.globalRegistry, + return save(metricsConfig, MMeterRegistry.builder(Metrics.globalRegistry, this) .metricsConfig(metricsConfig) .clock(clock) @@ -150,7 +150,7 @@ public MeterRegistry createMeterRegistry(Clock clock, @Override public MeterRegistry createMeterRegistry(Clock clock, MetricsConfig metricsConfig) { - return save(MMeterRegistry.builder(Metrics.globalRegistry, this) + return save(metricsConfig, MMeterRegistry.builder(Metrics.globalRegistry, this) .clock(clock) .metricsConfig(metricsConfig) .build()); @@ -160,7 +160,7 @@ public MeterRegistry createMeterRegistry(Clock clock, MetricsConfig metricsConfi public MeterRegistry globalRegistry() { return globalMeterRegistry != null ? globalMeterRegistry - : globalRegistry(MetricsConfig.create()); + : globalRegistry(MetricsConfig.create(Config.global().get(MetricsConfig.METRICS_CONFIG_KEY))); } @Override @@ -168,11 +168,18 @@ public MeterRegistry globalRegistry(MetricsConfig metricsConfig) { lock.lock(); try { if (globalMeterRegistry != null) { + if (metricsConfig.equals(this.metricsConfig)) { + return globalMeterRegistry; + } + // Ideally this method will be invoked once with the proper MetricsConfig settings. + // But it's possible for it to be invoked more than once with different + // settings. In such a case we need to clear the old global registry and create a new one because + // the new settings might affect its behavior. globalMeterRegistry.close(); meterRegistries.remove(globalMeterRegistry); } ensurePrometheusRegistry(Metrics.globalRegistry, metricsConfig); - globalMeterRegistry = save(MMeterRegistry.builder(Metrics.globalRegistry, this) + globalMeterRegistry = save(metricsConfig, MMeterRegistry.builder(Metrics.globalRegistry, this) .metricsConfig(metricsConfig) .build()); @@ -325,7 +332,8 @@ private , M extends Meter> MeterRegistry applyMete return registry; } - private MMeterRegistry save(MMeterRegistry meterRegistry) { + private MMeterRegistry save(MetricsConfig metricsConfig, MMeterRegistry meterRegistry) { + this.metricsConfig = metricsConfig; meterRegistries.add(meterRegistry); return meterRegistry; } diff --git a/metrics/providers/micrometer/src/main/java/module-info.java b/metrics/providers/micrometer/src/main/java/module-info.java index 4f66c0b6796..a76661d745b 100644 --- a/metrics/providers/micrometer/src/main/java/module-info.java +++ b/metrics/providers/micrometer/src/main/java/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Oracle and/or its affiliates. + * Copyright (c) 2023, 2024 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,8 +22,8 @@ requires micrometer.core; requires static micrometer.registry.prometheus; requires io.helidon.common; - requires io.helidon.common.config; requires io.helidon.common.media.type; + requires io.helidon.config; requires simpleclient.common; requires simpleclient.tracer.common; requires simpleclient;