Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2023, 2024 Oracle and/or its affiliates.
* Copyright (c) 2023, 2025 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.
Expand Down Expand Up @@ -46,9 +46,7 @@
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
import io.micrometer.core.instrument.search.Search;
import io.micrometer.prometheus.PrometheusMeterRegistry;

/**
* Implementation of {@link io.helidon.metrics.api.MeterRegistry} for the Micrometer adapter.
Expand Down Expand Up @@ -127,88 +125,6 @@ static Builder builder(
return new Builder(delegate, metricsFactory);
}

/**
* Creates a new meter registry which wraps an newly-created Micrometer
* {@link io.micrometer.core.instrument.composite.CompositeMeterRegistry} with a Prometheus meter registry
* automatically added, using the specified clock.
*
* @param metricsFactory metrics factory the new meter registry should use in creating and registering meters
* @param clock default clock to associate with the new meter registry
* @param metersProviders providers of built-in meters to be registered upon creation of the meter registry
* @return new wrapper around a new Micrometer composite meter registry
*/
static MMeterRegistry create(MicrometerMetricsFactory metricsFactory,
Clock clock,
Collection<MetersProvider> metersProviders) {
CompositeMeterRegistry delegate = new CompositeMeterRegistry(ClockWrapper.create(clock));
// The specified clock is already a Helidon one so pass it directly; no need to wrap it.
return create(delegate,
metricsFactory,
metricsFactory.metricsConfig(),
clock,
metersProviders);
}

static MMeterRegistry create(io.micrometer.core.instrument.MeterRegistry delegate,
MicrometerMetricsFactory metricsFactory,
MetricsConfig metricsConfig,
Collection<MetersProvider> metersProviders) {

return create(delegate, metricsFactory, metricsConfig, MClock.create(delegate.config().clock()), metersProviders);
}

static MMeterRegistry create(io.micrometer.core.instrument.MeterRegistry delegate,
MicrometerMetricsFactory metricsFactory,
MetricsConfig metricsConfig,
Collection<MetersProvider> metersProviders,
Consumer<io.helidon.metrics.api.Meter> onAddListener,
Consumer<io.helidon.metrics.api.Meter> onRemoveListener) {
MMeterRegistry result = create(delegate, metricsFactory, metricsConfig, MClock.create(delegate.config().clock()));
result.onMeterAdded(onAddListener)
.onMeterRemoved(onRemoveListener);
return applyMetersProvidersToRegistry(metricsFactory, result, metersProviders);
}

static MMeterRegistry create(io.micrometer.core.instrument.MeterRegistry delegate,
MicrometerMetricsFactory metricsFactory,
MetricsConfig metricsConfig,
Clock clock,
Collection<MetersProvider> metersProviders) {

return applyMetersProvidersToRegistry(metricsFactory,
create(delegate,
metricsFactory,
metricsConfig,
clock),
metersProviders);
}

static MMeterRegistry create(io.micrometer.core.instrument.MeterRegistry delegate,
MicrometerMetricsFactory metricsFactory,
MetricsConfig metricsConfig,
Clock clock) {

io.micrometer.core.instrument.MeterRegistry preppedDelegate =
ensurePrometheusRegistryIsPresent(delegate,
metricsFactory.metricsConfig());

return new MMeterRegistry(preppedDelegate,
metricsFactory,
metricsConfig,
clock);
}

static MMeterRegistry create(io.micrometer.core.instrument.MeterRegistry delegate,
MicrometerMetricsFactory metricsFactory,
Collection<MetersProvider> metersProviders) {

return create(delegate,
metricsFactory,
metricsFactory.metricsConfig(),
MClock.create(delegate.config().clock()),
metersProviders);
}

static MMeterRegistry applyMetersProvidersToRegistry(MetricsFactory factory,
MMeterRegistry registry,
Collection<MetersProvider> metersProviders) {
Expand Down Expand Up @@ -589,21 +505,6 @@ HM extends MMeter<M>> MMeter<M> meterIfRegistered(MMeter.Builder<?, M, HB, HM> m
return null;
}

private static io.micrometer.core.instrument.MeterRegistry ensurePrometheusRegistryIsPresent(
io.micrometer.core.instrument.MeterRegistry meterRegistry,
MetricsConfig metricsConfig) {

if (meterRegistry instanceof CompositeMeterRegistry compositeMeterRegistry) {
if (compositeMeterRegistry.getRegistries()
.stream()
.noneMatch(r -> r instanceof PrometheusMeterRegistry)) {
compositeMeterRegistry.add(
new PrometheusMeterRegistry(key -> metricsConfig.lookupConfig(key).orElse(null)));
}
}
return meterRegistry;
}

private <M extends Meter,
HB extends MMeter.Builder<?, M, HB, HM>,
HM extends MMeter<M>> io.helidon.metrics.api.Meter getOrCreate(HB mBuilder,
Expand Down Expand Up @@ -895,29 +796,4 @@ public R build() {
}
}

/**
* Micrometer-friendly wrapper around a Helidon clock.
*/
private static class ClockWrapper implements io.micrometer.core.instrument.Clock {

private final Clock neutralClock;

private ClockWrapper(Clock neutralClock) {
this.neutralClock = neutralClock;
}

static ClockWrapper create(Clock clock) {
return new ClockWrapper(clock);
}

@Override
public long wallTime() {
return neutralClock.wallTime();
}

@Override
public long monotonicTime() {
return neutralClock.monotonicTime();
}
}
}