Skip to content

Micrometer metrics meter events_received_total is registered multiple times #3255

@ThoSap

Description

@ThoSap

Bug Report

What did you do?

Update to Quarkus 3.34.1 which also updates the JOSDK to 7.7.3

What did you expect to see?

That my tests run through.

What did you see instead? Under which circumstances?

I ran my test suite of https://github.com/aboutbits/postgresql-operator with Quarkus 3.34.1 (e.g. JOSDK 7.7.3 -> Java Operator SDK 5.3.2) and got the following error.
This is related to https://github.com/quarkusio/quarkus/wiki/Migration-Guide-3.34#micrometer-prometheus-registry

Prometheus requires that all meters with the same name have the same set of tag keys. There is already an existing meter named 'events_received_total' containing tag keys [action, controller_name, event]. The meter you are attempting to register has keys [controller_name, event].
java.lang.IllegalArgumentException: Prometheus requires that all meters with the same name have the same set of tag keys. There is already an existing meter named 'events_received_total' containing tag keys [action, controller_name, event]. The meter you are attempting to register has keys [controller_name, event].
	at io.micrometer.prometheus.PrometheusMeterRegistry.lambda$throwExceptionOnRegistrationFailure$19(PrometheusMeterRegistry.java:619)
	at io.micrometer.core.instrument.MeterRegistry.meterRegistrationFailed(MeterRegistry.java:1291)
	at io.micrometer.prometheus.PrometheusMeterRegistry.lambda$applyToCollector$18(PrometheusMeterRegistry.java:593)
	at java.base/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1956)
	at io.micrometer.prometheus.PrometheusMeterRegistry.applyToCollector(PrometheusMeterRegistry.java:579)
	at io.micrometer.prometheus.PrometheusMeterRegistry.newCounter(PrometheusMeterRegistry.java:200)
	at io.micrometer.core.instrument.MeterRegistry.lambda$counter$4(MeterRegistry.java:348)
	at io.micrometer.core.instrument.MeterRegistry.getOrCreateMeter(MeterRegistry.java:725)
	at io.micrometer.core.instrument.MeterRegistry.registerMeterIfNecessary(MeterRegistry.java:652)
	at io.micrometer.core.instrument.MeterRegistry.counter(MeterRegistry.java:347)
	at io.micrometer.core.instrument.Counter$Builder.register(Counter.java:148)
	at io.micrometer.core.instrument.Counter$Builder.register(Counter.java:144)
	at io.micrometer.core.instrument.composite.CompositeCounter.registerNewMeter(CompositeCounter.java:52)
	at io.micrometer.core.instrument.composite.CompositeCounter.registerNewMeter(CompositeCounter.java:23)
	at io.micrometer.core.instrument.composite.AbstractCompositeMeter.add(AbstractCompositeMeter.java:67)
	at java.base/java.lang.Iterable.forEach(Iterable.java:75)
	at java.base/java.util.Collections$SetFromMap.forEach(Collections.java:6060)
	at io.micrometer.core.instrument.composite.CompositeMeterRegistry.lambda$new$0(CompositeMeterRegistry.java:67)
	at io.micrometer.core.instrument.composite.CompositeMeterRegistry.lock(CompositeMeterRegistry.java:189)
	at io.micrometer.core.instrument.composite.CompositeMeterRegistry.lambda$new$1(CompositeMeterRegistry.java:67)
	at io.micrometer.core.instrument.MeterRegistry.getOrCreateMeter(MeterRegistry.java:735)
	at io.micrometer.core.instrument.MeterRegistry.registerMeterIfNecessary(MeterRegistry.java:652)
	at io.micrometer.core.instrument.MeterRegistry.counter(MeterRegistry.java:347)
	at io.micrometer.core.instrument.MeterRegistry.counter(MeterRegistry.java:481)
	at io.micrometer.core.instrument.MeterRegistry.counter(MeterRegistry.java:459)
	at io.javaoperatorsdk.operator.monitoring.micrometer.MicrometerMetricsV2.incrementCounter(MicrometerMetricsV2.java:260)
	at io.javaoperatorsdk.operator.monitoring.micrometer.MicrometerMetricsV2.eventReceived(MicrometerMetricsV2.java:178)
	at io.javaoperatorsdk.operator.processing.event.EventProcessor.handleEvent(EventProcessor.java:130)
	at io.javaoperatorsdk.operator.processing.event.source.timer.TimerEventSource$EventProducerTimeTask.run(TimerEventSource.java:129)
	at java.base/java.util.TimerThread.mainLoop(Timer.java:572)
	at java.base/java.util.TimerThread.run(Timer.java:522)

Environment

Kubernetes cluster type: K3s

$ Mention java-operator-sdk version from pom.xml file
Java Operator SDK version: 5.3.2 (Quarkus 3.34.1 -> JOSDK 7.7.3)

$ java -version
Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 25.0.1+8.1 (build 25.0.1+8-LTS-jvmci-b01, mixed mode, sharing)

$ kubectl version
Client Version: v1.34.1+k3s1
Kustomize Version: v5.7.1
Server Version: v1.34.1+k3s1

Possible Solution

Register the Micrometer metrics only once by using MeterProvider to delay meter registration and avoid duplicating the registration of different 'events_received_total' tag keys [action, controller_name, event] and [controller_name, event].

Additional context

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions